一、寫在前面
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庫的其他功能。