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

以前的文章咱們作了一個簡單的例子爬取了百度首頁的 html,咱們用到的是 urlopen 來打開請求,它是一個特殊的opener(也就是模塊幫咱們構建好的)。可是基本的 urlopen() 方法不支持代理、cookie等其餘的HTTP/HTTPS高級功能,因此咱們須要用到 Python 的 opener 來自定義咱們的請求內容。html

具體步驟:服務器

  1. 使用相關的 Handler處理器 來建立特定功能的處理器對象;
  2. 而後經過 build_opener()方法使用這些處理器對象,建立自定義opener對象;
  3. 使用自定義的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

能夠看出在響應結果的時候會爲咱們打印輸出一些請求信息。

相關文章
相關標籤/搜索