1. 程式人生 > >Python爬蟲基礎 | (一)爬蟲基本庫的使用

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

本篇部落格所有示例使用Jupyter NoteBook演示。

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

示例程式碼  下載密碼:02f4

 

目錄

一、簡介

二、使用urllib

1.使用urllib的request模組傳送請求

2.處理異常

3.解析連結

4.分析Robots協議

二、使用requests

1.基本用法

2.高階用法

三、正則表示式

四、實戰:使用Requests和正則表示式爬取貓眼電影排行


一、簡介

爬蟲最初的操作便是模擬瀏覽器向伺服器傳送請求,這方面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

更多資訊檢視官方文件

  • 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

也可以通過下面的方式新增請求頭:

  • 高階用法

對於一些高階操作,如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模組更多功能

2.處理異常

3.解析連結

4.分析Robots協議

二、使用requests

1.基本用法

2.高階用法

三、正則表示式

四、實戰:使用Requests和正則表示式爬取貓眼電影排行