[Python]網路爬蟲(四):Opener與Handler
在開始後面的內容之前,先來解釋一下urllib2中的兩個個方法:info and geturl
urlopen返回的應答物件response(或者HTTPError例項)有兩個很有用的方法info()和geturl()1.geturl():
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()
2.info():
info()返回物件的字典物件,該字典描述了獲取的頁面情況。通常是伺服器傳送的特定頭headers。
經典的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()
下面來說一說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。
程式碼如下:
- # -*- coding: utf-8 -*-
- import urllib2
- # 建立一個密碼管理
- password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
- # 新增使用者名稱和密碼
- top_level_url = "http://example.com/foo/"
- 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以外,ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler,FTPHandler, FileHandler, HTTPErrorProcessor均會返回Handler。
歡迎收聽我的微信公眾號 相關推薦
[Python]網路爬蟲(四):Opener與Handler
在開始後面的內容之前,先來解釋一下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.exe與chrome版本對映及下載連結
前言:最近正在學習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)是各種文字和符號的總稱,包括各國家文字、標點