python中的requests模块的使用大全
1.requests模塊:
- 企業(yè)中用的最多的就是requests
- requests的底層實(shí)現(xiàn)就是urllib
- requests在python2 和python3中通用,方法完全一樣
- requests簡(jiǎn)單易用
- requests能夠自動(dòng)幫助我們解壓(gzip壓縮的等)響應(yīng)內(nèi)容
2.response的常用屬性:
- response.text 響應(yīng)體 str類型
- respones.content 響應(yīng)體 bytes類型
- response.status_code 響應(yīng)狀態(tài)碼
- response.request.headers 響應(yīng)對(duì)應(yīng)的請(qǐng)求頭
- response.headers 響應(yīng)頭
- response.request.cookies 響應(yīng)對(duì)應(yīng)請(qǐng)求的cookie
- response.cookies 響應(yīng)的cookie(經(jīng)過(guò)了set-cookie動(dòng)作)
3.response.text 和response.content的區(qū)別
3.1 response.text
類型:str
解碼類型: requests模塊自動(dòng)根據(jù)HTTP 頭部對(duì)響應(yīng)的編碼作出有根據(jù)的推測(cè),推測(cè)的文本編碼
如何修改編碼方式:response.encoding=”gbk”
3.2 response.content
類型:bytes
解碼類型: 沒(méi)有指定
如何修改編碼方式:response.content.deocde(“utf8”)
4.獲取網(wǎng)頁(yè)源碼的通用方式:
以上三種方法從前往后嘗試,能夠100%的解決所有網(wǎng)頁(yè)解碼的問(wèn)題
所以:更推薦使用response.content.deocde()的方式獲取響應(yīng)的html頁(yè)面
舉例來(lái)說(shuō):
import requestsurl = 'https://www.baidu.com' response = requests.get(url)print(type(response.text)) print(type(response.content)) print(response.status_code) print(response.headers)輸出結(jié)果:
<class 'str'> <class 'bytes'> 200 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate,......后面的省略舉例:
把圖片保存到本地
分析:
- 圖片的url: https://www.baidu.com/img/bd_logo1.png
- 利用requests模塊發(fā)送請(qǐng)求獲取響應(yīng)
- 以二進(jìn)制寫入的方式打開(kāi)文件,并將response響應(yīng)的二進(jìn)制內(nèi)容寫入
5.攜帶請(qǐng)求頭header
格式如下:字典
headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36”}
舉例:
import requestsurl = 'https://www.baidu.com' headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}# 在請(qǐng)求頭中帶上User-Agent,模擬瀏覽器發(fā)送請(qǐng)求 response = requests.get(url, headers=headers) # print(response.content) # 打印請(qǐng)求頭信息 print(response.request.headers)6.發(fā)送帶參數(shù)的請(qǐng)求
請(qǐng)求參數(shù)的形式:字典
kw = {'wd':'長(zhǎng)城'}用法:
requests.get(url,params=kw)舉例:兩種發(fā)送帶參數(shù)的請(qǐng)求
6.1 對(duì)https://www.baidu.com/s?wd=python發(fā)起請(qǐng)求可以使用requests.get(url, params=kw)的方式
# 方式一:利用params參數(shù)發(fā)送帶參數(shù)的請(qǐng)求 import requestsheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}# 這是目標(biāo)url # url = 'https://www.baidu.com/s?wd=python' # 最后有沒(méi)有問(wèn)號(hào)結(jié)果都一樣 url = 'https://www.baidu.com/s?' # 請(qǐng)求參數(shù)是一個(gè)字典 即wd=python kw = {'wd': 'python'} # 帶上請(qǐng)求參數(shù)發(fā)起請(qǐng)求,獲取響應(yīng) response = requests.get(url, headers=headers, params=kw) # 當(dāng)有多個(gè)請(qǐng)求參數(shù)時(shí),requests接收的params參數(shù)為多個(gè)鍵值對(duì)的字典,比如 '?wd=python&a=c'-->{'wd': 'python', 'a': 'c'} print(response.content)6.2 也可以直接對(duì)https://www.baidu.com/s?wd=python完整的url直接發(fā)送請(qǐng)求,不使用params參數(shù)
# 方式二:直接發(fā)送帶參數(shù)的url的請(qǐng)求 import requestsheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} url = 'https://www.baidu.com/s?wd=python'# kw = {'wd': 'python'}# url中包含了請(qǐng)求參數(shù),所以此時(shí)無(wú)需params response = requests.get(url, headers=headers)7.使用代理
7.1 代理的作用:
7.2 代理過(guò)程:
7.3 正向代理和反向代理的區(qū)別:
- 正向代理:對(duì)于瀏覽器知道服務(wù)器的真實(shí)地址,例如VPN
- 反向代理:瀏覽器不知道服務(wù)器的真實(shí)地址,例如nginx
7.4 代理的使用:
proxies = { "http": "http://12.34.56.79:9527", "https": "https://12.34.56.79:9527", } requests.get(url, proxies = proxies)7.5 代理IP的分類
根據(jù)代理ip的匿名程度,代理IP可以分為下面三類:
透明代理(Transparent Proxy):透明代理雖然可以直接“隱藏”你的IP地址,但是還是可以查到你是誰(shuí)。
匿名代理(Anonymous Proxy):使用匿名代理,別人只能知道你用了代理,無(wú)法知道你是誰(shuí)。
高匿代理(Elite proxy或High Anonymity Proxy):高匿代理讓別人根本無(wú)法發(fā)現(xiàn)你是在用代理,所以是最好的選擇。
在使用的使用,毫無(wú)疑問(wèn)使用高匿代理效果最好
從請(qǐng)求使用的協(xié)議可以分為:
- http代理
- https代理
- socket代理等
不同分類的代理,在使用的時(shí)候需要根據(jù)抓取網(wǎng)站的協(xié)議來(lái)選擇
7.6 代理IP使用的注意點(diǎn)
-
代理ip池的更新
購(gòu)買的代理ip很多時(shí)候大部分(超過(guò)60%)可能都沒(méi)辦法使用,這個(gè)時(shí)候就需要通過(guò)程序去檢測(cè)哪些可用,使用代理ip是非常必要的一種反反爬的方式 -
反反爬
但是即使使用了代理ip,對(duì)方服務(wù)器任然會(huì)有很多的方式來(lái)檢測(cè)我們是否是一個(gè)爬蟲(chóng),比如:
1.一段時(shí)間內(nèi),檢測(cè)IP訪問(wèn)的頻率,訪問(wèn)太多頻繁會(huì)屏蔽
2.檢查Cookie,User-Agent,Referer等header參數(shù),若沒(méi)有則屏蔽
3.服務(wù)方購(gòu)買所有代理提供商,加入到反爬蟲(chóng)數(shù)據(jù)庫(kù)里,若檢測(cè)是代理則屏蔽
所以更好的方式在使用代理ip的時(shí)候使用隨機(jī)的方式進(jìn)行選擇使用,不要每次都用一個(gè)代理ip不能用的刪除掉。
8.處理cookie相關(guān)的請(qǐng)求
爬蟲(chóng)中使用cookie,為了能夠通過(guò)爬蟲(chóng)獲取到登錄后的頁(yè)面,或者是解決通過(guò)cookie的反扒,需要使用request來(lái)處理cookie相關(guān)的請(qǐng)求
8.1 爬蟲(chóng)中使用cookie的利弊
- 帶上cookie的好處,能夠訪問(wèn)登錄后的頁(yè)面,能夠?qū)崿F(xiàn)部分反反爬
- 帶上cookie的壞處,一套cookie往往對(duì)應(yīng)的是一個(gè)用戶的信息,請(qǐng)求太頻繁有更大的可能性被對(duì)方識(shí)別為爬蟲(chóng)
8.2 使用requests處理cookie有三種方法:
- cookie字符串放在headers中
- 把cookie字典放傳給請(qǐng)求方法的cookies參數(shù)接收
- 使用requests提供的session模塊
下面就這三種方法簡(jiǎn)單的講解下:
8.2.1 cookie添加在heades中
headers中cookie的位置
headers中的cookie:
- 使用分號(hào)(;)隔開(kāi)
- 分號(hào)兩邊的類似a=b形式的表示一條cookie
- a=b中,a表示鍵(name),b表示值(value)
- 在headers中僅僅使用了cookie的name和value
8.2.2 cookie的具體組成的字段
由于headers中對(duì)cookie僅僅使用它的name和value,所以在代碼中我們僅僅需要cookie的name和value即可
8.2.3 在headers中使用cookie
復(fù)制瀏覽器中的cookie到代碼中使用
注意:
cookie有過(guò)期時(shí)間 ,所以直接復(fù)制瀏覽器中的cookie可能意味著下一程序繼續(xù)運(yùn)行的時(shí)候需要替換代碼中的cookie,對(duì)應(yīng)的我們也可以通過(guò)一個(gè)程序?qū)iT來(lái)獲取cookie供其他程序使用;當(dāng)然也有很多網(wǎng)站的cookie過(guò)期時(shí)間很長(zhǎng),這種情況下,直接復(fù)制cookie來(lái)使用更加簡(jiǎn)單
8.3 使用cookies參數(shù)接收字典形式的cookie
cookies的形式:字典
cookies = {"cookie的name":"cookie的value"}使用方法:
requests.get(url,headers=headers,cookies=cookie_dict}8.4 使用requests.session處理cookie
requests 提供了一個(gè)叫做session類,來(lái)實(shí)現(xiàn)客戶端和服務(wù)端的會(huì)話保持
會(huì)話保持有兩個(gè)作用:
- 保存cookie,下一次請(qǐng)求會(huì)帶上前一次的cookie
- 實(shí)現(xiàn)和服務(wù)端的長(zhǎng)連接,加快請(qǐng)求速度
使用方法
session = requests.session() response = session.get(url,headers)session實(shí)例在請(qǐng)求了一個(gè)網(wǎng)站后,對(duì)方服務(wù)器設(shè)置在本地的cookie會(huì)保存在session中,下一次再使用session請(qǐng)求對(duì)方服務(wù)器的時(shí)候,會(huì)帶上前一次的cookie
9.requests中cookirJar的處理方法
使用request獲取的resposne對(duì)象,具有cookies屬性,能夠獲取對(duì)方服務(wù)器設(shè)置在本地的cookie,但是如何使用這些cookie呢?
9.1 方法介紹
response.cookies是CookieJar類型
使用requests.utils.dict_from_cookiejar,能夠?qū)崿F(xiàn)把cookiejar對(duì)象轉(zhuǎn)化為字典
9.2 方法展示
import requestsurl = "http://www.baidu.com" #發(fā)送請(qǐng)求,獲取resposne response = requests.get(url) print(type(response.cookies))#使用方法從cookiejar中提取數(shù)據(jù) cookies = requests.utils.dict_from_cookiejar(response.cookies) print(cookies)輸出為:
<class 'requests.cookies.RequestsCookieJar'> {'BDORZ': '27315'}注意:
在前面的requests的session類中,我們不需要處理cookie的任何細(xì)節(jié),如果有需要,我們可以使用上述方法來(lái)解決
10.timeout超時(shí)參數(shù)的使用
在平時(shí)網(wǎng)上沖浪的過(guò)程中,我們經(jīng)常會(huì)遇到網(wǎng)絡(luò)波動(dòng),這個(gè)時(shí)候,一個(gè)請(qǐng)求等了很久可能任然沒(méi)有結(jié)果。在爬蟲(chóng)中,一個(gè)請(qǐng)求很久沒(méi)有結(jié)果,就會(huì)讓整個(gè)項(xiàng)目的效率變得非常低,這個(gè)時(shí)候我們就需要對(duì)請(qǐng)求進(jìn)行強(qiáng)制要求,讓他必須在特定的時(shí)間內(nèi)返回結(jié)果,否則就報(bào)錯(cuò)
9.1 超時(shí)參數(shù)使用方法如下:
response = requests.get(url,timeout=3)通過(guò)添加timeout參數(shù),能夠保證在3秒鐘內(nèi)返回響應(yīng),否則會(huì)報(bào)錯(cuò)
注意:
這個(gè)方法還能夠拿來(lái)檢測(cè)代理ip的質(zhì)量,如果一個(gè)代理ip在很長(zhǎng)時(shí)間沒(méi)有響應(yīng),那么添加超時(shí)之后也會(huì)報(bào)錯(cuò),對(duì)應(yīng)的這個(gè)ip就可以從代理ip池中刪除
10.retrying模塊的使用
使用超時(shí)參數(shù)能夠加快我們整體的請(qǐng)求速度,但是在正常的網(wǎng)頁(yè)瀏覽過(guò)成功,如果發(fā)生速度很慢的情況,我們會(huì)做的選擇是刷新頁(yè)面,那么在代碼中,我們是否也可以刷新請(qǐng)求呢?對(duì)應(yīng)的,retrying模塊就可以幫助我們解決
10.1 retrying模塊的使用
retrying模塊的地址:https://pypi.org/project/retrying/
retrying 模塊的使用
- 使用retrying模塊提供的retry模塊
- 通過(guò)裝飾器的方式使用,讓被裝飾的函數(shù)反復(fù)執(zhí)行
- retry中可以傳入?yún)?shù)stop_max_attempt_number,讓函數(shù)報(bào)錯(cuò)后繼續(xù)重新執(zhí)行,達(dá)到最大執(zhí)行次數(shù)的上限,如果每次都報(bào)錯(cuò),整個(gè)函數(shù)報(bào)錯(cuò),如果中間有一個(gè)成功,程序繼續(xù)往后執(zhí)行
10.2 retrying和requests的簡(jiǎn)單封裝
實(shí)現(xiàn)一個(gè)發(fā)送請(qǐng)求的函數(shù),每次爬蟲(chóng)中直接調(diào)用該函數(shù)即可實(shí)現(xiàn)發(fā)送請(qǐng)求,在其中
- 使用timeout實(shí)現(xiàn)超時(shí)報(bào)錯(cuò)
- 使用retrying模塊實(shí)現(xiàn)重試
代碼參考:
# parse.py import requests from retrying import retryheaders = {}#最大重試3次,3次全部報(bào)錯(cuò),才會(huì)報(bào)錯(cuò) @retry(stop_max_attempt_number=3) def _parse_url(url)#超時(shí)的時(shí)候回報(bào)錯(cuò)并重試response = requests.get(url, headers=headers, timeout=3) #狀態(tài)碼不是200,也會(huì)報(bào)錯(cuò)并重試assert response.status_code == 200return responsedef parse_url(url)try: #進(jìn)行異常捕獲response = _parse_url(url)except Exception as e:print(e)#報(bào)錯(cuò)返回Noneresponse = Nonereturn responseretrying模塊能夠?qū)崿F(xiàn)捕獲函數(shù)的異常,反復(fù)執(zhí)行函數(shù)的效果,和timeout配合使用,能夠解決網(wǎng)絡(luò)波動(dòng)帶來(lái)的請(qǐng)求不成功的問(wèn)題
總結(jié)
以上是生活随笔為你收集整理的python中的requests模块的使用大全的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Docker常用操作命令(一)
- 下一篇: Python 移动文件夹所有的文件到另外