Python HTTP庫:requests快速入門

一隻要飛的豬發表於2019-04-20

安裝

  1. 最推薦的方式是使用Anaconda
    conda install request
  2. 如果不想安裝Anaconda,可以使用pip安裝
    pip install request
  3. 本地化httpbin測試工具
    pip install gunicorn httpbin
    gunicorn httpbin:app (Windows平臺不支援)

基本用法

url = 'http://httpbin.org/'
r = requests.get(url, 'get')
r = requests.post(url, 'post')
r = requests.put(url, 'put')
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
複製程式碼

request.get,就是以GET方式傳送一個REQUEST,得到一個Response類的結果r,然後可以從r中獲取所需的和HTTP相關的資訊。
request.get('http://httpbin.org/', 'get') == request.get('http://httpbin.org/get')

傳遞URL引數

movie.douban.com/subject/304…
類似的連結格式為:
<協議>://<域名>/<介面>?<鍵1>=<值1>&<鍵2>=<值2>
Resquest庫允許使用params關鍵字引數,以一個字串字典來提供這些引數。

param = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=param)
print(r.url)
>>http://httpbin.org/get?key2=value2&key1=value1
複製程式碼

通過列印輸出該URL,可以看到URL已被正確編碼,有兩點需要注意的地方:

  1. 字典裡值為None的鍵不會被新增到URL的查詢字串中
  2. 字典中可以用列表作為鍵值新增到URL的查詢字串中
param = {'key1': 'value1', 'key2': None }
r = requests.get("http://httpbin.org/get", params=param)
print(r.url)
>>http://httpbin.org/get?key1=value1
param = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get("http://httpbin.org/get", params=param)
print(r.url)
>>http://httpbin.org/get?key2=value2&key2=value3&key1=value1
複製程式碼

響應內容

Requests會主動解碼來自伺服器的內容,大多數unicode字符集都能被無縫解碼

import requests
r = requests.get('https://api.github.com/events')
r.text
#<class 'str'>使用其推測的文字編碼
r.encoding
#檢視Requests使用的編碼方式
r.encoding = 'utf-8'
#修改Requests使用的編碼方式
r.content
#<class 'byte'>獲取編碼
#Requests會自動解碼gzip和deflatte傳輸編碼的響應資料
複製程式碼

在需要的情況下Requests也可以使用定製的編碼,如果建立了自己的編碼並使用codecs模組進行註冊,就可以輕鬆地使用這個解碼器名稱作為r.encoding的值,然後由Requests來處理編碼。

JSON響應

import requests
r = requests.get('https://api.github.com/events')
r.json()
>>[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...
複製程式碼

如果JSON解碼失敗,r.json()會丟擲一個異常,例如,響應內容是401(Unauthorized),嘗試訪問r.json() 將會丟擲 ValueError: No JSON object could be decoded 異常。成功呼叫r.json()並不意味著響應成功,失敗的響應中可能也包含JSON物件(比如 HTTP 500錯誤細節)。要檢查請求是否成功,需要使用r.raise_for_status()或者檢查r.status_code是否和期望值相同。 r.status_code == requests.codes.ok

定製響應頭

如果想要為請求新增HTTP頭部,只要簡單地傳遞一個dictheader就可以實現。

url = 'https://api.github.com/some/endpoint'
headers = {'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers)
#Attention:定製header的優先順序低於某些特定的資訊源
複製程式碼
  • 如果在.netrc中設定了使用者認證資訊,使用 headers=設定的授權就不會生效。而如果設定了auth=引數,.netrc的設定就無效
  • 如果被重定向到別的主機,授權 header 就會被刪除
  • 代理授權header會被URL中提供的代理身份覆蓋掉
  • 在我們能判斷內容長度的情況下,header 的 Content-Length 會被改寫

重定向與請求歷史

預設情況下,除了HEAD, Request會自動處理所有重定向,可以使用響應物件的history方法來追蹤重定向。
Response.history是一個Response物件的列表,為了完成請求而建立的物件,這個物件列表按照從最老到最近的請求進行排序。

r = requests.get('http://github.com')
    print(r.url)
    print(r.status_code)
    print(r.history)
>>https://github.com/
>>200
>>[<Response [301]>]
複製程式碼

如果使用GET/ OPTIONS/ POST/ PUT/ PATCH/ HEAD/ DELETE,可以通過allow_redirects引數禁用重定向處理。

超時響應

timeout引數設定的秒數時間之後停止等待響應,基本上所有的生產程式碼都應該使用這一引數,如果不使用,程式可能永遠失去響應
requests.get('http://github.com', timeout=0.001)

相關文章