首頁 後端開發 Python教學 [Python]網路爬蟲(四):Opener與Handler的介紹與實例應用

[Python]網路爬蟲(四):Opener與Handler的介紹與實例應用

Jan 21, 2017 pm 01:50 PM

在開始後面的內容之前,先來解釋一下urllib2中的兩個個方法:info and geturl 

urlopen回傳的應答物件response(或HTTPError實例)有兩個很有用的方法info()和geturl()

1.geturl():

這個返回獲取的真實的URL,這個很有用,因為urlopen(或opener物件使用的)或許會有重定向。取得的URL或許跟請求URL不同。

以人人中的一個超級連結為例,


我們建造一個urllib2_test10.py來比較一下原始URL和重定向的連結:

from urllib2 import Request, urlopen, URLError, HTTPError  
  
  
old_url = 'http://rrurl.cn/b1UZuP'  
req = Request(old_url)  
response = urlopen(req)    
print 'Old url :' + old_url  
print 'Real url :' + response.geturl()
登入後複製

運行之後可以看到真正的連結指向的網址:

[Python]網路爬蟲(四):Opener與Handler的介紹與實例應用

2.info():

這個返回對象的字典對象,該字典描述了獲取的頁面情況。通常是伺服器發送的特定頭headers。目前是httplib.HTTPMessage 實例。

經典的headers包含"Content-length","Content-type",和其他內容。


我們建造一個urllib2_test11.py來測試一下info的應用:

from urllib2 import Request, urlopen, URLError, HTTPError  
  
old_url = 'http://www.baidu.com'  
req = Request(old_url)  
response = urlopen(req)    
print 'Info():'  
print response.info()
登入後複製

運行的結果如下,可以看到頁面的相關資訊:

[Python]網路爬蟲(四):Opener與Handler的介紹與實例應用

重要概念:Openers和Handlers。

1.Openers:

當你取得一個URL你使用一個opener(一個urllib2.OpenerDirector的實例)。

正常情況下,我們使用預設opener:透過urlopen。

但你能夠創造個性的openers。

2.Handles:

Openers使用處理器handlers,所有的「繁重」工作由handlers處理。

每個handlers知道如何透過特定協定開啟URLs,或如何處理URL開啟時的各個方面。

例如HTTP重定向或HTTP cookies。


如果你希望用特定處理器取得URLs你會想要建立一個openers,例如取得一個能處理cookie的opener,或是取得一個不重定向的opener。


要建立一個 opener,可以實例化一個OpenerDirector,

然後呼叫.add_handler(some_handler_instance)。

同樣,可以使用build_opener,這是一個更方便的函數,用來建立opener對象,他只需要一次函數呼叫。
build_opener預設添加幾個處理器,但提供快速的方法來新增或更新預設處理器。

其他的處理器handlers你或許會希望處理代理,驗證,和其他常用但有點特殊的情況。


install_opener 用來建立(全域)預設opener。這個表示調用urlopen將使用你安裝的opener。

Opener物件有一個open方法。

該方法可以像urlopen函數那樣直接用來取得urls:通常不必呼叫install_opener,除了為了方便。


說完了上面兩個內容,下面我們來看一下基本認證的內容,這裡會用到上面提及的Opener和Handler。

Basic Authentication 基本驗證

為了展示創建和安裝一個handler,我們將使用HTTPBasicAuthHandler。

當需要基礎驗證時,伺服器發送一個header(401錯誤碼) 請求驗證。這個指定了scheme 和一個'realm',看起來像這樣:Www-authenticate: SCHEME realm="REALM".

例如
Www-authenticate: Basic realm="cPanel Users"

請求,並在請求頭裡包含正確的姓名和密碼。

這是“基礎驗證”,為了簡化這個過程,我們可以創建一個HTTPBasicAuthHandler的實例,並讓opener使用這個handler就可以啦。


HTTPBasicAuthHandler使用一個密碼管理的物件來處理URLs和realms來對應使用者名稱和密碼。

如果你知道realm(從伺服器發送來的頭裡)是什麼,你就能使用HTTPPasswordMgr。


通常人們不關心realm是什麼。那樣的話,就能用方便的HTTPPasswordMgrWithDefaultRealm。

這個將在你為URL指定一個預設的使用者名稱和密碼。

這將在你為特定realm提供一個其他組合時得到提供。

我們透過給realm參數指定None提供給add_password來指示這種情況。


最高層次的URL是第一個要求驗證的URL。你傳給.add_password()更深層的URLs將同樣合適。

說了這麼多廢話,以下來用一個範例示範上面說到的內容。


我們建一個urllib2_test12.py來測試一下info的應用:

# -*- coding: utf-8 -*-  
import urllib2  
  
# 创建一个密码管理者  
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()  
  
# 添加用户名和密码  
  
top_level_url = "http://example.com/foo/"  
  
# 如果知道 realm, 我们可以使用他代替 ``None``.  
# password_mgr.add_password(None, top_level_url, username, password)  
password_mgr.add_password(None, top_level_url,'why', '1223')  
  
# 创建了一个新的handler  
handler = urllib2.HTTPBasicAuthHandler(password_mgr)  
  
# 创建 "opener" (OpenerDirector 实例)  
opener = urllib2.build_opener(handler)  
  
a_url = 'http://www.baidu.com/'  
  
# 使用 opener 获取一个URL  
opener.open(a_url)  
  
# 安装 opener.  
# 现在所有调用 urllib2.urlopen 将用我们的 opener.  
urllib2.install_opener(opener)
登入後複製

注意:以上的例子我們只提供我們的HHTPBasicAuthHandler給build_opener。

預設的openers有正常狀況的handlers:ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler,FTPHandler, FileHandler, HTTPErrorProcessor。

程式碼中的top_level_url 其實可以是完整URL(包含"http:",以及主機名稱及可選的連接埠號碼)。


例如:http://example.com/。

也可以是一個「authority」(即主機名稱和可選的包含連接埠號碼)。

例如:「example.com」 or “example.com:8080”。

後者包含了連接埠號碼。

以上是 [Python]網路爬蟲(四):Opener與Handler的介紹和實例應用的內容,更多相關內容請關注PHP中文網(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何利用React和Python建立強大的網路爬蟲應用 如何利用React和Python建立強大的網路爬蟲應用 Sep 26, 2023 pm 01:04 PM

如何利用React和Python建立強大的網路爬蟲應用引言:網路爬蟲是一種自動化程序,用於透過網路抓取網頁資料。隨著網路的不斷發展和數據的爆炸性增長,網路爬蟲越來越受歡迎。本文將介紹如何利用React和Python這兩種流行的技術,建構一個強大的網路爬蟲應用。我們將探討React作為前端框架,Python作為爬蟲引擎的優勢,並提供具體的程式碼範例。一、為

使用Vue.js和Perl語言開發高效的網路爬蟲和資料抓取工具 使用Vue.js和Perl語言開發高效的網路爬蟲和資料抓取工具 Jul 31, 2023 pm 06:43 PM

使用Vue.js和Perl語言開發高效的網路爬蟲和資料抓取工具近年來,隨著網路的快速發展和資料的日益重要,網路爬蟲和資料抓取工具的需求也越來越大。在這個背景下,結合Vue.js和Perl語言開發高效率的網路爬蟲和資料抓取工具是個不錯的選擇。本文將介紹如何使用Vue.js和Perl語言開發這樣一個工具,並附上對應的程式碼範例。一、Vue.js和Perl語言的介

網路爬蟲是什麼 網路爬蟲是什麼 Jun 20, 2023 pm 04:36 PM

網路爬蟲(也稱為網路蜘蛛)是一種在網路上搜尋和索引內容的機器人。從本質上講,網路爬蟲負責理解網頁上的內容,以便在進行查詢時檢索它。

如何使用PHP來寫一個簡單的網路爬蟲 如何使用PHP來寫一個簡單的網路爬蟲 Jun 14, 2023 am 08:21 AM

網路爬蟲是一種自動化程序,能夠自動存取網站並抓取其中的資訊。這種技術在現今的網路世界中越來越常見,被廣泛應用於資料探勘、搜尋引擎、社群媒體分析等領域。如果你想了解如何使用PHP編寫簡單的網路爬蟲,本文將會為你提供基本的指導和建議。首先,需要了解一些基本的概念和技術。爬取目標在編寫爬蟲之前,需要選擇爬取的目標。這可以是一個特定的網站、一個特定的網頁、或整個互

PHP 網路爬蟲之 HTTP 請求方法詳解 PHP 網路爬蟲之 HTTP 請求方法詳解 Jun 17, 2023 am 11:53 AM

隨著網路的發展,各種各樣的數據變得越來越容易取得。而網路爬蟲作為一種獲取數據的工具,越來越受到人們的關注與重視。在網路爬蟲中,HTTP請求是一個重要的環節,本文將詳細介紹PHP網路爬蟲常見的HTTP請求方法。一、HTTP請求方法HTTP請求方法是指客戶端向伺服器傳送請求時,所使用的請求方法。常見的HTTP請求方法有GET、POST、PU

如何使用PHP和swoole進行大規模的網路爬蟲開發? 如何使用PHP和swoole進行大規模的網路爬蟲開發? Jul 21, 2023 am 09:09 AM

如何使用PHP和swoole進行大規模的網路爬蟲開發?引言:隨著網路的快速發展,大數據已成為當今社會的重要資源之一。為了獲得這些寶貴的數據,網路爬蟲應運而生。網路爬蟲可以自動化地存取網路上的各種網站,並從中提取所需的資訊。在本文中,我們將探討如何使用PHP和swoole擴充來開發高效能的、大規模的網路爬蟲。一、了解網路爬蟲的基本原理網路爬蟲的基本原理很簡

PHP 簡單網頁爬蟲開發實例 PHP 簡單網頁爬蟲開發實例 Jun 13, 2023 pm 06:54 PM

隨著網路的快速發展,數據已成為了當今資訊時代最為重要的資源之一。而網路爬蟲作為一種自動化獲取和處理網路數據的技術,也越來越受到人們的關注和應用。本文將介紹如何使用PHP開發簡單的網路爬蟲,並實現自動化取得網路資料的功能。一、網路爬蟲概述網路爬蟲是一種自動化取得和處理網路資源的技術,其主要工作流程是模擬瀏覽器行為,自動存取指定的URL位址並提取所

PHP中如何進行網路爬蟲和資料抓取? PHP中如何進行網路爬蟲和資料抓取? May 20, 2023 pm 09:51 PM

隨著網路時代的到來,網路資料的爬取與抓取已成為許多人的日常工作。在支援網頁開發的程式語言中,PHP以其可擴展性和易上手的特點,成為了網路爬蟲和資料抓取的熱門選項。本文將從以下幾個面向介紹PHP如何進行網路爬蟲和資料抓取。一、HTTP協定和請求實作在進行網路爬蟲和資料抓取之前,需要對HTTP協定和請求的實作有一定的了解。 HTTP協定是基於請求回應模型的,抓

See all articles