1. 程式人生 > >Python 爬蟲從入門到進階之路(四)

Python 爬蟲從入門到進階之路(四)

之前的文章我們做了一個簡單的例子爬取了百度首頁的 html,我們用到的是 urlopen 來開啟請求,它是一個特殊的opener(也就是模組幫我們構建好的)。但是基本的 urlopen() 方法不支援代理、cookie等其他的HTTP/HTTPS高階功能,所以我們需要用到 Python 的 opener 來自定義我們的請求內容。

具體步驟:

  1. 使用相關的 Handler處理器 來建立特定功能的處理器物件;
  2. 然後通過 build_opener()方法使用這些處理器物件,建立自定義opener物件;
  3. 使用自定義的opener物件,呼叫open()方法傳送請求。

我們先來回顧一下使用 urlopen 獲取百度首頁的 html 程式碼例項:

 1 # 匯入urllib 庫
 2 import urllib.request
 3 
 4 # url 作為Request()方法的引數,構造並返回一個Request物件
 5 request = urllib.request.Request("http://www.baidu.com")
 6 # Request物件作為urlopen()方法的引數,傳送給伺服器並接收響應
 7 response = urllib.request.urlopen(request)
 8 # 類檔案物件支援 檔案物件的操作方法,如read()方法讀取檔案全部內容,返回字串
 9 html = response.read().decode("utf-8")
10 # 列印字串
11 print(html)

接下來我們看一下使用 opener 的處理方式:

 1 from urllib import request
 2 
 3 # 構建一個HTTPHandler 處理器物件,支援處理HTTP請求
 4 http_handler = request.HTTPHandler()
 5 
 6 # 構建一個HTTPSHandler 處理器物件,支援處理HTTPS請求
 7 # http_handler = request.HTTPSHandler()
 8 
 9 # 呼叫 request.build_opener()方法,建立支援處理HTTP請求的opener物件
10 opener = request.build_opener(http_handler)
11 
12 # 構建 Request請求
13 request = request.Request("http://www.baidu.com/")
14 
15 # 呼叫自定義opener物件的open()方法,傳送request請求
16 response = opener.open(request)
17 
18 # 獲取伺服器響應內容
19 html = response.read().decode("utf-8")
20 
21 # 列印字串
22 print(html)

 

在上面的第一段程式碼中,我們是通過直接  import urllib.request   來匯入我們需要的包,這樣當我們要使用時需要   urllib.request   來使用,第二段程式碼我們是通過  from urllib import request  來匯入我們需要的包,這樣當我們使用時直接  request 來使用就可以了。

第一段程式碼在前面的文章中我們已經說過了,這裡就不多做解釋了。

第二段程式碼中,我們使用了 opener 的方法來處理我們的請求,這樣我們就可以對代理,cookie 等做進一步的操作,後續文章會講到。最終結果如下:

在  http_handler = request.HTTPHandler() 中,我們還可以新增一個  debuglevel=1 引數,會將 Debug Log 開啟,這樣程式在執行的時候,會把收包和發包的報頭在螢幕上自動打印出來,方便除錯,有時可以省去抓包的工作。

程式碼如下:

 1 from urllib import request
 2 
 3 # 構建一個HTTPHandler 處理器物件,支援處理HTTP請求
 4 http_handler = request.HTTPHandler(debuglevel=1)
 5 
 6 # 構建一個HTTPHandler 處理器物件,支援處理HTTPS請求
 7 # http_handler = request.HTTPSHandler(debuglevel=1)
 8 
 9 # 呼叫 request.build_opener()方法,建立支援處理HTTP請求的opener物件
10 opener = request.build_opener(http_handler)
11 
12 # 構建 Request請求
13 request = request.Request("http://www.baidu.com/")
14 
15 # 呼叫自定義opener物件的open()方法,傳送request請求
16 response = opener.open(request)
17 
18 # 獲取伺服器響應內容
19 html = response.read().decode("utf-8")
20 
21 # 列印字串
22 print(html)

輸出結果如下:

可以看出在響應結果的時候會為我們列印輸出一些請求資訊。

&n