1. 程式人生 > 其它 >爬蟲與Python:(三)基本庫的使用——3.網路請求庫之request使用介紹

爬蟲與Python:(三)基本庫的使用——3.網路請求庫之request使用介紹

Python爬蟲中,除了urlib()外,還有一個使用的比較多的HTTP請求庫——requests。這個庫也是常用於HTTP請求模組,它使用Python語言編寫,可以方便的對網頁進行爬取,是學習Python比較好的HTTP請求模組。

Python3中沒有預設安裝requests庫,在前一篇文章中,已經介紹了requests的安裝。其中,requests庫的pip安裝命令為pip install requests

接下來,我們來看看requests庫的7個主要方法,如下表所示:

方法 解釋
requests.request() 構造一個請求,支援以下各種方法
requests.get()
獲取HTML的主要方法
requests.head() 獲取HTML頭部資訊的主要方法
requests.post() 向HTML網頁提交POST請求的方法
requests.put() 向HTML網頁提交PUT請求的方法
request.patch() 向HTML提交區域性修改請求
request.delete() 向HTML提交刪除請求

1. requests.get()

requests.get()方法時常用方法之一,使用者獲取HTML。我們可以通過該方法連結其他方法,格式如下:

1 res = requests.get(url , params ,**kwargs)

引數說明見下表:

引數 描述
url 需要爬取的網站地址
params URL中的額外引數,字典或位元組流格式,為可選引數。
**kwargs
控制訪問引數,具體詳見下表。
**Kwargs的引數
引數名稱 描述
params 字典或位元組列,作為引數增加到url中,使用這個引數可以把一些鍵值對以?key=value1&key2=value2的模式增加到url中。
data 字典、列表或元組的位元組的檔案,作用是向伺服器提交資源,作為requests的內容。與params不同的是,data提交的資料並不放在URL連結中,而是放在URL連結對應位置的地方作為資料儲存。它也可以接受一個字串物件。
json

JSON格式的資料,json是HTTP中經常使用的資料格式,作為內容部分可以向伺服器提交。例如:

1 kv= {'key1':'value1'}
2 r = requests.request('POST',"http://python123.io/ws",json=kv)
headers

字典是HTTP的相關語,對應了向某URL訪問時發起的HTTP的頭欄位,可以用欄位來定義HTTP訪問的HTTP頭,可以用來模擬任何想模擬的瀏覽器對URL發起訪問。例如:

1 hd = {'user-agent':'Chrome/10'}
2 r = requests.requests('POST','http://python123.io/ws',headers=hd)
cookies 字典或CookieJar,指的是從HTTP中解析Cookie。
auth 元組,用來支援HTTP認證功能
files

字典,是用來向伺服器傳輸檔案時使用的欄位。例如

fs = {'files':open('data.txt','rb')}

timeout 用於設定超時時間,單位為秒,當發起一個GET請求時可以設定一個timeout時間,如果timeout時間內請求內容沒有返回,將產生一個timeout的異常。
proxies 字典,用來設定訪問代理伺服器。
allow_redirects 開關,表示是否允許對URL進行重定向,預設為True
stream 開關,指是否對獲取內容進行立即下載,預設為True。
verify 開關,用於認證SSL證書,預設為True。
cert 用於設定儲存本地SSL證書路徑。

前面的示例程式碼是構造一個伺服器請求requests,返回一個包含伺服器資源的Response物件。其中Request物件有以下屬性,如表3-3所示。

Response物件的屬性
屬性 說明
status_code HTTP請求的返回狀態,若為200表示請求成功
text HTTP響應內容的字串形式,即返回的頁面內容
encoding 從HTTP header中猜測的相應內容編碼方式
apparent_encoding 從內容中分析
content HTTP響應內容的二進位制形式

示例程式碼如下:

1 import  requests;
2 
3 url = 'https://www.baidu.com/';
4 r = requests.get(url);
5 print(r.status_code)
6 print(r.encoding)
7 print(r.apparent_encoding)
8 print(r.text)

執行結果如下圖:

2.requests庫的異常

requests庫有時會產生異常,如網路連線錯誤、HTTP錯誤異常、重定向異常、請求URL超時異常等。這裡可以利用r.raise_for_status()語句來捕捉異常,該語句在方法內部判斷r.status_code是否等於200,如果不等於,則丟擲異常,示例程式碼如下。

 1 import requests
 2 
 3 url = 'https://www.baidu.com/';
 4 try:
 5     r = requests.get(url , timeout=30)  # 請求超時時間為30s
 6     r.raise_for_status()    # 如果狀態不是200則引發異常
 7     r.encoding = r.apparent_encoding # 配置編碼
 8     print(r.text)
 9     print(1)
10 except:
11     print("產生異常")

3. requests.head()

通過requests.head()方法,可以獲取地址的header頭部資訊,示例程式碼如下:

1 import requests
2 
3 url = 'https://www.baidu.com/';
4 r = requests.head(url)
5 print(r.headers)

4. requests.post()

requests.post()反覆一般用於表單提交,向指定URL提交資料,可提交字串、字典、檔案等資料,示例程式碼如下:

 1 import  requests
 2 
 3 # 向url post 一個字典
 4 payload = {"key1":"value1","key2":"value2"}
 5 r = requests.post("http://httpbin.org/post",data=payload) # 這裡的url 並非真實的請求
 6 print(r.text)
 7 
 8 # 向url post 一個字串,自動編碼為data
 9 r = requests.post("http://httpbin.org/post",data="hello") # 這裡的url 並非真實的請求
10 print(r.text)

5. requests.put()和requests.patch()

requests。patch()和reques.put()類似,兩者不同的是:當patch時,僅需提交修改的欄位,但put時,必須將20個欄位一起提交到URL,未提交的欄位將會刪除;patch的優點是節省網路頻寬,示例程式碼如下:

 1 import  requests
 2 
 3 # requests.put
 4 payload = {"key1":"value1","key2":"value2"}
 5 r = requests.put("http://httpbin.org/put",data=payload) # 這裡的url 並非真實的請求
 6 print(r.text)
 7 
 8 # requests.post
 9 payload = {"key1":"value1","key2":"value2"}
10 r = requests.patch("http://httWpbin.org/patch",data=payload) # 這裡的url 並非真實的請求
11 print(r.text)
有志者,事竟成,破釜沉舟,百二秦關終屬楚; 苦心人,天不負,臥薪嚐膽,三千越甲可吞吳。