Python爬蟲基礎 | (一)爬蟲基本庫的使用

本篇博客所有示例使用Jupyter NoteBook演示。

Python爬蟲基礎系列筆記基於:Python3網絡爬蟲開發實戰-崔慶才  下載密碼wuuc

示例代碼  下載密碼:02f4

 

一、簡介

爬蟲最初的操作便是模擬瀏覽器向服務器發送請求,這方面Python提供了功能齊全的類庫幫我們完成這些請求。

最基礎的HTTP請求庫有urllib、httplib2、requests、treq等。

有了這些庫,我們只需要關心請求的鏈接是什麼,需要傳什麼參數,以及設置可選的請求頭就行;不必瞭解底層的傳輸和通信,便可以通過請求和相應得到網頁內容。

二、使用urllib

Python3 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的父類,接下來是他的一些子類:

其他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文件並利用:

urllib.request模塊更多功能

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章