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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM