【python】requests模組初探(一)
一、寫在前面
Requests 是用Python語言編寫,基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫。它比 urllib 更加方便,可以節約我們大量的工作,完全滿足 HTTP 測試需求。Requests 的哲學是以 PEP 20 的習語為中心開發的,所以它比 urllib 更加 Pythoner。
那麼,requests都有哪些應用場景呢?
1.伺服器程式設計基礎;
2.爬蟲利器;
3.自動化介面測試;
4.運維監控指令碼
等等
本篇,我就記錄一下requests最常用的兩個請求方式和以及響應,其他內容後續更新
二、安裝
安裝很簡單,只需要使用命令列安裝即可:
pip install requests
三、請求
3.1 GET請求
r = requests.get('https://api.github.com/events')
3.2 傳遞URL引數的GET請求
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
3.3 請求cookies
url = 'http://httpbin.org/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies) #後面用到再詳細分析
3.4 POST請求
通常,想要傳送一些編碼為表單形式的資料——非常像一個 HTML 表單。要實現這個,只需簡單地傳遞一個字典給 data 引數。你的資料字典在發出請求時會自動編碼為表單形式:
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
還可以為 data 引數傳入一個元組列表。在表單中多個元素使用同一 key 的時候,這種方式尤其有效:
payload = (('key1', 'value1'), ('key1', 'value2')) r = requests.post('http://httpbin.org/post', data=payload)
很多時候你想要傳送的資料並非編碼為表單形式的,例如你要傳遞一個 string 而不是一個 dict:
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
或者是定義一個字串的data
url = 'https://api.github.com/some/endpoint'
payload = '{"some": "data"}'
r = requests.post(url, data=payload)
此處除了可以自行對 dict 進行編碼,你還可以使用 json 引數直接傳遞,然後它就會被自動編碼
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)
四、請求頭
如果想為請求新增 HTTP 頭部,只要簡單地傳遞一個 dict 給 headers 引數就可以了。
url = 'https://api.github.com/some/endpoint'
headers = {'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers)
五、響應
前面的請求例子中,每個請求都會賦值給一個名為 r 的 Response 物件,我們可以從這個物件中獲取所有我們想要的資訊
5.1獲得請求url
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)
print(r.url)
>>> http://httpbin.org/get?key1=value1&key2=value2&key2=value3
5.2獲得響應內容
r = requests.get('https://api.github.com/events')
r.text #獲得響應內容,型別為字串
r.json() #如果 JSON 解碼失敗, r.json() 就會丟擲一個異常
r.content #獲得響應內容,型別為bytes-二進位制響應內容
r.raw #原始響應內容,在罕見的情況下,你可能想獲取來自伺服器的原始套接字響應(後面會詳細結合流資料來分析)
5.3響應狀態碼
r = requests.get('http://httpbin.org/get')
r.status_code
如果傳送了一個錯誤請求(一個 4XX 客戶端錯誤,或者 5XX 伺服器錯誤響應),我們可以通過 Response.raise_for_status() 來丟擲異常:
r = requests.get('http://httpbin.org/status/404')
r.status_code
>>> 404
r.raise_for_status()
>>>
Traceback (most recent call last):
File "requests/models.py", line 832, in raise_for_status
raise http_error
requests.exceptions.HTTPError: 404 Client Error
5.4響應頭
r.headers
5.5 Response物件支援的所有方法
r.xxx #在ipython除錯中,可以通過tab鍵來檢視所有方法
該物件所有方法如下:
apparent_encoding
content
encoding
is_permanent_redirect
iter_lines
next
raw
status_code
close
cookies
headers
is_redirect
json
ok
reason
text
connection
elapsed
history
iter_content
links
raise_for_status
request
url
這裡僅介紹了幾個很常用的響應方法,後面遇到實際問題再展開討論
六、超時
可以告訴 requests 在經過以 timeout 引數設定的秒數時間之後停止等待響應。基本上所有的生產程式碼都應該使用這一引數。如果不使用,你的程式可能會永遠失去響應:
requests.get('http://github.com', timeout=0.001)
後記
以上的兩種關於requests庫請求方式及響應方法應該可以處理一些基本問題了,後面會繼續探索requests庫的其他功能