Python requests 模塊

requests


Python 的內置 urllib 模塊,能夠用於訪問資源,可是,用起來比較麻煩。python

requests 是一個第三方庫,在處理 URL 資源上面很是方便,這也是入門爬蟲比較推薦的庫之一。git

安裝 requests


若是安裝了 Anaconda 這一步能夠省略,不然,可使用下面的命令來安裝 requests:github

$ pip install requests

上手 requests


發送請求

使用 requests,須要先導入 requests 模塊:json

>>> import requests

使用 get() 獲取某個頁面。以 requests 官方文檔說起的 Github 公共時間線爲例:api

>>> url = "https://api.github.com/events"
>>> resp = requests.get(url)

在這裏,requests 的 get() 方法返回一個 Response 對象,賦值給變量 resp。如今能夠經過這個對象獲取須要的內容。瀏覽器

響應內容

>>> resp.status_code # 響應碼,200 表示正常訪問
200
>>> resp.text
'[{"id":"11696703469","type":"CreateEvent","actor":{"id":59443325,"login":"mahmoudjafarinejad",...'
>>> resp.encoding
'utf-8'

status_code 返回的是響應碼,200 在這裏表示正常訪問。resp.text 在這裏返回的是響應的內容。在返回的響應內容,requests 會自動推測文本編碼,可使用 encoding 屬性來查看具體使用了什麼編碼,例如文中使用該屬性返回 utf-8bash

二進制響應內容

返回的 Response 對象,可使用 content 屬性得到字節對象:服務器

>>> resp.content
b'[{"id":"11696703469","type":"CreateEvent","actor":{"id":59443325,"login":"mahmoudjafarinejad",...'

JSON 響應內容

requests 能夠處理 JSON 數據。但這中間也有些須要注意的地方,先看代碼:微信

>>> resp.json()
[{'id': '11697045499', 'type': 'IssueCommentEvent', 'actor': {'id': 5268763, 'login': 'zz-jason', ...]

在這裏使用 json() 能夠得到 JSON 內容。這裏須要注意:若是解碼失敗,該方法會拋出異常。例如,若返回的響應碼是 401,嘗試訪問 resp.json() 時,就會拋出 ValueError: No JSON object could be decoded 異常。post

還有一個須要注意的地方,並非說成功調用 resp.json() 就表示響應成功。有些服務器在失敗的響應中包含一個 JSON 對象。這個時候調用 resp.json() 返回的將是這個包含錯誤細節的 JSON 對象。因此要檢測是否響應成功還須要配合使用 resp.status_code

傳遞 URL 參數

當訪問網頁的時候,咱們可能會遇到帶參數的 URL,當使用 requests 的時候,咱們能夠傳入 dict 做爲參數傳入(這裏以 http://httpbin.org 爲例):

>>> resp = requests.get('http://httpbin.org/get', params={'key1': 'value1', 'key2': 'value2'})
>>> resp.url
'http://httpbin.org/get?key1=value1&key2=value2'

在上面的例子當中,傳入 key1=value1key2=value2 到指定的 URL 中。使用 resp.url 能夠看到 URL 已被正確編碼。

傳遞 dict 做爲參數的時候,dict 中值爲 None 的鍵都不會被添加到 URL 的查詢字符串中。

定義請求頭

有時候直接使用 get() 方法訪問網站時,返回的響應碼並非 200。這是由於有些網站有反爬機制,這個時候能夠定義請求頭,模擬瀏覽器正常訪問網站,這裏咱們以豆瓣爲例,在沒有定義請求頭的狀況下嘗試使用 get() 方法:

>>> url ="https://www.douban.com/"
>>> resp = requests.get(url)
>>> resp.status_code
418

能夠看到這裏返回的響應碼是 418。如今定義請求頭,再次訪問:

>>> headers = {'User-Agent': 'Mozilla/5.0'}
>>> resp = requests.get(url, headers=headers)
>>> resp.status_code
200

這個時候,返回的響應碼爲 200,表示訪問成功。那麼這個時候就能夠利用返回的 Response 對象獲取須要的內容。

這裏提醒下: 就上面以豆瓣爲例,不要頻繁發起請求,如果頻繁請求,有可能會被認爲是惡意攻擊,並且這樣也會對服務器形成負擔。

POST 請求

當須要發送一些編碼爲表單形式的數據。這個時候,可使用 post() 方法,並傳遞一個字典給 data 參數。requests 在發出請求的時候會將傳入的數據字典編碼爲表單形式:

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

timeout 參數

能夠告訴 requests 在通過 timeout 參數所給定的時間中止響應。(timeout 參數以秒爲單位)

>>> resp = requests.get(url, timeout=2)

這裏表示在 2 秒後超時。

以上關於 requests 簡單上手的內容,更多詳細的內容能夠訪問下面的連接進行詳細參閱:

https://requests.readthedocs.io/en/latest/

參考資料


來源

  1. "Requests: HTTP for Humans™".requests.readthedocs.io.Retrieved 5 March 2020.
  2. 廖雪峯.「Python 教程」.liaoxuefeng.com.[2020-03-05].

歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索