基本的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 |
#登錄路徑 |
06 |
#path = 'http://www.xiaomi.com/pass/serviceLoginAuth2' |
07 |
path = 'http://www.nowamagic.net/' |
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) |