Python 爬蟲從入門到進階之路(四)
阿新 • • 發佈:2019-06-24
之前的文章我們做了一個簡單的例子爬取了百度首頁的 html,我們用到的是 urlopen 來開啟請求,它是一個特殊的opener(也就是模組幫我們構建好的)。但是基本的 urlopen() 方法不支援代理、cookie等其他的HTTP/HTTPS高階功能,所以我們需要用到 Python 的 opener 來自定義我們的請求內容。
具體步驟:
- 使用相關的
Handler處理器
來建立特定功能的處理器物件; - 然後通過
build_opener()
方法使用這些處理器物件,建立自定義opener物件; - 使用自定義的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