1. 程式人生 > >[Python]網路爬蟲(四):Opener與Handler

[Python]網路爬蟲(四):Opener與Handler

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

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

1.geturl():

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

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

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

  1. from urllib2 import Request, urlopen, URLError, HTTPError  
  2. old_url = 'http://rrurl.cn/b1UZuP'
  3. req = Request(old_url)  
  4. response = urlopen(req)    
  5. print'Old url :' + old_url  
  6. print'Real url :' + response.geturl()  
執行之後可以看到真正的連結指向的網址:



2.info():

info()返回物件的字典物件,該字典描述了獲取的頁面情況。通常是伺服器傳送的特定頭headers。

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

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

  1. from urllib2 import Request, urlopen, URLError, HTTPError  
  2. old_url = 'http://www.baidu.com'
  3. req = Request(old_url)  
  4. response = urlopen(req)    
  5. print'Info():'
  6. print response.info()  
執行的結果如下,可以看到頁面的相關資訊:

下面來說一說urllib2中的兩個重要概念:Openers和Handlers

一、opener

       urllib2.urlopen()函式不支援驗證、cookie或者其它HTTP高階功能。要支援這些功能,必須使用build_opener()(可以用於讓python程式模擬瀏覽器進行訪問,作用你懂得~)函式建立自定義Opener物件。

       用法如下

build_opener([handler1 [ handler2, ... ]])
      引數handler是Handler例項,常用的有HTTPBasicAuthHandler、HTTPCookieProcessor、ProxyHandler等。
      build_opener ()返回的物件具有open()方法,與urlopen()函式的功能相同。
      如果要修改http報頭,可以用:
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')

install_opener(opener)

安裝不同的opener物件作為urlopen()使用的全域性opener。

密碼驗證(HTTPBasicAuthHandler)

HTTPBasicAuthHandler()處理程式可用add_password()來設定密碼。

h.add_password(realm,uri,user,passwd)
realm是與驗證相關聯的名稱或描述資訊,取決於遠端伺服器。uri是基URL。user和passwd分別指定使用者名稱和密碼。
import urllib2
auth=urllib2.HTTPBasicAuthHandler()
auth.add_password('Administrator','http://www.example.com','Dave','123456')
opener=urllib2.build_opener(auth)
u=opener.open('http://www.example.com/evilplan.html')

Cookie處理(HTTPCookieProcessor)

import urllib2,cookielib
cookie=cookielib.CookieJar()
cookiehand=urllib2.HTTPCookieProcessor(cookie)
opener=urllib2.build_opener(cookiehand)

代理(ProxyHandler)

ProxyHandler(proxies)引數proxies是一個字典,將協議名稱(http,ftp)等對映到相應代理伺服器的URL。

proxy=ProxyHandler({'http':'http://someproxy.com:8080'})
auth=HTTPBasicAuthHandler()
auth.add_password()
opener=build_opener(auth,proxy)
也可以在urlopen中使用代理
import urllib2  
proxy = 'http://%s:%[email protected]%s' % ('userName', 'password', 'proxy')  
inforMation = urllib2.urlopen("http://www.example.com", proxies={'http':proxy})  

二、Handler

handler用於處理URL,例如HTTP重定向、HTTP cookies等。
如果你希望建立一個特定的openers,例如獲取一個能處理cookie的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。


程式碼如下:

  1. # -*- coding: utf-8 -*-
  2. import urllib2  
  3. # 建立一個密碼管理
  4. password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()  
  5. # 新增使用者名稱和密碼
  6. top_level_url = "http://example.com/foo/"
  7. password_mgr.add_password(None, top_level_url,'why''1223')  
  8. # 建立了一個新的handler
  9. handler = urllib2.HTTPBasicAuthHandler(password_mgr)  
  10. # 建立 "opener" (OpenerDirector 例項)
  11. opener = urllib2.build_opener(handler)  
  12. a_url = 'http://www.baidu.com/'
  13. # 使用 opener 獲取一個URL
  14. opener.open(a_url)  
  15. # 安裝 opener.
  16. # 現在所有呼叫 urllib2.urlopen 將用我們的 opener.
  17. urllib2.install_opener(opener)  

注意:除了HHTPBasicAuthHandler以外,ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler,FTPHandler, FileHandler, HTTPErrorProcessor均會返回Handler

歡迎收聽我的微信公眾號 

相關推薦

[Python]網路爬蟲OpenerHandler

在開始後面的內容之前,先來解釋一下urllib2中的兩個個方法:info and geturl  urlopen返回的應答物件response(或者HTTPError例項)有兩個很有用的方法info()和geturl() 1.geturl(): geturl()返回獲

Python網路爬蟲視訊下載器

這一節實現一個下載 iqiyi VIP視訊的爬蟲。 需要的準備:旋風視訊VIP解析網站或其他解析網站 原理理解: 在視訊解析網站獲取視訊的過程中,首先會向視訊伺服器傳送GET請求,獲得伺服器發來的資訊;接到資訊後,再向伺服器POST資料,即將類似於密碼

Python網路爬蟲selenium+chrome爬取美女圖片

說明: Python版本:Python IDE:PyCharm chrome版本:我的版本63 chromedriver.exe:因為是模擬瀏覽器訪問,chrome需要再下載一個驅動,具體方式在我的上一篇部落格,內容很詳細。傳送門:Python網路爬蟲(

[Python]網路爬蟲抓取網頁的含義和URL基本構成

一、網路爬蟲的定義 網路爬蟲,即Web Spider,是一個很形象的名字。 把網際網路比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。 網路蜘蛛是通過網頁的連結地址來尋找網頁的。 從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它連結地址

[Python]網路爬蟲利用urllib2通過指定的URL抓取網頁內容

版本號:Python2.7.5,Python3改動較大,各位另尋教程。 所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地。  類似於使用程式模擬IE瀏覽器的功能,把URL作為HTTP請求的內容傳送到伺服器端, 然後讀取伺服器端的響應資源。 在

[Python]網路爬蟲urllib2的使用細節抓站技巧

前面說到了urllib2的簡單入門,下面整理了一部分urllib2的使用細節。 1.Proxy 的設定 urllib2 預設會使用環境變數 http_proxy 來設定 HTTP Proxy。 如果想在程式中明確控制 Proxy 而不受環境變數的影響,可以使用代理。

Python網路爬蟲chromdriver.exechrome版本對映及下載連結

前言:最近正在學習Python網路爬蟲,學到selenium,需要用到chrome瀏覽器的驅動,但是網上的很多地址都被牆了,而且沒有準確的驅動和chrome版本的對映,很麻煩。現在我已經解決了這些問題,現在把對映和下載連結分享出來。 (一)檢視chrome

Python網路爬蟲爬取頂點小說網站全部小說,並存入MongoDB

前言:本篇部落格將爬取頂點小說網站全部小說、涉及到的問題有:Scrapy架構、斷點續傳問題、Mongodb資料庫相關操作。 背景: Python版本:Anaconda3 執行平臺:Windows IDE:PyCharm 資料庫:MongoDB 瀏

[Python]網路爬蟲利用urllib通過指定的URL抓取網頁內容

1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=F

Python網路爬蟲解決ImportError:DLL load failed作業系統無法執行問題

背景: Python版本:Anaconda3 問題描述: 最近在執行scrapy專案時,本來安裝好好的scrapy框架突然報錯,猝不及防, ImportError:DLL load failed:作業系統無法執行%1 如圖: 自己也是百思

[Python]網路爬蟲使用cookiejar管理cookie 以及 模擬登入知乎

大家好哈,上一節我們研究了一下爬蟲的異常處理問題,那麼接下來我們一起來看一下Cookie的使用。 為什麼要使用Cookie呢? Cookie,指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密) 比如說有些網站需要登入後才

Python高階爬蟲動態載入頁面的解決方案爬蟲代理

*原創作者:VillanCh 0×00 前言 0×01 動態頁面解決方案Selenium+PhantomJS 0×02 原理回顧對比 0×03 Quick Start 0×04 webdriver API 0×05 匿名爬蟲 0×06 匿名爬蟲解決方案 0×07 完結總結

python爬蟲scrapy 【1. 快速上手】

中文文件:http://www.scrapyd.cn/doc/   Scrapy是採用Python開發的一個快速、高層次的螢幕抓取和web抓取框架。 什麼是爬蟲框架? 爬蟲框架是實現爬蟲功能的一個軟體結構和功能元件集合。 爬蟲框架是一個半成品,能夠幫助使用者實現專業網路

python爬蟲scrapy 【2. 其他重要部分】

中文文件:http://www.scrapyd.cn/doc/   本節包括: 1. resquest 和 response 的屬性方法 2. scrapy提取資訊的強大方法     request 和 response request:

網路爬蟲】【java】微博爬蟲資料處理——jsoup工具解析html、dom4j讀寫xml

        之前提到過,對於簡單的網頁結構解析,可以直接通過觀察法、手工寫正則解析,可以做出來,比如網易微博。但是對於結構稍微複雜點的,比如新浪微博,如果還用正則,用眼睛一個個去找,未免太麻煩了。         本文介紹兩個工具包:解析html, xml的jsoup,

網路爬蟲Python中的正則表示式教程

接下來準備用糗百做一個爬蟲的小例子。 但是在這之前,先詳細的整理一下Python中的正則表示式的相關內容。 正則表示式在Python爬蟲中的作用就像是老師點名時用的花名冊一樣,是必不可少的神兵利器。 整理時沒有注意,實在抱歉。 一、 正則表示式基礎 1.1.概

python網路爬蟲

網路爬蟲之前奏 網路爬蟲之規則 Requests庫入門 requests庫的安裝 requests的詳細資訊 Win平臺: “以管理員身份執行” cmd,執行pip3 install requests。 requests庫安裝成功與否的測試

Windows網路程式設計建立UDP連線和收發訊息

UDP訊息的傳送和接收需要UDP連線,所以,上面的TCP連線已經不適用了,具體的區別主要有: 建立Socket時引數不同建立服務端時不需要listen和accept操作建立客戶端時不需要connect操作伺服器需要bind操作,客戶端不需要。 傳送和接收UDP訊息要用到sendt

手把手教你寫網路爬蟲2迷你爬蟲架構

語言&環境 有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~ 語言:帶足彈藥,繼續用Python開路! t

手把手教你寫網路爬蟲8徹底解決亂碼問題

字元編解碼是爬蟲裡必學的一項知識,在我們的爬蟲生涯中早晚會爬到亂碼的網頁,與其遇到時驚慌失措,不如早學早好,徹底避免亂碼問題。 字元編碼簡介 什麼是字符集 在介紹字元編碼之前,我們先了解下什麼是字符集。 字元(Character)是各種文字和符號的總稱,包括各國家文字、標點