python-Request模塊的強大之處

轉載自 https://www.cnblogs.com/xiaoshandeboke/p/11719251.html

request 允許發送HTTP/1.1的請求,併爲我們封裝了更多的方法讓我們不需要手動爲 URL 添加查詢字串,也不需要對 POST 數據進行表單編碼。Keep-alive 和 HTTP 連接池的功能是 100% 自動化的,一切動力都來自於根植在 Requests 內部的 urllib3

Requests 完全滿足今日 web 的需求。

  • Keep-Alive & 連接池
  • 國際化域名和 URL
  • 帶持久 Cookie 的會話
  • 瀏覽器式的 SSL 認證
  • 自動內容解碼
  • 基本/摘要式的身份認證
  • 優雅的 key/value Cookie
  • 自動解壓
  • Unicode 響應體
  • HTTP(S) 代理支持
  • 文件分塊上傳
  • 流下載
  • 連接超時
  • 分塊請求
  • 支持 .netrc

Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美運行。

 

安裝、簡介完後進行快速上手:

使用request發送http請求很簡單,

一、導入模塊

import request

二、使用request發送get請求

r = request.get( ‘https://www.baidu.com’ )

這個 r 就是我們的response對象,如果你請求成功則所有你想要的信息就在該對象中。

你也可以發送一個post請求:

r = request.post('https://www.baidu.com', data = {key : value})

你需要在data中放入你想要在請求體中包含的內容,那麼其他 HTTP 請求類型:PUT,DELETE,HEAD 以及 OPTIONS 又是如何的呢?都是一樣的簡單:

r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')

傳遞URL參數:

你也許經常想爲 URL 的查詢字符串(query string)傳遞某種數據。如果你是手工構建 URL,那麼數據會以鍵/值對的形式置於 URL 中,跟在一個問號的後面。例如, httpbin.org/get?key=val。 Requests 允許你使用 params 關鍵字參數,以一個字符串字典來提供這些參數。舉例來說,如果你想傳遞 key1=value1 和 key2=value2 到 httpbin.org/get ,那麼你可以使用如下代碼:

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

通過打印輸出該 URL,你能看到 URL 已被正確編碼:

print(r.url)
http://httpbin.org/get?key2=value2&key1=value1

注意字典裏值爲 None 的鍵都不會被添加到 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
接下來應該到了獲取相應內容的時間了:
一、r.text()
import requests
r = requests.get('https://api.github.com/events')
r.text
u'[{"repository":{"open_issues":0,"url":"https://github.com/...
request能自動解析來自服務器的內容。

請求發出後,Requests 會基於 HTTP 頭部對響應的編碼作出有根據的推測。當你訪問 r.text 之時,Requests 會使用其推測的文本編碼。你可以找出 Requests 使用了什麼編碼,並且能夠使用 r.encoding 屬性來改變它:

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

如果你改變了編碼,每當你訪問 r.text ,Request 都將會使用 r.encoding 的新值。你可能希望在使用特殊邏輯計算出文本的編碼的情況下來修改編碼。比如 HTTP 和 XML 自身可以指定編碼。這樣的話,你應該使用 r.content 來找到編碼,然後設置 r.encoding 爲相應的編碼。這樣就能使用正確的編碼解析 r.text 了。

在你需要的情況下,Requests 也可以使用定製的編碼。如果你創建了自己的編碼,並使用 codecs 模塊進行註冊,你就可以輕鬆地使用這個解碼器名稱作爲 r.encoding 的值, 然後由 Requests 來爲你處理編碼。

二、二進制相應內容

你也能以字節的方式訪問請求響應體,對於非文本請求:

>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...

Requests 會自動爲你解碼 gzip 和 deflate 傳輸編碼的響應數據。

例如,以請求返回的二進制數據創建一張圖片,你可以使用如下代碼:

>>> from PIL import Image
>>> from io import BytesIO

>>> i = Image.open(BytesIO(r.content))

三、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 是否和你的期望相同。

四、原始響應數據

 

在罕見的情況下,你可能想獲取來自服務器的原始套接字響應,那麼你可以訪問 r.raw。 如果你確實想這麼幹,那請你確保在初始請求中設置了 stream=True。具體你可以這麼做:

>>> r = requests.get('https://api.github.com/events', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

但一般情況下,你應該以下面的模式將文本流保存到文件:

with open(filename, 'wb') as fd:
    for chunk in r.iter_content(chunk_size):
        fd.write(chunk)

使用 Response.iter_content 將會處理大量你直接使用 Response.raw 不得不處理的。 當流下載時,上面是優先推薦的獲取內容方式。 Note that chunk_size can be freely adjusted to a number that may better fit your use cases.

發佈了42 篇原創文章 · 獲贊 86 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章