以前的文章咱們作了一個簡單的例子爬取了百度首頁的 html,咱們用到的是 urlopen 來打開請求,它是一個特殊的opener(也就是模塊幫咱們構建好的)。可是基本的 urlopen() 方法不支持代理、cookie等其餘的HTTP/HTTPS高級功能,因此咱們須要用到 Python 的 opener 來自定義咱們的請求內容。html
具體步驟:服務器
Handler處理器
來建立特定功能的處理器對象;build_opener()
方法使用這些處理器對象,建立自定義opener對象;open()
方法發送請求。咱們先來回顧一下使用 urlopen 獲取百度首頁的 html 代碼實例:cookie
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 的處理方式:ui
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 來使用就能夠了。url
第一段代碼在前面的文章中咱們已經說過了,這裏就很少作解釋了。spa
第二段代碼中,咱們使用了 opener 的方法來處理咱們的請求,這樣咱們就能夠對代理,cookie 等作進一步的操做,後續文章會講到。最終結果以下:debug
在 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)
輸出結果以下:code
能夠看出在響應結果的時候會爲咱們打印輸出一些請求信息。