上一篇我們介紹了 Requests 庫的基本用法禽作,學(xué)會之后大家就可以應(yīng)付一般的請求了骏庸。這一篇我們接著介紹 Requests 的高級用法直焙,以便應(yīng)付一些棘手的問題祠斧。
會話維持
在 requests 中盹兢,直接使用 get() 或 post() 方法確實可以做到模擬網(wǎng)頁的請求邻梆,但是這實際上是兩個不同的會話,相當于用了兩個瀏覽器打開不同的頁面绎秒,而這兩個頁面是不共享 cookies 的浦妄。會話維持相當于打在原來的瀏覽器上新開了一個頁面,這樣就不用每次去設(shè)置 cookies 了——這就是Session對象见芹。
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)
#返回
{
"cookies": {}
}
這里我們請求了一個測試網(wǎng)站剂娄,設(shè)置了一個 Cookie ,名稱為 num 玄呛,內(nèi)容為123456阅懦,之后又發(fā)起了請求,獲取Cookies徘铝,結(jié)果并沒有取到第一次請求的 Cookie耳胎。
試想一種常見的場景:我登錄一個網(wǎng)站之后惯吕,點擊里面某個功能的時候,是不需要再登錄的怕午,為什么废登?因為登錄操作之后,瀏覽器與服務(wù)器之間就建立了一個 Session 郁惜,我在同一瀏覽器再次請求服務(wù)器的時候堡距,共用的是這一個 Session ,所以不用再次登錄扳炬。那么如果我使用代碼去請求呢吏颖?按照上面的例子,我請求兩次并不會共享 Session恨樟,那就沒法實現(xiàn)這個場景功能半醉。而 Requests 的會話可以實現(xiàn)這種場景功能。
我們再來看個例子:
session = requests.Session()
session.get('http://httpbin.org/cookies/set/num/123456')
res = session.get('http://httpbin.org/cookies')
print(res.text)
#返回
{
"cookies": {
"num": "123456"
}
}
這個例子中劝术,我們使用 Session 對象請求缩多,第一次請求設(shè)置的 Cookie ,在第二次請求中我們?nèi)匀豢梢垣@取到养晋,說明兩次請求在同一個 Session 中衬吆。
身份認證
在訪問網(wǎng)站時,我們經(jīng)常會遇到需要身份認證的頁面绳泉,需要輸入用戶名和密碼才能登錄網(wǎng)站逊抡。這個時候我們可以使用 Requests 自帶的身份認證功能。
import requests
from requests.auth import HTTPBasicAuth
#請將username和password替換成自己在該網(wǎng)站的登錄用戶名和密碼
res = requests.get('http://www.baidu.com', auth=HTTPBasicAuth('username', 'password'))
print(res.status_code)
#返回
200
如果用戶名和密碼都正確的話零酪,就會成功冒嫡,返回200狀態(tài)碼。否則返回401狀態(tài)碼四苇。
SSL證書驗證
現(xiàn)在隨處可見 https 開頭的網(wǎng)站孝凌,Requests 可以為 HTTPS 請求驗證 SSL 證書,就像 web 瀏覽器一樣月腋。要想檢查某個主機的 SSL 證書蟀架,你可以使用 verify 參數(shù):
import requests
r = requests.get('https://httpbin.org', verify=True)
print(r.text)
如果想檢查驗證某個主機的 SSL 證書,就將 verify 設(shè)置為 True 榆骚,如果證書無效片拍,就會報 requests.exceptions.SSLError 的錯誤。如果想跳過檢查妓肢,就將 verify 參數(shù)設(shè)置為 False穆碎。 verify 參數(shù)默認是 True ,所以如果需要的話职恳,需要手動設(shè)置下這個變量所禀。
代理設(shè)置
對于某些網(wǎng)站,如果請求幾次放钦,或許能正常獲取內(nèi)容色徘。一旦開始爬取,對于大規(guī)模的頻繁請求操禀,網(wǎng)站可能會彈出驗證碼褂策,或者跳轉(zhuǎn)到登陸認證,或者封禁IP颓屑,導(dǎo)致一定時間內(nèi)無法訪問斤寂。此時,就需要設(shè)置代理還解決這個問題揪惦,就要用到 proxies 參數(shù)遍搞。
# 代理設(shè)置
proxies = {
'http': 'http://127.0.0.1:9001',
'https': 'https://127.0.0.2:9002'
}
requests.get('http://www.baidu.com', proxies=proxies)
這里的兩個地址都是編的,僅做示例用器腋。如果你想跑起來的話需要換成有效代理溪猿。
SOCKS
除了基本的 HTTP 代理,Request 還支持 SOCKS 協(xié)議的代理纫塌。這是一個可選功能诊县,若要使用, 你需要安裝第三方庫措左。你可以用 pip 獲取依賴:
$ pip install requests[socks]
安裝好依賴以后依痊,使用 SOCKS 代理和使用 HTTP 代理一樣簡單:
proxies = {
'http': 'socks5://user:pass@host:port',
'https': 'socks5://user:pass@host:port'
}
超時設(shè)置
在 Rquests 的基本用法中,我們介紹了超時的用法怎披,通過使用 timeout 參數(shù)來配置胸嘁。例如:
r = requests.get('https://github.com', timeout=5)
我們知道,一個 HTTP 請求會有 connect 和 read 兩部分時間钳枕,上面的例子中設(shè)置的是二者加起來的超時時間缴渊。如果要分別制定,我們需要傳入一個元組:
r = requests.get('https://github.com', timeout=(3.05, 27))
如果遠端服務(wù)器很慢鱼炒,如果你想要 Request 一直等待服務(wù)器返回衔沼,那么可以給 timeout 賦值 None:
r = requests.get('https://github.com', timeout=None)
總結(jié)
本文為大家講述了幾個 Requests 的高級特性,通過掌握這些特性昔瞧,我們就基本上掌握了 Requests 的常用功能指蚁,也可以運用 Requests 去解決實際問題了。我們的 Requests 介紹也就告一段落了自晰,剩下的靠大家去實踐出真知了凝化。