溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python爬蟲中的request庫剖析

發(fā)布時間:2020-09-10 16:14:27 來源:億速云 閱讀:216 作者:Leah 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)Python爬蟲中的request庫剖析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

所謂爬蟲就是模擬客戶端發(fā)送網(wǎng)絡(luò)請求,獲取網(wǎng)絡(luò)響應(yīng),并按照一定的規(guī)則解析獲取的數(shù)據(jù)并保存的程序。要說 Python 的爬蟲必然繞不過 Requests 庫。Requests 是用 python 語言基于 urllib 編寫的,采用的是 Apache2 Licensed 開源協(xié)議的 HTTP 庫。

1 簡介

對于 Requests 庫,官方文檔是這么說的:

Requests 唯一的一個非轉(zhuǎn)基因的 Python HTTP 庫,人類可以安全享用。
警告:非專業(yè)使用其他 HTTP 庫會導(dǎo)致危險的副作用,包括:安全缺陷癥、冗余代碼癥、重新發(fā)明輪子癥、啃文檔癥、抑郁、頭疼、
甚至死亡。

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

2 快速上手

2.1 發(fā)送請求

導(dǎo)入 Requests 模塊:

import requests

獲取網(wǎng)頁:

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')

通常我們會設(shè)置請求的超時時間,Requests 使用 timeout 參數(shù)來設(shè)置,單位是秒,示例如下:

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

2.2 參數(shù)傳遞

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

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 響應(yīng)內(nèi)容

我們來獲取一下服務(wù)器的響應(yīng)內(nèi)容,這里地址 https://api.github.com 為例:

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

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

(1)二進(jìn)制響應(yīng)內(nèi)容

比如當(dāng)我們要獲取一張圖片的數(shù)據(jù),會以二進(jìn)制的方式獲取響應(yīng)數(shù)據(jù),示例如下:

from PIL import Image
from io import BytesIO
i = Image.open(BytesIO(r.content))

(2)JSON響應(yīng)內(nèi)容

Requests 中已經(jīng)內(nèi)置了 JSON 解碼器,因此我們可以很容易的對 JSON 數(shù)據(jù)進(jìn)行解析,示例如下:

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

注:成功調(diào)用 r.json() 并不一定響應(yīng)成功,有的服務(wù)器會在失敗的響應(yīng)中包含一個 JSON 對象(比如 HTTP 500 的錯誤細(xì)節(jié)),這時我們就需要查看響應(yīng)的狀態(tài)碼了 r.status_code 或 r.raise_for_status(),成功調(diào)用時 r.status_code 為 200,r.raise_for_status() 為 None。

2.4 自定義請求頭

當(dāng)我們要給請求添加 headers 時,只需給 headers 參數(shù)傳遞一個字典即可,示例如下:

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

注:自定義 headers 優(yōu)先級是低于一些特定的信息的,如:在 .netrc 中設(shè)置了用戶認(rèn)證信息,使用 headers 設(shè)置的授權(quán)就不會生效,而當(dāng)設(shè)置了 auth 參數(shù),.netrc 的設(shè)置會無效。所有的 headers 值必須是 string、bytestring 或者 unicode,通常不建議使用 unicode。

2.5 重定向與歷史

默認(rèn)情況下,Requests 會自動處理除了 HEAD 以外的所有重定向,可以使用響應(yīng)對象的 history 屬性來追蹤重定向,其返回為響應(yīng)對象列表,這個列表是按照請求由晚到早進(jìn)行排序的,看一下示例:

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

如果使用的是 get、post、put、delete、options、patch 可以使用 allow_redirects 參數(shù)禁用重定向。示例如下:

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

2.6 錯誤與異常

當(dāng)遇到網(wǎng)絡(luò)問題(如:DNS 查詢失敗、拒絕連接等)時,Requests 會拋出 ConnectionError 異常;在 HTTP 請求返回了不成功的狀態(tài)碼時, Response.raise_for_status() 會拋出 HTTPError 異常;請求超時,會拋出 Timeout 異常;請求超過了設(shè)定的最大重定向次數(shù),會拋出 TooManyRedirects 異常。所有 Requests 顯式拋出的異常都繼承自 requests.exceptions.RequestException。

關(guān)于Python爬蟲中的request庫剖析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI