Requests的高級特性

上一篇我們介紹了 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 介紹也就告一段落了自晰,剩下的靠大家去實踐出真知了凝化。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酬荞,隨后出現(xiàn)的幾起案子搓劫,更是在濱河造成了極大的恐慌瞧哟,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枪向,死亡現(xiàn)場離奇詭異勤揩,居然都是意外死亡,警方通過查閱死者的電腦和手機秘蛔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門陨亡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人深员,你說我怎么就攤上這事负蠕。” “怎么了倦畅?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵遮糖,是天一觀的道長。 經(jīng)常有香客問我滔迈,道長止吁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任燎悍,我火速辦了婚禮敬惦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谈山。我一直安慰自己俄删,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布奏路。 她就那樣靜靜地躺著畴椰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸽粉。 梳的紋絲不亂的頭發(fā)上斜脂,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音触机,去河邊找鬼帚戳。 笑死,一個胖子當著我的面吹牛儡首,可吹牛的內(nèi)容都是我干的片任。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼蔬胯,長吁一口氣:“原來是場噩夢啊……” “哼对供!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氛濒,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤产场,失蹤者是張志新(化名)和其女友劉穎鹅髓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體京景,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡迈勋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醋粟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡重归,死狀恐怖米愿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鼻吮,我是刑警寧澤育苟,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站椎木,受9級特大地震影響违柏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜香椎,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一漱竖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畜伐,春花似錦馍惹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慎框,卻和暖如春良狈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笨枯。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工薪丁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猎醇。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓窥突,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硫嘶。 傳聞我的和親對象是個殘疾皇子阻问,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容