當(dāng)你獲取一個(gè)URL你使用一個(gè)opener(一個(gè)urllib2.OpenerDirector的實(shí)例)。正常情況下,我們使用默認(rèn)opener:通過urlopen。但你能夠創(chuàng)建個(gè)性的openers。可以用build_opener來創(chuàng)建opener對象。一般可用于需要處理cookie或者不想進(jìn)行redirection的應(yīng)用場景(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.)
以下是用代理ip模擬登錄時(shí)(需要處理cookie)使用handler和opener的具體流程。
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處理。每個(gè)handlers知道如何通過特定協(xié)議打開URLs,或者如何處理URL打開時(shí)的各個(gè)方面。例如HTTP重定向或者HTTP cookies。
更多關(guān)于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.
(http://www.voidspace.org.uk/python/articles/urllib2.shtml#proxies)
1 import urllib22 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 urllib22 response = urllib2.urlopen('http://www.google.com', timeout=10)
有些網(wǎng)站的服務(wù)器會(huì)檢查請求的header信息,在訪問一些網(wǎng)站時(shí),會(huì)出現(xiàn)HTTPError: HTTP Error 403: Forbidden這樣的異常,這是由于現(xiàn)在有些網(wǎng)站禁止爬蟲訪問,爬蟲會(huì)帶來服務(wù)器上的負(fù)擔(dān),爬蟲和瀏覽器發(fā)出的http請求區(qū)別在于:當(dāng)用戶發(fā)送一個(gè)http請求的時(shí)候,瀏覽的的版本信息也包含在了http請求信息中,而爬蟲就不包含頭信息,當(dāng)服務(wù)器端收到一個(gè)頁面訪問請求時(shí),如果不知道發(fā)送這個(gè)請求使用的瀏覽器,操作系統(tǒng),硬件平臺(tái)等信息,這些信息在HTTP協(xié)議的中的一個(gè)字段User-agent中,缺失這些信息,服務(wù)器會(huì)認(rèn)為這些請求是非正常的訪問,我們用Fiddler工具就可以看到瀏覽器的請求的信息。可以用urllib2中Request方法傳遞header來解決。
下例中提交了header中的User-Agent信息,由此偽裝成瀏覽器發(fā)送請求。查看User-Agent信息非常方便,可以使用Chrome瀏覽器F12審查元素看network中的Request Header可見詳細(xì)的Header信息。
對付“反盜鏈”,有些網(wǎng)站會(huì)檢查header中的Referer是不是該網(wǎng)站本身,可以設(shè)置header時(shí)進(jìn)行設(shè)置。
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 = headers9 )
更多關(guān)于HTTP header的詳細(xì)信息:http://rlog.cn/?p=521
Cookie,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)。比如說有些網(wǎng)站需要登錄后才能訪問某個(gè)頁面,在登錄之前,你想抓取某個(gè)頁面內(nèi)容是不允許的。那么我們可以利用Urllib2庫保存我們登錄的Cookie,然后再抓取其他頁面就達(dá)到目的了。
cookie的一個(gè)使用示例如下。
1 import urllib2 2 import cookielib 3 #聲明一個(gè)CookieJar對象實(shí)例來保存cookie 4 cookie = cookielib.CookieJar() 5 #利用urllib2庫的HTTPCookieProcessor對象來創(chuàng)建cookie處理器 6 handler=urllib2.HTTPCookieProcessor(cookie) 7 #通過handler來構(gòu)建opener 8 opener = urllib2.build_opener(handler) 9 #此處的open方法同urllib2的urlopen方法,也可以傳入request10 response = opener.open('http://www.baidu.com')11 for item in cookie:12 print 'Name = '+item.name13 print 'Value = '+item.value
在無異常拋出的情況下,可以用getcode()方法來得到狀態(tài)碼,所以需要異常處理。
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
轉(zhuǎn)載請注明:
http://m.survivalescaperooms.com/wuwenyan/p/4749018.html
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注