Python Urllib2使用
我們先看下Python對於Urllib2的解釋:
Intro代碼urllib2:An extensible library for opening URLs using a variety of protocols
The urllib2(http://docs.python.org/2/library/urllib2.html) module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.
簡單的說,urllib2就是簡單版本的HttpClient,能夠處理HTTP請求,我們先看下urllib2提供的功能:
Python代碼urllib2.urlopen(url[, data][, timeout])
請求url,獲得請求數據,url參數可以是個String,也可以是個Request參數
要熟悉Python的這種參數表達方式,[]表示可選項,這種表示方法簡單清楚,描述方式相當不錯。
沒有data參數時爲GET請求,設置data參數時爲POST請求,另外data格式必須爲application/x-www-form-urlencoded,urllib.urlencode()能夠設置請求參數的編碼
timeout設置請求阻塞的超時時間,如果沒有設置的話,會使用全局默認timeout參數;該參數只對HTTP、HTTPS、FTP生效
class OpenerDirector
管理一系列的Handler,這些handler都有自己的功能實現和協議,後面會提到大量的Handler功能
urllib2.build_opener([handler, ...])
返回OpenerDirector實例,實現了BaseHandler都可以生成Handler實例。Python已經內建許多的Handler,你可以替換或者添加新的Handler。
內建Handler如下:
Python代碼ProxyHandler:處理代理操作
UnknownHandler:Raise URLError異常
HTTPHandler:處理HTTP的GET和POST操作
HTTPDefaultErrorHandler:處理HTTP Error的通用處理,所有的響應都會拋出HTTPError異常
HTTPRedirectHandler:處理HTTP重定向操作,如301、302、303等和HEAD請求的307都會執行重定向操作
FTPHandler:處理FTP操作
FileHandler:處理文件
HTTPErrorProcessor:處理非200異常
除去上面這些Handler,urllib2還有一些其它的Handler可供選擇,這些Handler都能根據名稱知曉其功能,不細作解釋,包括但不僅限於:
Python代碼HTTPCookieProcessor:處理cookie
HTTPBasicAuthHandler:處理Auth
ProxyBasicAuthHandler:處理Proxy和Auth
HTTPDigestAuthHandler:處理DigestAuth
ProxyDigestAuthHandler:處理ProxyDigest
HTTPSHandler:處理HTTPS請求
CacheFTPHandler:比FTPHandler多點功能。
看下urllib2對於opener的使用:
Python代碼urllib2.install_opener(opener)
定義全局的OpenerDirector,如果執行這個方法,會把自己定義的Handler用在後續的URL處理上。
Urllib2的異常定義:
Python代碼urllib2.URLError:
urllib2.HTTPError:
這兩個異常都是IOError的子類,對於Python的異常定義,大家都不是很滿意,在urllib2中也不例外。
在上面提到urlopen的參數Request,這個Request類能更加豐富請求的內容:
Python代碼class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
url和data的內容和前面的一致,添加了headers的信息,header的內容可以參考http://isilic.iteye.com/blog/1801072
origin_req_host應該是請求的服務器Host地址,unverifiable參數表明請求是否可驗證
urllib2的主要類和方法就這麼多了,看起來還是很好入手的,下面我們來直接使用下urllib2,例程包括但不限於官網:
Python代碼import urllib2
f = urllib2.urlopen('http://www.python.org/')
print f.read(100)
這個用法最簡單,直接使用即可,對於大部分的url請求都可以使用這個方法。
import urllib2
req = urllib2.Request(url='https://localhost/cgi-bin/test.cgi',data='Committed Data')
f = urllib2.urlopen(req)
print f.read()
使用Request參數來發送請求。
使用Request來進行更復雜的操作:
Python代碼import urllib
import urllib2
url = 'http://www.server.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'Michael','language' : 'Python' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
f = urllib2.urlopen(req)
print f.read()
我們使用Request對象,設定了user_agent,對於某些Header需要注意,Server或者應用會對這些值做檢查。
在使用 REST 接口時,Server 會檢查Content-Type字段,用來確定 HTTP Body 中的內容該怎樣解析。
常見的取值有:
Python代碼application/xml :在 XML RPC,如 RESTful/SOAP 調用時使用
application/json :在 JSON RPC 調用時使用
application/x-www-form-urlencoded :瀏覽器提交 Web 表單時使用
Handler中有處理Redirect的handler,如果想確認是否跳轉,確認下response的url是否和請求url一致即可。
import urllib2
request_url = "http://www.google.copm"
response = urllib2.urlopen(request_url)
redirected = response.geturl() == request_url
如果不想自動Redirect,或者想在Redirect過程中添加些自己的動作,可以通過下面兩種途徑完成:
1:使用更低層次的httplib
2:使用自定義的HTTPRedirectHandler
Proxy的使用相當廣泛,對於單個應用來說,爬蟲是很容易被封禁,如果使用Proxy模式,就能降低被封的風險,所以有需求的同學需要仔細看下Python urllib2對於Proxy的使用:
import urllib2
proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:80'})
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
f = urllib2.urlopen('http://www.google.com')
print f.read()
注意這個Proxy會將proxy_handler作爲全局的ProxyHandler,這個未必是我們需要的,如果我們需要使用不同的Proxy,這個設置就有問題,需要修改爲以下Proxy使用方式:
import urllib2
proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:80'})
opener = urllib2.build_opener(proxy_handler)
f = opener.open(url)
print f.read()
對於cookie的處理也是有Handler自動處理的:
import urllib2
import cookielib
cookies = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies))
response = opener.open('http://www.google.com')
for cookie in cookies:
if cookie.name == 'cookie_spec':
print cookie.value
處理cookie是一般是cookielib和HTTPCookieProcessor一起使用
使用Basic HTTP Authentication
Python代碼import urllib2
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
uri='https://mahler:8092/site-updates.py',
user='klem',
passwd='kadidd!ehopper')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
f = urllib2.urlopen('http://www.server.com/login.html')
print f.read()
debug log level使用
Python代碼import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.google.com')
可以看到urllib2抓包時打印的內容,方便調試分析。
最後還有一點,使用urllib2.urlopen()時,urllib2有實際發送請求和獲取響應嗎?那麼read()函數又進行了哪些操作呢?http://stackoverflow.com/questions/3009144/does-urllib2-urlopen-actually-fetch-the-page/3009697#3009697 。這篇文章能夠很好的解決你心中的疑惑,大家仔細閱讀下。
urllib2的使用就暫時到這裏,其實urllib2已經給我們提供了基礎的內容使用,對於擴展功能,也有很好的框架可以擴展;對於我們來說已經能夠很好的進行工作啦。如果說這些功能還不能滿足要求或者擴展也不能實現時,你只能使用httplib,或者自己實現並貢獻python代碼,相信對於技術提升還是很明顯的。
最後還有一點,Python官方也提供了urllib2的源碼,大家如果有什麼不明白的地方,源碼的準確性總是第一位的,源碼的地址見這裏:http://hg.python.org/cpython/file/2.7/Lib/urllib2.py。 沒事翻翻Python的源碼,對於Python本身的知識積累也是不錯的。
【轉載】:轉載自http://isilic.iteye.com/blog/1806403