天天看點

python Requests庫的用法安裝發送請求與傳遞參數Response對象Cookies逾時配置SessionSSL證書驗證身份驗證代理利用Requests來抓取火車票資料。

<a target="_blank" href="http://cn.python-requests.org/zh_cn/latest/">requests庫官方中文文檔</a>

<a target="_blank" href="http://cn.python-requests.org/zh_cn/latest/api.html">官方文檔 api</a>

利用 pip 安裝:$ pip install requests

利用 easy_install安裝:$ easy_install requests

下載下傳代碼後安裝:

$ git clone git://github.com/kennethreitz/requests.git

$ cd requests

$ python setup.py install

再懶一點,通過ide安裝吧,如pycharm!

簡單入門

一個小例子:

不但get方法簡單,其他方法都是統一的接口樣式!

最基本的get請求可以直接用get方法

如果想要加參數,可以利用 params 參數

運作結果

帶參數的請求執行個體:

如果想請求json檔案,可以利用 json() 方法解析。例如自己寫一個json檔案命名為a.json,内容如下

python Requests庫的用法安裝發送請求與傳遞參數Response對象Cookies逾時配置SessionSSL證書驗證身份驗證代理利用Requests來抓取火車票資料。

利用如下程式請求并解析

如果想擷取來自伺服器的原始套接字響應,可以取得 r.raw 。 不過需要在初始請求中設定 stream=true 。

這樣就擷取了網頁原始套接字内容。如果想添加 headers,可以傳 headers 參數

通過headers參數可以增加請求頭中的headers資訊

定制header:

請求頭内容可以用r.request.headers來擷取。

自定義請求頭部:定制headers,使用headers參數來傳遞

僞裝請求頭部是采集時經常用的,我們可以用這個方法來隐藏:

對于 post 請求來說,我們一般需要為它增加一些參數。那麼最基本的傳參方法可以利用 data 這個參數。

可以看到參數傳成功了,然後伺服器傳回了我們傳的資料。有時候我們需要傳送的資訊不是表單形式的,需要我們傳json格式的資料過去,是以我們可以用 json.dumps() 方法把表單資料序列化。

post發送json資料:

通過上述方法,我們可以post json格式的資料。如果想要上傳檔案,那麼直接用 file 參數即可。建立一個 a.txt 的檔案,内容寫上 hello world!

運作結果如下

這樣便成功完成了一個檔案的上傳。

requests 是支援流式上傳的,這允許你發送大的資料流或檔案而無需先把它們讀入記憶體。要使用流式上傳,僅需為你的請求體提供一個類檔案對象即可。這是一個非常實用友善的功能。

你可以把字元串當着檔案進行上傳:

發送檔案的post類型,這個相當于向網站上傳一張圖檔,文檔等操作,這時要使用files參數

使用requests方法後,會傳回一個response對象,其存儲了伺服器響應的内容,如上執行個體中已經提到的 r.text、r.status_code……

擷取文本方式的響應體執行個體:當你通路 r.text 之時,會使用其響應的文本編碼進行解碼,并且你可以修改其編碼讓 r.text 使用自定義的編碼進行解碼。

如果一個響應中包含了cookie,那麼我們可以利用 cookies 變量來拿到。會話對象讓你能夠跨請求保持某些參數,最友善的是在同一個session執行個體發出的所有請求之間保持cookies,且這些都是自動處理的

以上程式僅是樣例,可以用 cookies 變量來得到站點的 cookies。另外可以利用 cookies 變量來向伺服器發送 cookies 資訊

要想發送你的cookies到伺服器,可以使用 cookies 參數:

如下是快盤簽到腳本

可以利用 timeout 變量來配置最大請求時間。timeout 僅對連接配接過程有效,與響應體的下載下傳無關。

注:timeout 僅對連接配接過程有效,與響應體的下載下傳無關。

也就是說,這個時間隻限制請求的時間。即使傳回的 response 包含很大内容,下載下傳需要一定時間,然而這并沒有什麼卵用。

<a target="_blank" href="http://www.cnblogs.com/lucky-pin/p/5806394.html">自動登入教務處網站</a>

會話對象

通路中使用session

    1. 先初始化一個session對象,s = requests.session()

    2. 然後使用這個session對象來進行通路,r = s.post(url,data = user)

在以上的請求中,每次請求其實都相當于發起了一個新的請求。也就是相當于我們每個請求都用了不同的浏覽器單獨打開的效果。也就是它并不是指的一個會話,即使請求的是同一個網址。

比如

很明顯,這不在一個會話中,無法擷取 cookies,那麼在一些站點中,我們需要保持一個持久的會話怎麼辦呢?就像用一個浏覽器逛淘寶一樣,在不同的頁籤之間跳轉,這樣其實就是建立了一個長久會話。

解決方案如下

在這裡我們請求了兩次,一次是設定 cookies,一次是獲得 cookies。運作結果

發現可以成功擷取到 cookies 了,這就是建立一個會話到作用。那麼既然會話是一個全局的變量,那麼我們肯定可以用來全局的配置了。

通過 s.headers.update 方法設定了 headers 的變量。然後我們又在請求中設定了一個 headers,那麼會出現什麼結果?

很簡單,兩個變量都傳送過去了。運作結果:

如果get方法傳的headers 同樣也是 x-test 呢?

嗯,它會覆寫掉全局的配置

那如果不想要全局配置中的一個變量了呢?很簡單,設定為 none 即可

以上就是 session 會話的基本用法

另一種寫法 :

現在随處可見 https 開頭的網站,requests可以為https請求驗證ssl證書,就像web浏覽器一樣。要想檢查某個主機的ssl證書,你可以使用 verify 參數。

現在 12306 證書不是無效的嘛,來測試一下

來試下 github 的

正常請求,内容我就不輸出了。如果我們想跳過剛才 12306 的證書驗證,把 verify 設定為 false 即可

發現就可以正常請求了。在預設情況下 verify 是 true,是以如果需要的話,需要手動設定下這個變量。

基本身份認證(http basic auth):

另一種非常流行的http身份認證形式是摘要式身份認證,requests對它的支援也是開箱即可用的:

如果需要使用代理,你可以通過為任意請求方法提供 proxies 參數來配置單個請求

也可以通過環境變量 http_proxy 和 https_proxy 來配置代理

采集時為避免被封ip,經常會使用代理。requests也有相應的proxies屬性。

如果代理需要賬戶和密碼,則需這樣:

根據觀察,資料接口如下:

傳回的是2015-5-23南昌到郴州的火車票資訊,格式為json。

傳回的資料的如下(隻截取了一部分):

看着很亂,我們稍加整理:

這樣就比較清晰了,代碼如下,提取自己需要的資訊。