當你獲取一個URL你使用一個opener(一個urllib2.OpenerDirector的實例)。正常狀況下,咱們使用默認opener:經過urlopen。但你可以建立個性的openers。能夠用build_opener來建立opener對象。通常可用於須要處理cookie或者不想進行redirection的應用場景(You will want to create openers if you want to fetch URLs with specific handlers installed, for example to get an opener that handles cookies, or to get an opener that does not handle redirections.)html
如下是用代理ip模擬登陸時(須要處理cookie)使用handler和opener的具體流程。python
1 self.proxy = urllib2.ProxyHandler({'http': self.proxy_url}) 2 self.cookie = cookielib.LWPCookieJar() 3 self.cookie_handler = urllib2.HTTPCookieProcessor(self.cookie) 4 self.opener = urllib2.build_opener(self.cookie_handler, self.proxy, urllib2.HTTPHandler)
Openers使用處理器handlers,全部的「繁重」工做由handlers處理。每一個handlers知道如何經過特定協議打開URLs,或者如何處理URL打開時的各個方面。例如HTTP重定向或者HTTP cookies。瀏覽器
更多關於Openers和Handlers的信息。http://www.voidspace.org.uk/python/articles/urllib2.shtml#openers-and-handlers服務器
Note:Currently urllib2 does not support fetching of https locations through a proxy. This can be a problem.cookie
(http://www.voidspace.org.uk/python/articles/urllib2.shtml#proxies)session
1 import urllib2 2 proxy——handler = urllib2.ProxyHandler({'http': '54.186.78.110:3128'})#注意要確保該代理ip可用,示例中ip在美國 3 opener = urllib2.build_opener(proxy_handler) 4 request = urllib2.Request(url, post_data, login_headers)#該例中還須要提交post_data和header信息 5 response = opener.open(request) 6 print response.read().encode('utf-8')
1 import urllib2 2 response = urllib2.urlopen('http://www.google.com', timeout=10)
有些網站的服務器會檢查請求的header信息,在訪問一些網站時,會出現HTTPError: HTTP Error 403: Forbidden這樣的異常,這是因爲如今有些網站禁止爬蟲訪問,爬蟲會帶來服務器上的負擔,爬蟲和瀏覽器發出的http請求區別在於:當用戶發送一個http請求的時候,瀏覽的的版本信息也包含在了http請求信息中,而爬蟲就不包含頭信息,當服務器端收到一個頁面訪問請求時,若是不知道發送這個請求使用的瀏覽器,操做系統,硬件平臺等信息,這些信息在HTTP協議的中的一個字段User-agent中,缺失這些信息,服務器會認爲這些請求是非正常的訪問,咱們用Fiddler工具就能夠看到瀏覽器的請求的信息。能夠用urllib2中Request方法傳遞header來解決。工具
下例中提交了header中的User-Agent信息,由此假裝成瀏覽器發送請求。查看User-Agent信息很是方便,可使用Chrome瀏覽器F12審查元素看network中的Request Header可見詳細的Header信息。post
對付「反盜鏈」,有些網站會檢查header中的Referer是否是該網站自己,能夠設置header時進行設置。 fetch
1 headers = { 2 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6',
3 'referer': 'https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F' 4 } 5 request = urllib2.Request( 6 url ="https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F", 7 data = postdata, 8 headers = headers 9 )
更多關於HTTP header的詳細信息:http://rlog.cn/?p=521網站
Cookie,指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。好比說有些網站須要登陸後才能訪問某個頁面,在登陸以前,你想抓取某個頁面內容是不容許的。那麼咱們能夠利用Urllib2庫保存咱們登陸的Cookie,而後再抓取其餘頁面就達到目的了。
cookie的一個使用示例以下。
1 import urllib2 2 import cookielib 3 #聲明一個CookieJar對象實例來保存cookie 4 cookie = cookielib.CookieJar() 5 #利用urllib2庫的HTTPCookieProcessor對象來建立cookie處理器 6 handler=urllib2.HTTPCookieProcessor(cookie) 7 #經過handler來構建opener 8 opener = urllib2.build_opener(handler) 9 #此處的open方法同urllib2的urlopen方法,也能夠傳入request 10 response = opener.open('http://www.baidu.com') 11 for item in cookie: 12 print 'Name = '+item.name 13 print 'Value = '+item.value
在無異常拋出的狀況下,能夠用getcode()方法來獲得狀態碼,因此須要異常處理。
1 import urllib2 2 try: 3 request = urllib2.Request(url) 4 response = urllib2.urlopen(request) 5 print response.read().decode('utf-8') 6 except urllib2.URLError, e: 7 if hasattr(e, "code"): 8 print e.code 9 if hasattr(e, "reason"): 10 print e.reason
未完...
參考資料:
http://blog.csdn.net/pleasecallmewhy/article/details/8925978
轉載請註明:
http://www.cnblogs.com/wuwenyan/p/4749018.html