1. 程式人生 > >【python】requests模組初探(一)

【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庫的其他功能