<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,内容如下
利用如下程式請求并解析
如果想擷取來自伺服器的原始套接字響應,可以取得 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。
傳回的資料的如下(隻截取了一部分):
看着很亂,我們稍加整理:
這樣就比較清晰了,代碼如下,提取自己需要的資訊。