python 爬蟲之為什么使用opener對象以及為什么要創建全局默認的opener對象


 

 

基本的urlopen()函數不支持驗證、cookie或其他HTTP高級功能。要支持這些功能,必須使用build_opener()函數來創建自己的自定義Opener對象。

install_opener(opener) 安裝opener作為urlopen()使用的全局URL opener,即意味着以后調用urlopen()時都會使用安裝的opener對象。opener通常是build_opener()創建的opener對象。

一些復雜情況詳細解決辦法:

1. cookie處理

如果要管理HTTP cookie,需要創建添加了HTTPCookieProcessor處理程序的opener對象。默認情況下。HTTPCookieProcessor使用CookieJar對象,將不同類型的CookieJar對象作為HTTPCookieProcessor的參數提供,可支持不同的cookie處理。如下面代碼:

1 mcj=cookielib.MozillaCookieJar("cookies.txt")
2 cookiehand=HTTPCookieProcessor(mcj)
3 opener=urllib2.build_opener(cookiehand)
4 u=opener.open(http://www.baidu.com)      

2. 代理

urllib2會自動檢測代理設置,默認使用環境變量http_proxy 來設置 HTTP Proxy通常情況下,這是很有幫助的,因為也可能造成麻煩(因為通過代理獲取本地URL資源時會被阻止,因此如果你正在通過代理訪問Internet,那么使用腳本測試本地服務器時必須阻止urllib2模塊使用代理)。因此,如果想在程序中明確Proxy的使用而不受環境變量的影響,可以通過創建ProxyHandler實例,並將實例作為build_opener()的參數來實現。如下面代碼:

01 import urllib2
02   
03 enable_proxy = True
04 proxy_handler = urllib2.ProxyHandler({"http" 'http://some-proxy.com:8080'})
05 null_proxy_handler = urllib2.ProxyHandler({})
06   
07 if enable_proxy:
08     opener = urllib2.build_opener(proxy_handler)
09 else:
10     opener = urllib2.build_opener(null_proxy_handler)
11   
12 urllib2.install_opener(opener)

3. 一個簡單的模擬登錄例子:

01 #模擬登錄
02 cj = cookielib.CookieJar()
03 #用戶名和密碼 
04 post_data = urllib.urlencode({'username''[nowamagic]''password''[mypass]''pwd''1'})
05 #登錄路徑 
08 cookieHandle = urllib2.HTTPCookieProcessor(cj)
09 opener = urllib2.build_opener(cookieHandle)
10 #url = opener.open('http://www.baidu.com')
11 #page = url.read()
12  
13 opener.addheaders = [('User-agent''Opera/9.23')]
14 urllib2.install_opener(opener)
15 req = urllib2.Request(path, post_data)
16 conn = urllib2.urlopen(req)
17 result = conn.geturl()
18 #print path
19 #message = {
20     #"header": conn.info(),
21     #"status": conn.getcode(),
22     #"url": conn.geturl(),
23 #}
24  
25 self.render("nowamagic.html",message=result)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM