本篇博客所有示例使用Jupyter NoteBook演示。
Python爬蟲基礎系列筆記基於:Python3網絡爬蟲開發實戰-崔慶才 下載密碼:wuuc
示例代碼 下載密碼:02f4
一、簡介
爬蟲最初的操作便是模擬瀏覽器向服務器發送請求,這方面Python提供了功能齊全的類庫幫我們完成這些請求。
最基礎的HTTP請求庫有urllib、httplib2、requests、treq等。
有了這些庫,我們只需要關心請求的鏈接是什麼,需要傳什麼參數,以及設置可選的請求頭就行;不必瞭解底層的傳輸和通信,便可以通過請求和相應得到網頁內容。
二、使用urllib
urllib有四個模塊:
1)request:用來模擬發送請求。只需給方法傳遞url和其他參數,便可以模擬瀏覽器訪問網頁了。
2)error:異常處理模塊,可以捕捉請求時出現的錯誤,然後進行重試或其他操作保證程序不會意外終止。
3)parse:提供了很多url的處理方法,如拆分、解析、合併等。
4)robotparser:識別網站robots.txt文件,判斷哪些網站可以爬,哪些不可以。
1.使用urllib的request模塊發送請求
- urlopen()
爬取Python官網:
得到網頁源碼後,我們想要的鏈接、文本、圖片地址等信息就可以提取出來了。
利用type()查看返回的是什麼:
可以發現返回的是一個HTTPResponse類型的對象,主要包含read(),readinto(),getheader(name),getheaders(),fileno()等方法;以及msg,version,status,reason,debuglevel,closed等屬性。
調用read()可以得到網頁源碼,status屬性可以得到請求狀態碼,200爲成功,404爲找不到網頁:
urlopen()函數的API:
第一個參數時請求網頁的url;data參數附加數據;timeout參數設置超出時間。
1)data參數:
可選參數。
如果要添加data參數,需要用bytes()將參數轉碼成字節流。
如果傳遞了data參數,請求方式就不再是GET,而是POST。
bytes方法的第一個參數需要是字符串類型,用urllib.parse模塊中的urlencode()將參數字典轉換爲字符串;第二個參數指定編碼格式utf-8.
url:http://httpbin.org/post可以測試POST請求,可以輸出請求的一些信息,包含我們傳遞的data參數。
傳遞的參數出現在了form字段中,表明模擬表單提交的方式,以POST方式傳輸數據。
2)timeout參數
用於設置超時時間,單位秒。如果超過了設置的時間,還沒有得到響應,就會拋出異常。
如果不指定,使用默認時間。
超時時間爲0.1s,0.1s後,服務器沒有響應,就會拋出URLError異常,它屬於urllib.error模塊,原因是超時。
可以設置超時時間來控制一個網頁如果長時間沒有響應,就跳過抓取其他網頁:
3)其他參數
context參數:必須是ssl.SSLContext類型,指定SSL設置。
cafile和capath分別指定CA證書和路徑,在請求HTTPS鏈接時會有用。
cadefault:棄用,默認值False
2.Request()
urlopen()可以實現最基本的請求,但參數太簡單。
如果請求中需要加入Headers等信息,需要用更強大的Request來創建:
依然調用urlopen()發送請求,只不過參數不再是簡單的url,而是一個Request對象。
這樣一方面可以將請求獨立成一個對象;另一方面可以更靈活的配置參數。
Request的構造方法:
第一個參數必填,其他可選,=後爲可選參數的默認值。
url:待請求網頁的url
data:必須是字節流類型;如果是字典,先轉換爲字符串
headers:請求頭,是一個字典;構造請求頭時可以通過headers參數直接構造,也可以調用請求實例的add_header()添加;添加請求頭一般通過修改User-Agent來僞裝瀏覽器,默認值爲Python-urllib,如要僞裝火狐,可以把其值設置爲:
origin_req_host:請求方的host名稱或ip地址
unverifiable:請求是否無法驗證,默認False,用戶沒有足夠權限來選擇接收這個請求的結果。如,我們請求一個HTML中的圖片,我們沒有自動抓取圖像的權限,此時其值就是True。
method:一個字符串,表示請求的方法,如GET、POST、PUT
也可以通過下面的方式添加請求頭:
3.高級用法
對於一些高級操作,如Cookies處理、代理設置等,我們需要使用Handler。
可以把它理解爲各種處理器,有專門處理登陸驗證的,有處理Cookies的,有處理代理的。
urllib.request模塊中的BaseHandler類是所有Handler的父類,接下來是他的一些子類:
另一個重要的類是OpenerDirectory,成爲Opener。Opener可以使用open方法,返回類型和urlopen()一樣。
我們可以利用Handler來構建Opener。
具體用法:
1)驗證
有些網站打開時,會提示你輸入用戶名和密碼,驗證成功後纔可以查看:
此時需要藉助HTTPBasicAuthHandler完成:
首先實例化HTTPBasicAuthHandler對象,參數爲HTTPPasswordMgrWithDefaultRealm對象,他用add_password()添加用戶名和密碼,從而建立一個處理驗證的Handler。
利用build_opener()爲這個handler構建一個opener,opener發送請求時相當於驗證成功。
利用opener的open()方法打開鏈接,完成驗證,獲取源碼。
2)代理
添加代理可以這麼做:
本地搭建一個代理,運行在9743端口上。
ProxyHandler參數是一個字典,鍵值爲協議類型,名爲代理鏈接,可以添加多個代理。
利用build_opener爲這個handler構建一個opener,之後調用open()請求網頁。
3)Cookies
獲取網頁的Cookies:
輸出成文件格式:
文件內容:
保存爲LWP格式的Cookie文件:
文件內容:
讀取Cookie文件並利用: