国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

【Python爬蟲學(xué)習(xí)筆記(1)】urllib2庫相關(guān)知識(shí)點(diǎn)總結(jié)

2019-11-14 17:03:27
字體:
供稿:網(wǎng)友

1. urllib2的opener和handler概念

  1.1 Openers:

  當(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)

  1.2 Handles:

  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

2. urllib2的使用技巧

  2.1 proxy代理ip創(chuàng)建opener

  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')

  2.2 用timeout參數(shù)設(shè)置超時(shí)

1 import urllib22 response = urllib2.urlopen('http://www.google.com', timeout=10)

  2.3 偽裝瀏覽器

  有些網(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

  2.4 cookie的使用

  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

  2.5 urllib2.urlopen的返回碼

  在無異常拋出的情況下,可以用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

  


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 岳西县| 炎陵县| 温泉县| 大邑县| 凯里市| 高碑店市| 延川县| 仙居县| 乾安县| 常宁市| 成都市| 龙游县| 馆陶县| 凤冈县| 民勤县| 天全县| 青冈县| 花莲市| 六枝特区| 东乡县| 林芝县| 中西区| 绥中县| 原阳县| 衡东县| 仁怀市| 同德县| 平安县| 八宿县| 云阳县| 玉山县| 容城县| 门源| 张家界市| 中江县| 石景山区| 滁州市| 二连浩特市| 井研县| 当阳市| 潮安县|