整理的用Python編寫(xiě)的爬蟲(chóng)文檔_第1頁(yè)
整理的用Python編寫(xiě)的爬蟲(chóng)文檔_第2頁(yè)
整理的用Python編寫(xiě)的爬蟲(chóng)文檔_第3頁(yè)
整理的用Python編寫(xiě)的爬蟲(chóng)文檔_第4頁(yè)
整理的用Python編寫(xiě)的爬蟲(chóng)文檔_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Python爬蟲(chóng)入門(mén)教程Python網(wǎng)絡(luò)爬蟲(chóng)(一):網(wǎng)絡(luò)爬蟲(chóng)的定義網(wǎng)絡(luò)爬蟲(chóng),即Web Spider,是一個(gè)很形象的名字。把互聯(lián)網(wǎng)比喻成一個(gè)蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來(lái)爬去的蜘蛛。網(wǎng)絡(luò)蜘蛛是通過(guò)網(wǎng)頁(yè)的鏈接地址來(lái)尋找網(wǎng)頁(yè)的。從網(wǎng)站某一個(gè)頁(yè)面(通常是首頁(yè))開(kāi)始,讀取網(wǎng)頁(yè)的內(nèi)容,找到在網(wǎng)頁(yè) 中的其它鏈接地址,然后通過(guò)這些鏈接地址尋找下一個(gè)網(wǎng)頁(yè),這樣一直循環(huán)下去,直到把這個(gè)網(wǎng)站所有的網(wǎng)頁(yè)都抓取完為止。如果把整個(gè)互聯(lián)網(wǎng)當(dāng)成一個(gè)網(wǎng)站, 那么網(wǎng)絡(luò)蜘蛛就可以用這個(gè)原理把互 聯(lián)網(wǎng)上所有的網(wǎng)頁(yè)都抓取下來(lái)。這樣看來(lái),網(wǎng)絡(luò)爬蟲(chóng)就是一個(gè)爬行程序,一個(gè)抓取網(wǎng)頁(yè)的程序。網(wǎng)絡(luò)爬蟲(chóng)的基本操作是抓取網(wǎng)頁(yè)。那么如何才能隨心

2、所欲地獲得自己想要的頁(yè)面?我們先從URL開(kāi)始。二、瀏覽網(wǎng)頁(yè)的過(guò)程抓取網(wǎng)頁(yè)的過(guò)程其實(shí)和讀者平時(shí)使用 IE瀏覽器瀏覽網(wǎng)頁(yè)的道理是一樣 的。比如說(shuō)你在瀏覽器的地址欄中輸入這個(gè)地址。打開(kāi)網(wǎng)頁(yè)的過(guò)程其實(shí)就是瀏覽器作為一個(gè)瀏覽的“客戶(hù)端”,向服務(wù)器 端發(fā)送了 一次請(qǐng)求,把服務(wù)器端的文件“抓”到本地,再進(jìn)行解釋、 展現(xiàn)。HTML是一種標(biāo)記語(yǔ)言,用標(biāo)簽標(biāo)記內(nèi)容并加以解析和區(qū)分。瀏覽器的功能是將獲取到的 HTML代碼進(jìn)行解析,然后將原始的代碼 轉(zhuǎn)變成我們直接看到的網(wǎng)站頁(yè)面。三、URI和URL的概念和舉例簡(jiǎn)單的來(lái)講,URL就是在瀏覽器端輸入的 這個(gè)字符串。在理解URL之前,首先要理解 URI的概念。什么是URI

3、?Web上每種可用的資源,如 HTML文檔、圖像、視頻片段、程序等都 由一個(gè)通用資源標(biāo)志符(Universal Resource Identifier, URI)進(jìn)行定位。URI通常由三部分組成: 訪(fǎng)問(wèn)資源的命名機(jī)制; 存放資源的主機(jī)名; 資源自身 的名稱(chēng),由路徑表示。如下面的URI:.c n/myhtml/html1223/我們可以這樣解釋它: 這是一個(gè)可以通過(guò) HTTP協(xié)議訪(fǎng)問(wèn)的資源, 位于主機(jī) 上, 通過(guò)路徑“ /html/html40 ”訪(fǎng)問(wèn)。四、URL的理解和舉例URL 是 URI 的一個(gè)子集。它是 Uniform Resource Locator的縮寫(xiě),譯為“統(tǒng)一資源定位符”。通俗

4、地說(shuō),URL是In ternet上描述信息資源的字符串,主要用在各種WWW 客戶(hù)程序和服務(wù)器程序上。采用URL可以用一種統(tǒng)一的格式來(lái)描述各種信息資源,包括文件、服務(wù)器的地址和目錄等。URL的一般格式為(帶方括號(hào)的為可選項(xiàng)):protocol : host name:port / path / ;parameters?query#fragme ntURL的格式由三部分組成: 第一部分是協(xié)議(或稱(chēng)為服務(wù)方式)。 第二部分是存有該資源的主機(jī)IP地址(有時(shí)也包括端口號(hào))。 第三部分是主機(jī)資源的具體地址,如目錄和文件名等。第一部分和第二部分用“ :/ ”符號(hào)隔開(kāi),第二部分和第三部分用“ /”符號(hào)隔開(kāi)。第

5、一部分和第二部分是不可缺少的,第三部分有時(shí)可以省略。五、URL禾口 URI簡(jiǎn)單比較URI屬于URL更低層次的抽象,一種字符串文本標(biāo)準(zhǔn)。換句話(huà)說(shuō),URI屬于父類(lèi),而URL屬于URI的子類(lèi)。URL是URI的一個(gè)子集。URI的定義是:統(tǒng)一資源標(biāo)識(shí)符;URL的定義是:統(tǒng)一資源定位符。二者的區(qū)別在于,URI表示請(qǐng)求服務(wù)器的路徑,定義這么一個(gè)資源。而URL同時(shí)說(shuō)明要如何訪(fǎng)問(wèn)這個(gè)資源(http:/ )。下面來(lái)看看兩個(gè)URL的小例子。1. HTTP協(xié)議的URL示例:使用超級(jí)文本傳輸協(xié)議HTTP,提供超級(jí)文本信息服務(wù)的資源。例: 其計(jì)算機(jī)域名為 。超級(jí)文本文件(文件類(lèi)型為.html)是在目錄/channel下的

6、welcome.htm 。這是中國(guó)人民日?qǐng)?bào)的一臺(tái)計(jì)算機(jī)。例:http:/www.roL其計(jì)算機(jī)域名為 。超級(jí)文本文件(文件類(lèi)型為.html)是在目錄/talk下的talk1.htm。這是瑞得聊天室的地址,可由此進(jìn)入瑞得聊天室的第1室。2 .文件的URL用URL表示文件時(shí),服務(wù)器方式用file表示,后面要有主機(jī)IP地址、文件的存取路 徑(即目錄)和文件名等信息。有時(shí)可以省略目錄和文件名,但“/”符號(hào)不能省略。例: file:/上面這個(gè) URL代表存放在主機(jī) 上的pub/files/目錄下的一個(gè)文件,文件名是 foobar.txt。例: file:/代表主機(jī) 上的目錄/pub。例:file:/代表

7、主機(jī)的根目錄。爬蟲(chóng)最主要的處理對(duì)象就是URL,它根據(jù)URL地址取得所需要的文件內(nèi)容,然后對(duì)它 進(jìn)行進(jìn)一步的處理。因此,準(zhǔn)確地理解 URL對(duì)理解網(wǎng)絡(luò)爬蟲(chóng)至關(guān)重要。Python網(wǎng)絡(luò)爬蟲(chóng)(二):利用urllib2通過(guò)指定的URL抓取網(wǎng)頁(yè)內(nèi)容版本號(hào):Python2.7.5 ,Python3改動(dòng)較大,各位另尋教程。所謂網(wǎng)頁(yè)抓取,就是把 URL地址中指定的網(wǎng)絡(luò)資源從網(wǎng)絡(luò)流中讀取出 來(lái),保存到本地。類(lèi)似于使用程序模擬IE瀏覽器的功能,把URL作為HTTP請(qǐng)求的內(nèi)容 發(fā)送到服務(wù)器端,然后讀取服務(wù)器端的響應(yīng)資源。在Python中,我們使用urllib2這個(gè)組件來(lái)抓取網(wǎng)頁(yè)。urllib2 是 Python 的一個(gè)

8、獲取 URLs(Uniform Resource Locators) 的 組件。它以u(píng)rlopen函數(shù)的形式提供了一個(gè)非常簡(jiǎn)單的接口。最簡(jiǎn)單的urllib2的應(yīng)用代碼只需要四行。我們新建一個(gè)文件urllib2_test01.py來(lái)感受一下urllib2的作用:pyth on view pla in copy c1. import urllib22. response = urllib2.urlopen(')3. html = response.read()4. print html按下F5可以看到運(yùn)行的結(jié)果:E:怙 £dit £hpl Rubug Qp 甘 <

9、?沖 Wi ndcrw?旦日”"£xu»M - p ; ixg .bxc pht tp : /nflcliclc.baidu . ccm/ gi£?pid"201ip j"www£t*v_sid"22 亠 1914 495178E_22504" + sQ * Mpath+p+ R4c-*+new Date (i getliite(:return true ; if (/Xbbdime- 12/.tejE (d< cocicie) docmnent.write ( script arc-"

10、1 + "http: /si. heldLat,±c. Cuin/r/ww/d-ac?ic/stat j.u/jJnu/ j mf垃itae bl57£449 . j a,h r *" eh.audet, " utE-3,*></3cnpT:>') ; (funerlon () var u G ("h*) . q皀rElemem:已呂YTagName “迪” 1 * nv = G (*nv" J .gstEleaenrsByTagNMie "a", It Q"lk&qu

11、ot;) . getElemenrsByTagNaiM ("a*) f un = *"fvarco nv = l "newsh "z 丄” *乞11丄且直£|"” "ups" ” *甘工3 己a"” "map ”;var t j Lk = N bailee* , hhwe-n1cu , nhaal23,1,; un = fads . tzonzm . .3er = n 、 k *: bdm _ uamm - :jner ;壬unu上ian addTJ|obJ)addEV(obj, "i

12、nous edown *, function(evar e = e | | window.eve nt;va r tar jet = e ,target | | e. sTGELem&nt; ns c( 'fm' : 1 beh3 1 , 1 tatr' : target .nair. |' t; user*t TuJ' ; tncadtURTCcirp Cinm& tun j ):); fox: I pair 1 O ; i < u . len-gth; ) + + addT-J (u i );fox (var i = Q; 1

13、< irr. lngch; 1+4) v i »name = ,_c j_" + _rv i ; J for var i = ; 1 < 1 上.length; i+ lki naice 弓'tj_' + tj_llci;) () ; (function () var lin les = i' t:_nwsT : 'vora1, 1 uttp: /news -E>aiat < com/ns?tn=new34=1 sie=utf-3' 11 j_tieti81: 1 tw' 1 http: Z/tieb*

14、 ,tw3idvi »com/f f ' tj_7nid3o' : * wnrd', 'http: /zhidao. baidii* cam/sear匚h?p:i0"r:=l(U兀=0匸j_rrp3 *;1 ksy1, 'htp;/music uom/M 電孔 r 匸紋?' t* t j_irig': 1 word', 'http:/image .baidu*com/i 7cc-2013265 52 tcl_2 fir:c_l£lin_-l fiat- lttn-baiduimagcLiffy

15、ptI £fm_£pvLz-0 tic-u tf-31,1tj_vidto': 'word* t 'http;/video.baidu.cam/7?ec-301939888ifl"2S4ie-utf-e 1 f +1j_mip- : + wd' j, fhrtp: /itaf .baidu. eoit/?rcwniap«l£ie»ut;-8£B«fl* , ' zjaiJce': 1 word*, 'http;/ba1 J_wenl£u' :

16、 'wardF T 'here :/wentu.baidu.ccia/sieaich?ie=utf-B1 ;var donArr = G (' -v') , G (* Ik* j, G(' cph) 1 j tw G(1 kw1; for (var 1 = 0r 1 = damArr.length; 1 < 1; 1+4-) domArx 1 .omaemsedown = function (e (e = e | | windoiif. even; var target = e . target | | e . sr uE1 mm呂nt * nao

17、rje = tar get . getAttibut e (' name " i t z. teiEB = 1 inks J nair.e , eg = new RegEitp (T 5+| s4-x24 1 , tey = :<w. value, replace (regf 1 1 J ; if |iterrs) if (Jcy.length >Q) var vd = ivenis 0 f uxl = icercs 1, irl = url + ( name = 11 j inapT ? encodeUR ICoipcncnt ('S' + vr

18、d + '- + kc/ ; i ( urlindcxOf ( '?')> 0 ?p4 ;、?、> + wd +* =T + encodeURIComponent fleevl 1 1 ;taraet= url; 1 ele taraet . href = taroe t.hnf .irimtuh (nuw RegExp( A/+*i>包i(dr .canT) QI; 1右& ns_c ( 'fmT; 'behah, *tabb : narre* query* : encodeURIComponfint (key, '

19、un* : ecodeCRlomporent (bd3 u onun.'uyFT | |* ');) () ; *dHEV (wf i:nctian () k. foeufl ()>;!?. onurlcmdfiiTictiern () ) ;</sciiptXBcript type-"text/javascriptn src"nhttp:/sl. bdstaticcom/r/w ww/cache/ scatic/global/j s/tangrair.-l 3 Eul. O_C7038476 jm"";/話(huà)匸工:口匕

20、7;<且:;工ip匸 type"1* texs/jjavascEipcrh arcHhctp i / /al *Jcd3tatj.e * ccrt/r/www/eache/at-fitic/ujjer/ja/u_75caac :J- . i? "_- r,. Li - Z'二二二二:二 n: A:; :一 11.己:.SC Lk_-r,>J?:巴 kh 二:匕二一Z 己二,01 Jan 2000 00 :0D; 00 GMT,f;batdu. on (doerr.eri:. forsi3 0 f 'tsbJtrj_thr func-icn ) v

21、ar t=n*w Date l . getlutt(); aocunen.cooxie = rhwww_51=-< + _t +*;expire3=hh + nev uate(t + 10000 ) . t flCMT St * i nj ( 匕 uh(e) 1 / s z- r ipt x/ritirJ.>-i !61S7OGS f 2 、我們可以打開(kāi)百度主頁(yè),右擊,選擇查看源代碼(火狐OR谷歌瀏覽器均可),會(huì)發(fā)現(xiàn)也是完全一樣的內(nèi)容。也就是說(shuō),上面這四行代碼將我們?cè)L問(wèn)百度時(shí)瀏覽器收到的代碼們?nèi)?打印了出來(lái)。這就是一個(gè)最簡(jiǎn)單的urllib2的例子。除了 "http:&q

22、uot; , URL同樣可以使用"ftp:" , "file:"等等來(lái)替代。HTTP是基于請(qǐng)求和應(yīng)答機(jī)制的:客戶(hù)端提出請(qǐng)求,服務(wù)端提供應(yīng)答。urllib2 用一個(gè)Request對(duì)象來(lái)映射你提出的 HTTP請(qǐng)求。在它最簡(jiǎn)單的使用形式中你將用你要請(qǐng)求的地址創(chuàng)建一個(gè)Request對(duì)象,通過(guò)調(diào)用urlopen并傳入Request對(duì)象,將返回一個(gè)相關(guān)請(qǐng)求response 對(duì)象,這個(gè)應(yīng)答對(duì)象如同一個(gè)文件對(duì)象,所以你可以在Response中調(diào)用.read()。我們新建一個(gè)文件urllib2_test02.py來(lái)感受一下:pytho nview pla in copy

23、丄1. import urllib22. req = urllib2.Request('')3. response = urllib2.urlopen(req)4. the_page = response.read()5. print the_page可以看到輸出的內(nèi)容和testO1是一樣的。urllib2使用相同的接口處理所有的 URL頭。例如你可以像下面那樣創(chuàng) 建一個(gè)ftp請(qǐng)求。pyth onview pla in copy c1. req = urllib2.Request('ftp:/)在HTTP請(qǐng)求時(shí),允許你做額外的兩件事。1. 發(fā)送data表單數(shù)據(jù) 這個(gè)內(nèi)容

24、相信做過(guò) Web端的都不會(huì)陌生,有時(shí)候你希望發(fā)送一些數(shù)據(jù)到 URL(通常URL與CGI通用網(wǎng)關(guān)接口 腳 本,或其他WEB應(yīng)用程序掛接)。在HTTP中,這個(gè)經(jīng)常使用熟知的 POST請(qǐng)求發(fā)送。這個(gè)通常在你提交一個(gè) HTML表單時(shí)由你的瀏覽器來(lái)做。并不是所有的POSTs都來(lái)源于表單,你能夠使用 POST提交任意的數(shù) 據(jù)到你自己的程序。一般的HTML表單,data需要編碼成標(biāo)準(zhǔn)形式。然后做為 data參數(shù) 傳到Request對(duì)象。編碼工作使用urllib的函數(shù)而非urllib2。我們新建一個(gè)文件urllib2_test03.py來(lái)感受一下:pytho n view pla in copy £

25、1.importurllib2.importurllib23.4.url ='5.6.values= 'name' : 'WHY',7.'location':'SDU',8.'language':'Python' 9.10.data =urllib.urlencode(values)#編碼工作11.req = urllib2.Request(url, data)#發(fā)送請(qǐng)求同時(shí)傳data表單12.response = urllib2.urlopen(req)#接受反饋的信息13.the_pag

26、e = response.read()#讀取反饋的內(nèi)容如果沒(méi)有傳送data參數(shù),urllib2使用GET方式的請(qǐng)求。GET和POST請(qǐng)求的不同之處是 POST請(qǐng)求通常有"副作用",它們會(huì)由于某種途徑改變系統(tǒng)狀態(tài)(例如提交成堆垃圾到你的門(mén)口 )Data同樣可以通過(guò)在 Get請(qǐng)求的URL本身上面編碼來(lái)傳送。pytho nview pla in copy r1. import urllib22. import urllib3.3. data = 5.4. data 'name' = 'WHY'5. data 'location' =

27、 'SDU'6. data 'language'=卩ython'9.7. url_values = urllib.urlencode(data)8. print url_values12.9. name=Somebody+Here&language=Python&location=Northampton10. url = '11. full_url = url +'?'+ url_values16.17. data = urllib2.open(full_url)這樣就實(shí)現(xiàn)了 Data數(shù)據(jù)的Get傳送。2. 設(shè)置H

28、eaders 到http 請(qǐng)求有一些站點(diǎn)不喜歡被程序(非人為訪(fǎng)問(wèn))訪(fǎng)問(wèn),或者發(fā)送不同版本的內(nèi) 容到不同的瀏覽器。默認(rèn)的 urllib2 把自己作為“ Python-urllib/x.y” (x 和 y 是 Python 主版本和次版本號(hào)例如Python-urllib/2.7),這個(gè)身份可能會(huì)讓站點(diǎn)迷惑, 或者干脆不工作。瀏覽器確認(rèn)自己身份是通過(guò)User-Age nt頭,當(dāng)你創(chuàng)建了一個(gè)請(qǐng)求對(duì)象,你可以給他一個(gè)包含頭數(shù)據(jù)的字典。下面的例子發(fā)送跟上面一樣的內(nèi)容,但把自身模擬成In ternet Explorer(多謝大家的提醒,現(xiàn)在這個(gè) Demo已經(jīng)不可用了,不過(guò)原理還是那樣的)。python vi

29、ew plaincopy1. import urllib2. import urllib23.3. url = '5.4. user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'7.values = 'name' : 'WHY',8.'location':'SDU',9.'language':'Python' 10.11.headers = 'User-Agent':user_agent 12

30、. data = urllib.urlencode(values)13. req = urllib2.Request(url, data, headers)14. response = urllib2.urlopen(req)15. the_page = response.read()Python網(wǎng)絡(luò)爬蟲(chóng)(三):異常的處理和HTTP狀態(tài)碼的分類(lèi)先來(lái)說(shuō)一說(shuō)HTTP的異常處理問(wèn)題。當(dāng)urlopen 不能夠處理一個(gè) response 時(shí),產(chǎn)生 urlError 。不過(guò)通常的Python APIs異常如ValueError,TypeError 等也會(huì)同時(shí)產(chǎn) 生。HTTPError是urlError的子

31、類(lèi),通常在特定 HTTP URLs中產(chǎn)生。1. URLError通常,URLError在沒(méi)有網(wǎng)絡(luò)連接(沒(méi)有路由到特定服務(wù)器),或者服務(wù)器 不存在的情況下產(chǎn)生。這種情況下,異常同樣會(huì)帶有"reason"屬性,它是一個(gè)tuple (可以理 解為不可變的數(shù)組),包含了一個(gè)錯(cuò)誤號(hào)和一個(gè)錯(cuò)誤信息我們建一個(gè)urllib2_test06.py來(lái)感受一下異常的處理:pyth onview pla in copy1.import urllib22.3.req = urllib2.Request(''13#4.5.try : urllib2.urlopen(req)6.7.ex

32、cept urllib2.URLError, e:8.print e.reason按下F5,可以看到打印出來(lái)的內(nèi)容是:Errno 11001 getaddri nfo failed也就是說(shuō),錯(cuò)誤號(hào)是 11001,內(nèi)容是getaddrinfo failed2. HTTPError服務(wù)器上每一個(gè)HTTP應(yīng)答對(duì)象response包含一個(gè)數(shù)字”狀態(tài)碼"。 有時(shí)狀態(tài)碼指出服務(wù)器無(wú)法完成請(qǐng)求。默認(rèn)的處理器會(huì)為你處理一部分 這種應(yīng)答。例如:假如response是一個(gè)”重定向”,需要客戶(hù)端從別的地址獲取文檔,urllib2將為你處理。其他不能處理的,urlopen會(huì)產(chǎn)生一個(gè)HTTPError。典型的

33、錯(cuò)誤包含"404"(頁(yè)面無(wú)法找到),"403"(請(qǐng)求禁止),和"401"(帶 驗(yàn)證請(qǐng)求)。HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應(yīng)的狀態(tài)。比如客戶(hù)端向服務(wù)器發(fā)送請(qǐng)求,如果成功地獲得請(qǐng)求的資源,則返回的狀態(tài)碼為200,表示響應(yīng)成功。如果請(qǐng)求的資源不存在,則通常返回404錯(cuò)誤。HTTP狀態(tài)碼通常分為5種類(lèi)型,分別以15五個(gè)數(shù)字開(kāi)頭,由3位 整數(shù)組成:200 :請(qǐng)求成功處理方式:獲得響應(yīng)的內(nèi)容,進(jìn)行處理201 :請(qǐng)求完成,結(jié)果是創(chuàng)建了新資源。新創(chuàng)建資源的URI可在響應(yīng)的實(shí)體中得到處理方式:爬蟲(chóng)中不會(huì)遇到202 :請(qǐng)求被接受,但處理尚未完成

34、處理方式:阻塞等待204 :服務(wù)器端已經(jīng)實(shí)現(xiàn)了請(qǐng)求, 但是沒(méi)有返回新的信 息。如果客戶(hù)是 用戶(hù)代理,則無(wú)須為此更新自身的文檔視圖。處理方式:丟棄300 :該狀態(tài)碼不被HTTP/1.0的應(yīng)用程序直接使用, 只是作為3XX類(lèi)型回應(yīng)的默認(rèn)解釋。存在多個(gè)可用的被請(qǐng)求資源。處理方式:若程序中能夠處理,則進(jìn)行進(jìn)一步處理,如果程序中不能處理,則丟棄301 :請(qǐng)求到的資源都會(huì)分配一個(gè)永久的URL,這樣就可以在將來(lái)通過(guò)該URL來(lái)訪(fǎng)問(wèn)此資源處理方式:重定向到分配的 URL302 :請(qǐng)求到的資源在一個(gè)不同的 URL處臨時(shí)保存處理方式:重定向到臨時(shí)的URL304請(qǐng)求的資源未更新處理方式:丟棄400非法請(qǐng)求處理方式:丟

35、棄401未授權(quán)處理方式:丟棄403禁止處理方式:丟棄404沒(méi)有找到處理方式:丟棄5XX回應(yīng)代碼以“ 5”開(kāi)頭的狀態(tài)碼表示服務(wù)器端發(fā)現(xiàn)自己出現(xiàn)錯(cuò)誤, 不能繼續(xù)執(zhí)行請(qǐng)求處理方式:丟棄HTTPError實(shí)例產(chǎn)生后會(huì)有一個(gè)整型'code'屬性,是服務(wù)器發(fā)送的相關(guān) 錯(cuò)誤號(hào)。Error Codes 錯(cuò)誤碼因?yàn)槟J(rèn)的處理器處理了重定向(300以外號(hào)碼),并且100-299范圍的 號(hào)碼指示成功,所以你只能看到400-599的錯(cuò)誤號(hào)碼。BaseHTTPServer.BaseHTTPRequestHa ndler.resp on se是一個(gè)很有用的應(yīng)答號(hào)碼字典,顯示了 HTTP協(xié)議使用的所有的應(yīng)答

36、號(hào)。當(dāng)一個(gè)錯(cuò)誤號(hào)產(chǎn)生后,服務(wù)器返回一個(gè)HTTP錯(cuò)誤號(hào),和一個(gè)錯(cuò)誤頁(yè)面。 你可以使用HTTPError實(shí)例作為頁(yè)面返回的應(yīng)答對(duì)象response。這表示和錯(cuò)誤屬性一樣,它同樣包含了 read,geturl,和info方法。我們建一個(gè)urllib2_test07.py 來(lái)感受一下:pyth on view pla in copy1.import urllib22.req = urllib2.Request(')3.4.try :5.urllib2.urlopen(req)6.7.except urllib2.URLError, e:8.9.print e.code10.#print e.r

37、ead()按下F5可以看見(jiàn)輸出了 404的錯(cuò)誤碼,也就說(shuō)沒(méi)有找到這個(gè)頁(yè)面3. Wrapp ing所以如果你想為HTTPError或URLError做準(zhǔn)備,將有兩個(gè)基本的辦法 推薦使用第二種。我們建一個(gè)urllib2_test08.py來(lái)示范一下第一種異常處理的方案:pyth onview pla in copy1. from urllib2 import Request, urlopen, URLError, HTTPError2.2. req = Request( ')4.3. try :6.4. response = urlopen(req)8.5. except HTTPErro

38、r, e:10.6. print 'The server couldn't fulfill the request.'12.7. print 'Error code: ', e.code14.8. except URLError, e:16.17.print'We failed to reach a server.'18.19.print'Reason: ', e.reason20.21.else :22.print'No exception was raised.'23.# everything is f

39、ine和其他語(yǔ)言相似,try之后捕獲異常并且將其內(nèi)容打印出來(lái)。這里要注意的一點(diǎn),except HTTPError必須在第一個(gè),否則 exceptURLError將同樣接受到HTTPError。因?yàn)镠TTPError是URLError的子類(lèi),如果 URLError在前面它會(huì)捕捉到所有的 URLError (包括 HTTPError )。我們建一個(gè)urllib2_test09.py來(lái)示范一下第二種異常處理的方案:pyth on view pla in copy..4.25.26.f

40、rom urllib2 import Request, urlopen, URLError, HTTPError req = Request( ')try :response = urlopen(req)except URLError, e:if hasattr(e, 'code'):print 'The server couldn't fulfill the request.'print 'Error code: ', e.codeelif hasattr(e, 'reason' ):print 'We

41、failed to reach a server.'print 'Reason: ', e.reasonelse :print 'No exception was raised.'# everything is finePython網(wǎng)絡(luò)爬蟲(chóng)(四):Opener與Handler的介紹和實(shí)例應(yīng)用更好的學(xué)習(xí)網(wǎng)址:.uk/pytho n/articles/urllib2.shtml#open ers-a nd-ha ndlers18以下為個(gè)人學(xué)習(xí)筆記。在開(kāi)始后面的內(nèi)容之前,先來(lái)解釋一下urllib2中的兩個(gè)個(gè)方法:i

42、nfoand geturlurlopen 返回的應(yīng)答對(duì)象response(或者HTTPError實(shí)例)有兩個(gè)很有用的方法info()和geturl()1. geturl()這個(gè)返回獲取的真實(shí)的URL,這個(gè)很有用,因?yàn)閡rlopen(或者opener對(duì)象使用的)或許會(huì)有重定向。獲取的URL或許跟請(qǐng)求URL不同。以人人中的一個(gè)超級(jí)鏈接為例,我們建一個(gè)urllib2_test10.py來(lái)比較一下原始URL和重定向的鏈接:pyth onview pla in copy1. from urllib2 import Request, urlopen, URLError, HTTPError2.3.2. o

43、ld_url = '3. req = Request(old_url)4. response = urlopen(req)5. print 'Old url :'+ old_url6. print 'Real url :'+ response.geturl()運(yùn)行之后可以看到真正的鏈接指向的網(wǎng)址:X" 才"f.'Vk 7 士 +>»Old url :Real url :hutp: /ww palyu edu>» I -""2.i nfo()這個(gè)返回對(duì)象的字典對(duì)象,該字典描述了

44、獲取的頁(yè)面情況。通常是服務(wù)器發(fā)送的特定頭 headers。目前是httplib.HTTPMessage 實(shí)例。經(jīng)典的 headers 包含"Content-length", "Content-type",和其他內(nèi)容。我們建一個(gè)urllib2_test11.py來(lái)測(cè)試一下info的應(yīng)用:pyth onview pla in copy1. from urllib2 import Request, urlopen, URLError, HTTPError2.2. old_url = ''3. req = Request(old_url)4. r

45、esponse = urlopen(req)5. print 'lnfo():'6. print ()運(yùn)行的結(jié)果如下,可以看到頁(yè)面的相關(guān)信息: |>»Inlo():Davs: Tue, 14 May 2013 DC!10:01 GMTServer: BWS/1.0CarLtenr-匚色 “©th: 10450ContentTyp已, text/ht.ni-1.; cii&=set;=iLtfBCacheContra 1 : priira'te5它匸-Cookie: BDSVRTH=4; path=/Set-Co

46、okie: H_PS_PSSID-2-42S_232_l-4_lS5_17Sfl_224; path-/; domain-, baldu.coniSec-Co Okie: 5ZDl;ZD=533 9D8D917EB5C3DEA80DAJ9-6B7A3ESA : ZG=1; e2cpires=Tue , le-Hay-4 06 :10;02 GMT; pavti=/' dorriain=心dirExpires; Tue 工號(hào) May 2013 Q6;10;01 GMTP3F:匚F" OTI DSP COR IVA OUF IND COM rConnec匸丄on: Clasei下

47、面來(lái)說(shuō)一說(shuō)ullib2中的兩個(gè)重要概念:Openers和Handlers。1.Ope ners當(dāng)你獲取一個(gè) URL 你使用一個(gè) opener( 個(gè) urllib2.OpenerDirector的實(shí)例)。正常情況下,我們使用默認(rèn) opener :通過(guò)urlopen 。但你能夠創(chuàng)建個(gè)性的 openers 。2. Ha ndlesOpeners使用處理器handlers,所有的“繁重”工作由handlers處理。每個(gè)handlers知道如何通過(guò)特定協(xié)議打開(kāi) URLs,或者如何處理URL 打開(kāi)時(shí)的各個(gè)方面。例女口 HTTP重定向或者HTTP cookies。如果你希望用特定處理器獲取 URLs你會(huì)想創(chuàng)

48、建一個(gè)openers ,例如獲 取一個(gè)能處理cookie的opener,或者獲取一個(gè)不重定向的 opener。要?jiǎng)?chuàng)建一個(gè)opener,可以實(shí)例化一個(gè)OpenerDirector ,然后調(diào)用.add_handler(some_handler_instanee)。同樣,可以使用build_ope ner ,這是一個(gè)更加方便的函數(shù),用來(lái)創(chuàng)建 opener對(duì)象,他只需要一次函數(shù)調(diào)用。build_ope ner默認(rèn)添加幾個(gè)處理器,但提供快捷的方法來(lái)添加或更新默認(rèn)處理器。其他的處理器handlers你或許會(huì)希望處理代理,驗(yàn)證,和其他常用但 有點(diǎn)特殊的情況。install_opener用來(lái)創(chuàng)建(全局)默認(rèn)o

49、pener 。這個(gè)表示調(diào)用urlopen將使用你安裝的opener。Opener 對(duì)象有一個(gè) open 方法。該方法可以像urlopen函數(shù)那樣直接用來(lái)獲取urls :通常不必調(diào)用in stall_ope ner ,除了為了方便。說(shuō)完了上面兩個(gè)內(nèi)容,下面我們來(lái)看一下基本認(rèn)證的內(nèi)容,這里會(huì)用到上面提及的Opener禾口 Handler。Basic Authe nticati on基本驗(yàn)證為了展示創(chuàng)建和安裝一個(gè)handler,我們將使用HTTPBasicAuthHa ndler 。當(dāng)需要基礎(chǔ)驗(yàn)證時(shí),服務(wù)器發(fā)送一個(gè)header(401錯(cuò)誤碼)請(qǐng)求驗(yàn)證。這個(gè)指定了 scheme和一個(gè) realm &#

50、39;,看起來(lái)像這樣:Www-authe nticate: SCHEME realm二"REALM".例如Www-authe nticate: Basic realm二"cPa nel Users"客戶(hù)端必須使用新的請(qǐng)求,并在請(qǐng)求頭里包含正確的姓名和密碼。這是“基礎(chǔ)驗(yàn)證”,為了簡(jiǎn)化這個(gè)過(guò)程,我們可以創(chuàng)建一個(gè)HTTPBasicAuthHandler的實(shí)例,并讓 opener 使用這個(gè) handler 就可以啦。HTTPBasicAuthHandler使用一個(gè)密碼管理的對(duì)象來(lái)處理URLs和realms來(lái)映射用戶(hù)名和密碼。如果你知道realm(從服務(wù)器發(fā)送來(lái)的

51、頭里)是什么,你就能使用HTTPPasswordMgr 。通常人們不關(guān)心realm是什么。那樣的話(huà),就能用方便的HTTPPasswordMgrWithDefaultRealm 。這個(gè)將在你為URL指定一個(gè)默認(rèn)的用戶(hù)名和密碼。這將在你為特定realm提供一個(gè)其他組合時(shí)得到提供。我們通過(guò)給realm參數(shù)指定None提供給add_password 來(lái)指示這種情況。最高層次的URL是第一個(gè)要求驗(yàn)證的 URL。你傳給.add_password()更深層次的URLs將同樣合適。說(shuō)了這么多廢話(huà),下面來(lái)用一個(gè)例子演示一下上面說(shuō)到的內(nèi)容。我們建一個(gè)urllib2_test12.py來(lái)測(cè)試一下info的應(yīng)用:py

52、th on view pla in copy1. # -*- coding: utf-8 -*-2. import urllib23.3. #創(chuàng)建一個(gè)密碼管理者4. password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()6.5. #添加用戶(hù)名和密碼8.6. top_level_url = "10.7. #如果知道realm,我們可以使用他代替''None''.8. # password_mgr.add_password(None, top_level_url, username, passwor

53、d)9. password_mgr.add_password(None, top_level_url,'why' , '1223')14.10. #創(chuàng)建了一個(gè)新的 handler11. handler = urllib2.HTTPBasicAuthHandler(password_mgr)17.12. # 創(chuàng)建"opener" (OpenerDirector實(shí)例)13. opener = urllib2.build_opener(handler)20.14. a_url = '22.15. #使用opener 獲取一個(gè) URL16.

54、opener.open(a_url)25.17. # 安裝 opener.18. #現(xiàn)在所有調(diào)用 urllib2.urlopen將用我們的opener.19. urllib2.install_opener(opener)29.30.注意:以上的例子我們僅僅提供我們的HHTPBasicAuthHa ndler 給build_ope ner默認(rèn)的 openers 有正常狀況的 handlers : ProxyHandler ,UnknownHandler, HTTPHandler , HTTPDefaultErrorHandler,HTTPRedirectHandler, FTPHandler ,

55、 FileHandler ,HTTPErrorProcessor 。代碼中的top_level_url實(shí)際上可以是完整 URL(包含"http:",以及主機(jī)名及可選的端口號(hào))。例如: 。也可以是一個(gè)“ authority ”(即主機(jī)名和可選的包含端口號(hào))。例口:“ ” or “:8080 ”。后者包含了端口號(hào)。Python網(wǎng)絡(luò)爬蟲(chóng)(五):urllib2的使用細(xì)節(jié)與抓站技巧前面說(shuō)到了 urllib2的簡(jiǎn)單入門(mén),下面整理了一部分urllib2的使用細(xì)節(jié)。1. Proxy 的設(shè)置urllib2默認(rèn)會(huì)使用環(huán)境變量http_proxy 來(lái)設(shè)置 HTTP Proxy。如果想在程序中明確控制Proxy而不受環(huán)境變量的影響,可以使用代理。新建test14來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代理Demo :pyth on view pla in copy1. import urllib22. enable_proxy = True3. proxy_handler = urllib2.ProxyHandler("http"

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論