锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

2.第二部分 requests

时间:2023-01-22 14:30:00 28zjw印制板连接器

文章目录

  • 第二部分 : requests
    • 知识点一 : 初级_01_爬取一定程度的网页文本
    • 知识点二 : 初级_02_爬一定程度的网页图片
    • 知识点三 : 初级_03_爬某音短视频
    • 知识点四 : 初级_04_模拟浏览器查询发送带请求
    • 知识点五 : 初级_05_模拟浏览器使用一定程度的翻译查词 ( post请求 )
    • 知识点六 : 初级_06_模拟浏览器使用一定程度的翻译查句 ( post请求 )
    • 知识点七 : cookie 释义
    • 知识点八 : session 的作用
    • 知识点九 : 列表推导和字典推导
      • 1.列表推断式 ( 了解 )
      • 2.字典推导式 ( 应用 )
    • 知识点十 : 使用方法从 cookiejar 中提取对象
    • 知识点十一 : 解释重定向
    • 知识点十二 : 初级_07_模拟获取网页重定向历史记录
    • 知识点十三 : 设置不检查SSL证书
    • 知识点十四 : 设置超时设置
    • 知识点十五 : 初级_08_试着刷新模拟捕获异常
    • 知识点十六 : 发送 json 格式的请求
    • 知识点十七 : 初级_09_模拟无验证码登录图神器
    • 知识点十八 : Session 会话
    • 知识点十九 : 代理 释义

第二部分 : requests

知识点一 : 初级_01_爬取某度网页文本

import requests   url = "https://www.baidu.com/" resp = requests.get(url=url) resp.encoding = "utf-8"  print(type(resp.encoding)) print(resp.status_code)     # 返回状态码 print(resp.text)            # 返回文本文件 

注释1 : text属性接收的数据类型为str类型主要用于接收文本响应.

??
??
??

知识点二 : 初级_02_爬一定程度的网页图片

import requests   url = "https://img0.baidu.com/it/u=4217284373,243829174&fm=253&fmt=auto&app=138&f=JPEG?w=890&h=500" resp = requests.get(url=url)  with open("FileSave/龙猫.png", "wb") as f:     f.write(resp.content) 

注释1 : content接收类型为二进制,图片、音频、视频均为二进制.
??
注释2 : 爬行是文本,但使用content接收,需要使用decode属性将二进制转为文本(str)默认使用类型utf-8

??
??
??

知识点三 : 初级_03_爬某音短视频

""" hepl1: 1字节Byte = 8个0或1(8比特bit) hepl2: 02.2f表示为浮点数,整数位两位占位(02),小数位两位(2) hepl3: %%表示对%的转义 hepl4: resp.headers表示响应头 hepl5: resp.request.headers表示请求头 """   import requests import time   start_time = time.time()  # 1.获取视频url video_url = "https://v11-x.douyinvod.com/23c8307dc80d9f17427019469e76d92b/626a8646/video/tos/cn/tos-n-ve-15c001-alinc2/748ff7ffbd894c8baf1fd2f5e290a4e8/?a=1128&ch=0&cr=0&dr=0&cd=0%7C0%7C0%7C0&cv=1&br=569&bt=569&cs=0&ds=3&ft=GYTg38VVywwPRsq8Zmo~xj7ScoAwHX9BZMaVJEoXi_6CPD&mime_type=video_mp4&qs=0&rc=OWUzOTdnOjc7M2YzaDc4aEBpajozOTU6Zjw1PDMzNGkzM0AuYF4tXzA2NmAxYGFeNC4uYSNsMWdvcjQwMmhgLS1kLS9zcw%3D%3D&l=2022042819190401021208707840089847"


# 2.发送请求
resp = requests.get(url=video_url, stream=True) # 下大视频,设置stream=True


# 3.获取视频总的字节长度
for key,value in resp.headers.items():
	print(f"键:{ 
          key},值:{ 
          value}")
print(resp.request.headers)
response_body_lenth = int(resp.headers.get("Content-Length"))
print("body的数据长度为:", response_body_lenth)


# 4.获取响应内容存储到文件
with open("FileSave/中国人不骗中国人.mp4", "wb") as fp:
    write_all = 0
    for chunk in resp.iter_content(chunk_size=100):

        write_all += fp.write(chunk) # write的返回值为写入到文件内容的多少
        print("下载进度:%02.2f%%" % (100 * write_all / response_body_lenth))
stop_time = time.time()
print("程序运行的总时间:", round(stop_time-start_time, 3), "秒")

注释1 : 如果下载一个较大的资源,例如一个视频,可能需要下载的时间较长,在这个较长的下载过程中程序是不能做别的事情的(当然也可以通过多任务来解决),如果在不是多任务的情况下,想要知道下载的进度,此时就可以通过类似迭代的发送下载部分资源,这就是iter_content.
  
注释2 : 当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载。
  
注释3 : 1字节Byte = 8个0或1(8比特bit)
  
注释4 : "%02.2f%%“表示整数位占两位(不足用0补足),小数位占两位,%%是对”%"的转义.
  
注释5 :
  resp.headers表示响应头(浏览器响应我们的内容)
  resp.request.headers表示请求头(我们发出的请求的内容),请求头我们是可以修改的.

  
  
  

知识点四 : 初级_04_模拟浏览器查询发送带参请求

""" 报错: resp = requests.get(url, headers, params=kw) TypeError: get() got multiple values for argument 'params' 方案: resp = requests.get(url, headers=headers, params=kw) """


import requests


# 1.获取网页url和请求头
url = "https://weixin.sogou.com/weixin"
headers = { 
        
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0"
}


# 2.设置请求参数
kw = { 
        "type": 2, "query": "动漫"}


# 3.带上请求参数发起请求,获得响应
resp = requests.get(url, headers=headers, params=kw)


# 4.打印输出
print("请求的url:", resp.url)
print("响应内容如下:")
print(resp.content.decode()) # 用content接收二进制文件,用decode()解码为文本文件

注释1 : 不同的 user-agent 的请求到的内容不同.
  
注释2 : url 携带参数即 url 后面 ? 跟着的内容.

  
  
  

知识点五 : 初级_05_模拟浏览器用某度翻译查词 ( post请求 )

""" help1: get请求可以直接在地址栏里面找,post请求就只能去抓包找相关数据 help2: 将dict字典 转为 json字符串: json.dumps(字典) help3: 将json字符串 转为 dict字典: json.loads(字符串) """


import requests
import json


# 1.获取网页url和请求头
url = "https://fanyi.baidu.com/sug"
headers = { 
        
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1"
}


# 2.设置请求参数
word = input("请输入您想要查询的单词:")
payload = { 
        "kw": f"{ 
          word}"}


# 3.带上请求参数发起请求,获得响应
resp = requests.post(url, headers=headers, data=payload)


# 4.解析内容
text_dict = json.loads(resp.text)  # 将字符串格式字典(即json字符串)转换为python中的字典


# 5.打印输出
print("请求的url:", resp.url)
print("响应内容如下:")
print("------------------------------")
k = text_dict.get("data")[0].get("k")  # text_dict为字典类型
v = text_dict.get("data")[0].get("v")
print(f"汉语:{ 
          k}", "\n", f"英语:{ 
          v}")
print("------------------------------")

  
  
  

知识点六 : 初级_06_模拟浏览器用某度翻译查句 ( post请求 )

""" help1: 这个的难点在于sign是变化的,也就是我们每查一次就得重新输入一次,这是百度翻译的一种反爬手段,得通过js来破解 """


import requests
import json


# 1.获取网页url和请求头
url = "https://fanyi.baidu.com/basetrans"
headers = { 
        
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1",
    "Cookie": "PSTM=1651069584; BAIDUID=74FE1DEBF8213CE3E40B5903AE4C7517:FG=1; BIDUPSID=46C4648B750129394D07562573CC3986; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BAIDUID_BFESS=74FE1DEBF8213CE3E40B5903AE4C7517:FG=1; BA_HECTOR=ah0g002kag84akahj71h6ke0g0r; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; BDRCVFR[CLK3Lyfkr9D]=mk3SLVN4HKm; delPer=0; H_WISE_SIDS=110085_127969_179346_184716_185634_189660_194085_194511_194529_197242_197471_197711_198255_199583_200596_201193_202652_203264_203310_203504_204170_204711_204714_204719_204859_204914_205217_205485_205547_205709_206007_206905_206911_206930_207126_207237_207390_207830_207864_207884_208267_208285_208686_208756_208891_209075_209436_209507_209512_209568_209576_209614_209631_209846_209945_209980_210164_210307_210359_210519_210653_210664_210670_210733_210736_210890_210892_210894_210900_210906_211112_211180_211222_211242_211301_211331_211442_211456_211755; SE_LAUNCH=5%3A1651150474; H_PS_PSSID=36309_31660_36165_34584_35978_35864_36346_26350_36300_36313_36061; PSINO=3; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1651152363; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lvt_afd111fa62852d1f37001d1f980b6800=1651152385; Hm_lpvt_afd111fa62852d1f37001d1f980b6800=1651154569; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1651154569; ab_sr=1.0.1_ZmVhMmM0YTcxMTVjZWY5NTY0NjY5NTM2MjI0ODRhNmRlZGNlNTViMTRhNzQ0OWUwNmMwMTgzNWI0Y2VmZTQ0OTUxMTg0ODNjMTIxYzAyYWI1ZWFhZDcwNzc4NzRlODM3ZmQzNzQ3NWI2MTdjZDJlNDA2ODcwNjg4OTE0ODk4MWU3YjMxZDY0YTVlMmJkMmE3NWQwMWNiNmZlM2E0M2I3ZA=="
}


# 2.设置请求参数
data = { 
        
    "query": "happy new year",
    "from": "en",
    "to": "zh",
    "token": "4399a739acd8e4f771b207e71a495467",
    "sign": "27766.298823"
}


# 3.带上请求参数发起请求,获得响应
resp = requests.post(url, headers=headers, data=data)


# 4.解析内容
text_dict = json.loads(resp.text)  # 将字符串格式字典(即json字符串)转换为python中的字典


# 5.打印输出
print("请求的url:", resp.url)
print("响应内容如下:")
print("------------------------------")
print(resp.text)
for key, value in text_dict.items():
    print(f"键:{ 
          key},值:{ 
          value}")
ret = json.loads(resp.content.decode())
print("------------------------------")
print(data["query"])
print(ret["trans"][0]["dst"])
print("------------------------------")

  
  
  

知识点七 : cookie 释义


  Http是我们上网经常采用的一种方式,但是它是无状态,而无状态则会导致浏览器第二次请求时不知道第一次请求时的样子,为了让服务器能区分第二次,第三次,第四次时之前的请求是怎样的,故而第一次请求成功之后,服务器会给浏览器一个值,该值会存储在浏览器中,浏览器每次访问该域名都会携带该值,如果有这个值则认为是之前的用户,如果没有则认为是新用户.


  
  
  

知识点八 : session 的作用


  session直接保存在服务器端,避免了客户端浏览器存储大量cookie造成的访问缓慢.


  
  
  

知识点九 : 列表推导式和字典推导式

1.列表推断式 ( 了解 )

# 1.公式:
[x for x in range(5) if x%2 == 0 ]

# 2.结果:
[0,2,4]

  
  
  

2.字典推导式 ( 应用 )

# 将字符串cookie转为字典
cookies_str = ""
cookies_dict = { 
        temp[:temp.find("=")]:temp[temp.find("=")+1:] for temp in cookies_str.split(";")}
print(cookies_dict)

注释1 : 将cookie转为字典置于post请求中cookie = cookies_dict
  
注释2 : 传递cookie的两种方式分别是直接将cookie置入headers中和放入post请求中

  
  
  

知识点十 : 使用方法从 cookiejar 中提取对象

# 使用方法从cookiejar中提取数据
cookies = requests.utils.dict_from_cookiejar(resp.cookies)
print(cookies)


# 查看cookies的键
print(cookies.keys())
requsts.get(rul,cookies=cookies)

  
  
  

知识点十一 : 重定向的解释

""" help1: 登录成功后从一个页面跳转到另一个页面就是重定向. """


# url表示是重定向到的最后一次请求的url
print(resp.url)


# 禁止重定向(即禁止网页跳转)
r = request.get("http://www.baidu.com",headers=headers,allow_redirects=False) 
print(r.status_code)
print(r.url)
print(r.headers.get("Location")) # 提取要跳转的新的location

注释1 : allow_redirects默认为True,禁止重定向改为False

  
  
  

知识点十二 : 初级_07_模拟获取网页重定向历史记录

import requests


# 1.获取网页url和请求头
url = "http://www.360buy.com"
headers = { 
         "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1"}


# 2.发起请求,获得响应
r = requests.get(url=url, headers=headers)


# 3.从响应内容中获取重定向历史记录
print("\n历史请求过程信息:")
print(r.history)
for one_info in r.history:
    print(one_info.status_code, one_info.url, one_info.headers)

print("\n\n最后一次的请求信息:")
print(r.status_code, r.url, r.headers)

  
  
  

知识点十三 : 设置不检查SSL证书

# 解决SSL证书错误:verify=False(不检查证书)
r = request.get(url,verify=False)

  
  
  

知识点十四 : 设置超时设定

# 设置超时设定:timeout
r = requests.get(url=url,timeout=3)

  
  
  

知识点十五 : 初级_08_模拟捕获异常后尝试刷新

""" help1: assert是断言语句,如果assert后条件为True则继续运行.否则抛出异常. help2:代码执行顺序是从上到下,但是用到的自定义函数是从下到上嵌套. """


import requests
from retrying import retry

num = 1


# 4.第二层函数,用于判断请求是否异常
@retry(stop_max_attempt_number=3)
def _parse_url(url):

    global num  # 定义全局变量
    print("第%d次尝试" % num)
    num += 1
    headers = { 
        
        "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1"
    }

    r = requests.get(url=url, headers=headers, timeout=3)   # 超时的时候会报错并重试
    assert r.status_code == 200     # 状态码不是200,也会报错并重试
    return r


# 3.第一层函数,用于捕获异常
def parse_url(url):

    try:    # 进行异常捕获
        r = _parse_url(url)
    except Exception as e:
        print("产生异常:", e)   # 返回报错原因
        r = None    # 报错返回None
    return r


if __name__ == '__main__':
    
    # 1.获取网页url
    url1 = "https://chinasoftinc.com/owa"
    url2 = "https://www.baidu.com"

    # 2.使用自定义函数进行判断
    print("----------开始----------")
    r = parse_url(url=url2)
    print("响应内容为:", r)
    print("----------结束----------")

  
  
  

知识点十六 : 发送 json 格式的请求

# 发送json格式的请求
r = requests.post(url,headers,json={ 
        "kw":"python"},timeout=3)

  
  
  

知识点十七 : 初级_09_模拟无验证码登录某图神器

""" help1:如果网站为post请求,一般也就分为Json:json=payload和Form:data=payload """


import json
import requests


# 1.获取网页url,伪装浏览器版本
url = "http://www.soutushenqi.com/login"
headers = { 
        
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1"
}


# 2.配置登录需要的用户名
payload = { 
        
    "product_id": "52",
    "version_code": "211",
    "phone_num": "1234567",		# 这里是手机号
    "password": '123456',		# 这里是登录密码
    "device_id": "6eade2487f1e969593ff5242c119f987",
    "sign": "A4B5AF47DFAE50BB16767E980781FC8D"
}


# 3.带上请求参数发起请求,获得响应
r = requests.post(url=url, headers=headers, json=payload)


# 4.打印输出
print("-"*50)
print(f"请求头:{ 
          r.request.headers}")
print(f"请求体:{ 
          r.request.body}")

print("-"*50)
print(f"响应状态码:{ 
          r.status_code}")
print(f"响应头:{ 
          r.headers}")
print(f"响应cookie:{ 
          requests.utils.dict_from_cookiejar(r.cookies)}")
print("响应内容:", "\n", f"{ 
          r.text}")
# print(f"响应体类型:{type(r.json())}")
# print(f"响应体:{r.json()}")

注释1 :
  如果网站为post请求,一般也就分为:
    Json:json=payload
    Form(Ajax请求):data=payload
  
注释2 :
  请求头content-type一般为 application/x-www-form-urlencoded
  响应头**content-type一般为 **application/json

  
  
  

知识点十八 : Session 会话


  会话session能够跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookie.即保持cookie,下一次请求会自动带上前一次的cookie实现和服务端的长连接,加快请求速度.


# 1.创建一个session实例对象
s = requests.Session()

# 2.使用上一步创建的对象发起请求
r = s.get(url1,headers)
r = s.get(url2,headers)
r = s.get(url3,headers)
r = s.get(url4,headers)

注释1 : 第一次发送get请求会携带相应的cookie,而之后发送的get请求在携带本次相应的cookie的同时也会携带前面几次请求的相应的cookie.
  
注释2 : 要用同一个Session对象登录.
  
注释3 : 登录和没有登录的唯一区别就是有没有cookie.

  
  
  

知识点十九 : 代理 释义


  简单来说,使用代理其实就是找个电脑让它将我们的数据送达到目的服务器(重庆→成都→北京),而不使用代理则是我们自己的电脑发送数据到服务器(重庆→北京).


锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章