Python爬蟲(3):Requests的高階用法
上一篇文章我們整理了Requests
庫的基本用法,相信大家已經經過爬取一些簡單網頁的練習,已經很熟練了。
這一篇文章我們來 看一下Requests
庫的高階操作。
高階操作
1.檔案上傳
import requests files = { 'file' : open ( 'logo.gif' , 'rb' )} print (resp.text) |
檔案上傳的操作只要我們從資料夾中把檔案讀取出來,並且賦值給 files 引數,就可以了,打印出原始碼我們就可以看待上傳檔案的位元組流了。
2.獲取Cookie
>>> import requests >>> print (resp.cookies) <RequestsCookieJar[]> >>> for key, value in resp.cookies.items(): ... print (key + '=' + value) BDORZ = 27315 |
我們可以通過獲取字典的鍵值對來檢視cookie
.
3.會話維持
我們獲得到了cookie
就可以做一個會話維持,可以維持一個登入的狀態,也就是做模擬登入。我們來看實現方式:
這就相當於模擬了一個會話,比如做登陸驗證,可以用session
,POST 一下,登陸一下,然後保持會話資訊,在訪問登入過頁面的話,就可以正常獲取登入後的頁面了。如果你要模擬登入,可以通過申明Session
物件,再用Session
物件發起兩次get請求,那麼這兩次請求相當於在一個瀏覽器裡面,先訪問set cookie
get cookie
頁面。當然,cookie
是自動處理的,不需要擔心寫一些處理cookies
的方法。建議模擬登入用requests
的Session
物件。
4.SSL證書驗證
Requests
可以為 HTTPS 請求驗證 SSL 證書,就像 web瀏覽器一樣。要想檢查某個主機的 SSL證書,你可以使用 verify引數:
>>> import requests >>>requests.get( , verify = True ) # verify引數預設值為True requests.exceptions.SSLError: hostname 'kennethreitz.com' doesn 't match either of ' * .herokuapp.com ', ' herokuapp.com' |
如果不想他報這個錯誤,我們可以把引數verify
的值設為False
.執行後發現程式沒有報錯,但是會出現警告資訊,警告我們要驗證 SSL證書。如果要消除這個警告,我們需要呼叫原生包:
>>> import requests >>> from requests.packages import urllib3 urllib3.disable_warnings() |
我們還可以自己指定一個證書:
>>> import requests >>>resp = requests.get( , cert = ( '/path/server.crt' , '/path/key' )) >>> print (resp.status_code) 200 |
5.代理設定
有些網站會限制 IP 訪問頻率,超過頻率就斷開連線。這個時候我們就需要使用到代理,我們可以通過為任意請求方式提供proxies
引數來配置單個請求。
import requests proxies = { } resp = requests.get( , proxies = proxies) print (resp.status_code) |
也可以通過環境變數 HTTP_PROXY
和 HTTPS_PROXY
來配置代理。
有些代理需要加上使用者名稱和密碼的,代理可以使用http://user:[email protected]/
語法,比如:
除了基本的 HTTP代理,Requests
還支援SOCKS
協議的代理,如果需要用的,可以安裝帶三方庫:
$ pip install requests[socks] |
安裝好依賴以後,使用 SOCKS 代理和使用 HTTP 代理一樣簡單:
6.超時設定
超時設定就是設定請求的時間,如果在規定的時間內沒有返回應答,就丟擲異常.
import requests resp = requests.get( , timeout = 0.5 ) print (resp.status_code) |
如果在0.5秒內沒有返回,就會報出ReadTimeout
的異常。
如果遠端伺服器很慢,你可以讓Request
永遠等待,傳入一個None
作為timeout
值,然後就衝咖啡去吧。
7.認證設定
有一些網站在訪問的時候需要我們輸入使用者名稱和密碼,那麼這種網站我們要怎樣處理呢。
import requests from requests.auth import HTTPBasicAuth resp = requests.get(url, auth = HTTPBasicAuth( 'username' , 'password' )) print (resp.status_code) |
呼叫HTTPBasicAuth
類,直接傳入使用者名稱和密碼就可以了。
8.異常處理
如果你遇到無法訪問的網站,或者是你的網速不夠快,你的訪問超時,就會導致程式的中斷。顯然我們在實際的抓取中不願意看到爬取到一半的程式突然中斷的情況,那麼我們能夠避免這種程式中斷的情況嗎,答案是肯定的:
import requests from requests.exceptions import ReadTimeout, ConnectionError, RequestException try : resp = requests.get( , timeout = 0.5 ) print (resp.status_code) except ReadTimeout: # 訪問超時的錯誤 print ( 'Timeout' ) except ConnectionError: # 網路中斷連線錯誤 print ( 'Connect error' ) except RequestException: # 父類錯誤 print ( 'Error' ) |
這樣我們就可以把requests
抓取過程中常見的異常都處理捕獲了,捕獲錯誤應該先捕獲子類異常在捕獲父類異常,這樣做能夠更加直觀清楚的應對程式中出現的錯誤了。
如果我們能夠自己捕獲了這些異常,就可以保證我們的爬蟲一直運行了。
好了,Requests
的大部分用法已經全部說完了,大家是否已經學會了這門屠龍之術了呢。快找個網頁練練手吧。
系列文章