1. 程式人生 > >python常用模組之requests

python常用模組之requests

一、requests   

1、GET   url帶引數請求

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)

 

2、定製請求頭

如果你想為請求新增 HTTP 頭部,只要簡單地傳遞一個 dict 給 headers 引數就可以了。

例如,在前一個示例中我們沒有指定 content-type:

>>> url = 'https://api.github.com/some/endpoint'
>>> headers = {'user-agent': 'my-app/0.0.1'}

>>> r = requests.get(url, headers=headers)

3、更加複雜的POST請求

通常,你想要傳送一些編碼為表單形式的資料——非常像一個 HTML 表單。要實現這個,只需簡單地傳遞一個字典給 data 引數。你的資料字典在發出請求時會自動編碼為表單形式:

>>> payload = {'
key1': 'value1', 'key2': 'value2'} >>> r = requests.post("http://httpbin.org/post", data=payload) >>> print(r.text) { ... "form": { "key2": "value2", "key1": "value1" }, ... }

你還可以為 data 引數傳入一個元組列表。在表單中多個元素使用同一 key 的時候,這種方式尤其有效:

>>> payload = (('
key1', 'value1'), ('key1', 'value2')) >>> r = requests.post('http://httpbin.org/post', data=payload) >>> print(r.text) { ... "form": { "key1": [ "value1", "value2" ] }, ... }

 

很多時候你想要傳送的資料並非編碼為表單形式的。如果你傳遞一個 string 而不是一個 dict,那麼資料會被直接釋出出去。

例如,Github API v3 接受編碼為 JSON 的 POST/PATCH 資料:

>>> import json

>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

>>> r = requests.post(url, data=json.dumps(payload))
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

>>> r = requests.post(url, json=payload)

 

 

二、響應

1、相應內容

>>> import requests
>>> r = requests.get('https://api.github.com/events')
>>> r.text
u'[{"repository":{"open_issues":0,"url":"https://github.com/...

Requests 會自動解碼來自伺服器的內容。大多數 unicode 字符集都能被無縫地解碼。

 

 

你可以找出 Requests 使用了什麼編碼,並且能夠使用r.encoding 屬性來改變它:

>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'

 

2、二進位制相應內容

 

你也能以位元組的方式訪問請求響應體,對於非文字請求:
>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...

 

3、Json相應內容

Requests 中也有一個內建的 JSON 解碼器,助你處理 JSON 資料:

>>> import requests

>>> r = requests.get('https://api.github.com/events')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

 

如果 JSON 解碼失敗, r.json() 就會丟擲一個異常。例如,響應內容是 401 (Unauthorized),嘗試訪問 r.json() 將會丟擲 ValueError: No JSON object could be decoded 異常。

需要注意的是,成功呼叫 r.json() 並不意味著響應的成功。有的伺服器會在失敗的響應中包含一個 JSON 物件(比如 HTTP 500 的錯誤細節)。這種 JSON 會被解碼返回。要檢查請求是否成功,請使用 r.raise_for_status() 或者檢查 r.status_code 是否和你的期望相同。

 

4、響應狀態碼

我們可以檢測響應狀態碼:

>>> r = requests.get('http://httpbin.org/get')
>>> r.status_code
200
>>> r.status_code == requests.codes.ok
True

 

5、響應頭

我們可以檢視以一個 Python 字典形式展示的伺服器響應頭

>>> r.headers
{
    'content-encoding': 'gzip',
    'transfer-encoding': 'chunked',
    'connection': 'close',
    'server': 'nginx/1.0.4',
    'x-runtime': '148ms',
    'etag': '"e1ca502697e5c9317743dc078f67693f"',
    'content-type': 'application/json'
}

 

三、cookie

如果某個響應中包含一些 cookie,你可以快速訪問它們:

>>> url = 'http://example.com/some/cookie/setting/url'
>>> r = requests.get(url)

>>> r.cookies['example_cookie_name']
'example_cookie_value'

要想傳送你的cookies到伺服器,可以使用 cookies 引數:

>>> url = 'http://httpbin.org/cookies'
>>> cookies = dict(cookies_are='working')

>>> r = requests.get(url, cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'

 

四、錯誤與異常

 

遇到網路問題(如:DNS 查詢失敗、拒絕連線等)時,Requests 會丟擲一個 ConnectionError 異常。

如果 HTTP 請求返回了不成功的狀態碼, Response.raise_for_status() 會丟擲一個 HTTPError異常。

若請求超時,則丟擲一個 Timeout 異常。

若請求超過了設定的最大重定向次數,則會丟擲一個 TooManyRedirects 異常。

所有Requests顯式丟擲的異常都繼承自 requests.exceptions.RequestException