Python爬蟲(二):Requests庫

 

 

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

所謂爬蟲就是模擬客戶端發送網絡請求,獲取網絡響應,並按照必定的規則解析獲取的數據並保存的程序。要說 Python 的爬蟲必然繞不過 Requests 庫。git

1 簡介

對於 Requests 庫,官方文檔是這麼說的:github

Requests 惟一的一個非轉基因的 Python HTTP 庫,人類能夠安全享用。警告:非專業使用其餘 HTTP 庫會致使危險的反作用,包括:安全缺陷症、冗餘代碼症、從新發明輪子症、啃文檔症、抑鬱、頭疼、甚至死亡。json

這個介紹仍是比較生動形象的,便再也不多說。安裝使用終端命令 pip install requests 。api

2 快速上手

2.1 發送請求

導入 Requests 模塊:安全

  •  
import requests

獲取網頁:服務器

  •  
r = requests.get('http://xxx.xxx')

此時,咱們獲取了 Response 對象 r,咱們能夠經過 r 獲取所需信息。Requests 簡便的 API 意味着全部 HTTP 請求類型都是顯而易見的,咱們來看一下使用常見 HTTP 請求類型 get、post、put、delete 的示例:網絡

  •  
r = requests.head('http://xxx.xxx/get')r = requests.post('http://xxx.xxx/post', data = {'key':'value'})r = requests.put('http://xxx.xxx/put', data = {'key':'value'})r = requests.delete('http://xxx.xxx/delete')

一般咱們會設置請求的超時時間,Requests 使用 timeout 參數來設置,單位是秒,示例以下:ide

  •  
r = requests.head('http://xxx.xxx/get', timeout=1)

2.2 參數傳遞

在使用 get 方式發送請求時,咱們會將鍵值對形式參數放在 URL 中問號的後面,如:http://xxx.xxx/get?key=val ,Requests 經過 params 關鍵字,以一個字符串字典來提供這些參數。好比要傳 key1=val1 和 key2=val2 到 http://xxx.xxx/get,示例以下:post

  •  
pms= {'key1': 'val1', 'key2': 'val2'}r = requests.get("http://xxx.xxx/get", params=pms)

Requests 還容許將一個列表做爲值傳入:編碼

  •  
pms= {'key1': 'val1', 'key2': ['val2', 'val3']}

注:字典裏值爲 None 的鍵都不會被添加到 URL 的查詢字符串裏。

2.3 響應內容

咱們來獲取一下服務器的響應內容,這裏地址 https://api.github.com 爲例:

  •  
import requestsr = requests.get('https://api.github.com')print(r.text)
# 輸出結果# {"current_user_url":"https://api.github.com/user","current_user...

當訪問 r.text 之時,Requests 會使用其推測的文本編碼,咱們可使用 r.encoding 查看其編碼,也能夠修改編碼,如:r.encoding = 'GBK',當改變了編碼,再次訪問 r.text 時,Request 都將會使用 r.encoding 的新值。

1)二進制響應內容 好比當咱們要獲取一張圖片的數據,會以二進制的方式獲取響應數據,示例以下:

  •  
from PIL import Imagefrom io import BytesIOi = Image.open(BytesIO(r.content))

2)JSON響應內容 Requests 中已經內置了 JSON 解碼器,所以咱們能夠很容易的對 JSON 數據進行解析,示例以下:

  •  
import requestsr = requests.get('https://api.github.com')r.json()

注:成功調用 r.json() 並不必定響應成功,有的服務器會在失敗的響應中包含一個 JSON 對象(好比 HTTP 500 的錯誤細節),這時咱們就須要查看響應的狀態碼了 r.status_code  或 r.raise_for_status(),成功調用時 r.status_code 爲 200,r.raise_for_status() 爲 None。

2.4 自定義請求頭

當咱們要給請求添加 headers 時,只需給 headers 參數傳遞一個字典便可,示例以下:

  •  
url = 'http://xxx.xxx'hds= {'user-agent': 'xxx'}r = requests.get(url, headers=hds)

注:自定義 headers 優先級是低於一些特定的信息的,如:在 .netrc 中設置了用戶認證信息,使用 headers 設置的受權就不會生效,而當設置了 auth 參數,.netrc 的設置會無效。全部的 headers 值必須是 string、bytestring 或者 unicode,一般不建議使用 unicode。

2.5 重定向與歷史

默認狀況下,Requests 會自動處理除了 HEAD 之外的全部重定向,可使用響應對象的 history 屬性來追蹤重定向,其返回爲響應對象列表,這個列表是按照請求由晚到早進行排序的,看一下示例:

  •  
import requestsr = requests.get('http://github.com')print(r.history)# 輸出結果# [<Response [301]>]

若是使用的是get、post、put、delete、options、patch 可使用 allow_redirects 參數禁用重定向。示例以下:

  •  
r = requests.get('http://xxx.xxx', allow_redirects=False)

2.6 錯誤與異常

當遇到網絡問題(如:DNS 查詢失敗、拒絕鏈接等)時,Requests 會拋出 ConnectionError 異常;在 HTTP 請求返回了不成功的狀態碼時, Response.raise_for_status() 會拋出 HTTPError 異常;請求超時,會拋出 Timeout 異常;請求超過了設定的最大重定向次數,會拋出 TooManyRedirects 異常。全部 Requests 顯式拋出的異常都繼承自 requests.exceptions.RequestException。

 

 

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

相關文章
相關標籤/搜索