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