一、寫在前面 Requests 是用Python語言編寫,基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫。它比 urllib 更加方便,可以節約我們大量的工作,完全滿足 HTTP 測試需求。Requests 的哲學是以 PEP 20 的習語為中心開發的,所以它比 ...
一、寫在前面
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庫的其他功能。