2.第二部分 requests
时间:2023-01-22 14:30:00
文章目录
- 第二部分 : 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.
知识点十九 : 代理 释义
简单来说,使用代理其实就是找个电脑让它将我们的数据送达到目的服务器(重庆→成都→北京),而不使用代理则是我们自己的电脑发送数据到服务器(重庆→北京).