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 |
控制訪問參數,具體詳見下表。 |
參數名稱 | 描述 |
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所示。
屬性 | 說明 |
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)