網(wǎng)絡(luò)爬蟲(chóng):抓取網(wǎng)的含義和URL基本構(gòu)成_第1頁(yè)
網(wǎng)絡(luò)爬蟲(chóng):抓取網(wǎng)的含義和URL基本構(gòu)成_第2頁(yè)
網(wǎng)絡(luò)爬蟲(chóng):抓取網(wǎng)的含義和URL基本構(gòu)成_第3頁(yè)
網(wǎng)絡(luò)爬蟲(chóng):抓取網(wǎng)的含義和URL基本構(gòu)成_第4頁(yè)
網(wǎng)絡(luò)爬蟲(chóng):抓取網(wǎng)的含義和URL基本構(gòu)成_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Python網(wǎng)絡(luò)爬蟲(chóng)(一):抓取網(wǎng)頁(yè)的含義和 URL基本構(gòu)成、網(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ō)你在瀏覽器的地址欄中輸入 HYPERLINK 這個(gè)地址。打開(kāi)網(wǎng)頁(yè)的過(guò)程其實(shí)就是瀏覽器作為一個(gè)瀏覽的客戶端”,向服務(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就是在瀏覽器端輸入的 HYPERLINK 這個(gè)字符串。在理解URL之前,首先

3、要理解 URI的概念。什么是URI ?Web上每種可用的資源,如 HTML文檔、圖像、視頻片段、程序等都由一個(gè)通用資源標(biāo)志 符(Universal Resource Identifier , URI)進(jìn)行定位。URI通常由三部分組成: 訪問(wèn)資源的命名機(jī)制; 存放資源的主機(jī)名;資源自身 的名稱,由路徑表示。如下面的URI : HYPERLINK /myhtml/html1223/ /myhtml/html1223/我們可以這樣解釋它:_這是一個(gè)可以通過(guò) HTTP協(xié)議訪問(wèn)的資源, 位于主機(jī) HYPERLINK 上, 通過(guò)路徑/html/html40 ”訪問(wèn)。四、URL的理解和舉例URL是URI的一

4、個(gè)子集。它是Uniform Resource Locator的縮寫(xiě),譯為 統(tǒng)一資源定位 符” 通俗地說(shuō),URL是Internet上描述信息資源的字符串,主要用在各種WWW客戶程序和服務(wù)器程序上。二采用URL可以用一種統(tǒng)一的格式來(lái)描述各種信息資源,包括文件、服務(wù)器的地址和目錄等。URL的一般格式為(帶方括號(hào)口的為可選項(xiàng)):protocol :/ hostname:port / path / ;parameters?query#fragmentURL的格式由三部分組成:第一部分是協(xié)議(或稱為服務(wù)方式)。|第二部分是存有該資源的主機(jī)IP地址(有時(shí)也包括端口號(hào))。第三部分是主機(jī)資源的具體地址,如目錄和

5、文件名等。第一部分和第二部分用:7/ ”符號(hào)隔開(kāi),第二部分和第三部分用 /”符號(hào)隔開(kāi)。第一部分和第二部分是不可缺少的,第三部分有時(shí)可以省略。五、URL和URI簡(jiǎn)單比較URI屬于URL更低層次的抽象,一種字符串文本標(biāo)準(zhǔn)。換句話說(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ō)明要如何訪問(wèn)這個(gè)資源( http:/ )。卜面來(lái)看看兩個(gè)URL的小例子。.HTTP協(xié)議的URL示例:使用超級(jí)文本傳輸協(xié)議HTTP,提供超級(jí)文本信息服務(wù)的資源。例:

6、 HYPERLINK /channel/welcome.htm /channel/welcome.htm其計(jì)算機(jī)域名為 HYPERLINK 。超級(jí)文本文件(文件類(lèi)型為.html)是在目錄/channel下白w welcome.htm 。這是中國(guó)人民日?qǐng)?bào)的一臺(tái)計(jì)算機(jī)。例: HYPERLINK /talk/talk1.htm /talk/talk1.htm其計(jì)算機(jī)域名為 HYPERLINK 。超級(jí)文本文件(文件類(lèi)型為.html)是在目錄/talk下的talk1.htm 。這是瑞得聊天室的地址,可由此進(jìn)入瑞得聊天室的第1室。.文件的URL用URL表示文件時(shí),服務(wù)器方式用file表示,后面要有主機(jī)IP

7、地址、文件的存取路 徑(即目錄)和文件名等信息。有時(shí)可以省略目錄和文件名,但 /符號(hào)不能省略。例:file:/pub/files/foobar .txt上面這個(gè) URL代表存放在主機(jī) HYPERLINK 上的pub/files/目錄下的一個(gè)文件,文件名是 foobar.txt。例:file:/pub代表主機(jī) HYPERLINK 上的目錄/pub。例:file:/代表主機(jī) HYPERLINK 的根目錄。爬蟲(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 通

8、過(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è)獲取 URLs(Uniform Resource Locators)的組件。它以u(píng)rlopen函數(shù)的形式提供了一個(gè)非常簡(jiǎn)單的接口。最簡(jiǎn)單的urllib2的應(yīng)用代碼只需要四行。我們新建一個(gè)文件 urllib2_te

9、st01.py 來(lái)感受一下urllib2的作用:: import urllib2二 response = urllib2.urlopen( HYPERLINK / /)html = response.read()print html復(fù)制代碼按下F5可以看到運(yùn)行的結(jié)果:Python Shetlfile dit Shell Qebug Qption5 Windows HelpnSTRU=,T + p ;img.arc = http;/nscliGk,baiduTconi/gif?pid=201tpj=wwwsr5v_5id=:22 9_1945_17S 3_22 50i -+ sQ + patti

10、=+p+41= + Jiew Date () . getTime () ;return true ;if (/bbdime= H / . test (d. cootie) ) docuuieiic. write ( ocripT: src=* 1 + http: /si. bdsnacic.ccini/r/ww/cache/static/imt/js/apenjjre_bl5f449.js,r +charsetwut:f-8M) ; (function(; (var u G (nuF) *getElemanc33yTagName (a) z nv G(nv .fletELexentsBylag

11、Nanie (a, Ik = Gt lit) ,getElementaByTagNaire fa), un = jvar tj nv = news , tieba, Ehidaof niDp3r,fT7ide3rr, ir.apJ ; var tj Ik = baike*n ? f : bds . cditil. user ; functiof wenkrLi jr whaQli3Mf meren *n ? f : bds . cditil. user ; function _addTJ(obj)addEVabjr flrftouBedownHr function(e)var e e | wi

12、ndow.event;var target . target | | srcElement;ns_c fm : behs t tab : target. nair.a | | t j_user * r 1 un1 ;encodeURICoinpoTienc (un) ;for (vax 1 = 0; i u,length; i+) ( add!J(u itj + tj nvi;for(var i =) for (var 1 = 0; l tj + tj nvi;for(var i =0; i lJc. length; 1+ Lkl .naite = t j_T + t j_lk i ; ) (

13、) ; (f unctiaii () (var lin ks *在 士 *ward, hrtpi /newi.baidu. cani/.itis?tnnew3cl*2rn-20ct=lie*utf-3 f t j_tieba : kw, HYPERLINK http:/tieba http:/tieba. baidu.cam/f?ieutf-fi+ t *tj_zhidaa : 1 wo rd rhtt;p; /zhidao .baidu cora/3earah?pn-0trn=1061m=0 t tj_rp3 : r Jcey f http; / Jir.二m二二.匕三二3二.二d.Jmm三

14、?f二二三=二二干一三,t 二nr.工: ; f rtTp : 二二一三口三.巳三二:!二,cam/i?ct=201326S92&cl=2trLC=llin=-l tst=-l &Jn=fcdj.ci-jj.iLageisJt;ype=2 tfm=pv= &z=0sie=u tf-S / uj_video : word* t *htcp: /video.baidu. cam/v?ct-3019895 884s2Sfiie*urf-9 1 f 11 j_map : wd f http: /irap + taiducom/?newrr.ap-ltieutf-fi5s f 11 j_lsaike+

15、: 1 wordT, iittp : /toaikeloaidu, com/searGh/word?pic=lt3Uff=tenc=utfB , 1 twenJcu* ; 1 word * , r http : /wenkn.baidu.cDin/search?ie=iitf-8 1 ; var domArr = G ( nv f G ( Ifc1 ) , G 1 cp1) f kw = G (* lew*) ;fcr (var 1=0, 1 = donArr. length; 1 0 var wd = iteiLS 0 , 口= 1 = stents 1 f url = url 4- ( n

16、azreICamponent(, 1 + wd + 1 = f + key) : ( ( url.indexOf(1? f) 0 ? *1- + encodeURIConanenc(key ) );target.href - url; else target.href - targe z.href.mach(new RegExp(*htcpi/ +X0;name iL ns_cfm: b elis r *tab : nane, query ; encodeURIComponenv(key), ,un*: encodeURICosqKinent (bds irr:. user | | T 1 ;

17、) () ; addEV (w, lead, function () k. fccus ( ) ;w. 01112111 cad=func tlcm () 1 ;tryIdocument.coatie=nww_5T=;expires=5at r 01 Jan 2000 00:00: 00 GM?T;t;aicki. on tddDiuEEiilL . forms 0.日ubrr二七”,functidn O fvar t=new Date () , getTime () ; dccument. caokie = *WWW_ST=r -+ _t +n ; expires=,T + new Date

18、 (t + 10000) *roGMT5tring () ) Jcatch (t) K/acriptx/humlX! -bd56abcLS7008f2- ILn: 6 Col; 4我們可以打開(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: , URL同樣可以使用ftp: , file:等等來(lái)替代。HTTP是基于請(qǐng)求和應(yīng)答機(jī)制的:客戶端提出請(qǐng)求,服務(wù)端提供應(yīng)答。urllib2用一個(gè)Request對(duì)象來(lái)映射彳提出的 HTTP請(qǐng)求

19、。在它最簡(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)感受一下:、 import urllib2(1 req = urllib2.Request()response = urllib2.urlopen(req)S the_page = response.read()9 print the_page復(fù)制代碼可以看到輸出的內(nèi)容和test01是一樣的。url

20、lib2使用相同的接口處理所有的URL頭。例如你可以像下面那樣創(chuàng)建一個(gè)ftp請(qǐng)求。.11 req = urllib2.Request(ftp:/)復(fù)制代碼在HTTP請(qǐng)求時(shí),允許你做額外的兩件事。1.發(fā)送data表單數(shù)據(jù)這個(gè)內(nèi)容相信做過(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)形式。然后

21、做為data參數(shù)傳到Request對(duì)象。編碼工作使用urllib的函數(shù)而非urllib2。我們新建一個(gè)文件 urllib2_test03.py 來(lái)感受一下:,1.1 import urllibimport urllib213,1 u url = HYPERLINK /register.cgi /register.cgi:& values = name : WHY,I./location : SDU,language : Python 19 ) ) data = urllib.urlencode(values) #-I req = urllib2.Request(url, data)口 resp

22、onse = urllib2.urlopen(req)23 the_page = response.read()編碼工作#發(fā)送請(qǐng)求同時(shí)傳data表單#接受反饋的信息#讀取反饋的內(nèi)容復(fù)制代碼如果沒(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)傳送。import urllib2工,import urllib25二 data = 要dataname = WHY工 datalocation = SDU.1 datala

23、nguage = Python色url_values = urllib.urlencode(data)print url_values35name=Somebody+Here&language=Python&location=Northampton? url = HYPERLINK /example.cgi /example.cgifull_url = url + ? + url_values砥 data = urllib2.open(full_url)復(fù)制代碼這樣就實(shí)現(xiàn)了 Data數(shù)據(jù)的Get傳送。2.設(shè)置Headers 到http請(qǐng)求有一些站點(diǎn)不喜歡被程序(非人為訪問(wèn))訪問(wèn),或者發(fā)送不同版

24、本的內(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-Agent頭,當(dāng)你創(chuàng)建了一個(gè)請(qǐng)求對(duì)象,你可以給他一個(gè)包含頭數(shù)據(jù)的字典。下面的例子發(fā)送跟上面一樣的內(nèi)容,但把自身模擬成Internet Explorer 。(多謝大家的提醒,現(xiàn)在這個(gè) Demo已經(jīng)不可用了,不過(guò)原理還是那樣的)。 from urllib2 import Request, urlopen, URLError, HTTPError20.

25、I req = Request(http:/callmewhy)22二 try:X上i response = urlopen(req)X二 except HTTPError, e:羽;print The server couldnt fulfill the request.30l print Error code: , e.code爰?,except URLError, e:%print We failed to reach a server.3 print Reason: , e.reason空else:print No exception was raised.4|# everything

26、 is fine復(fù)制代碼和其他語(yǔ)言相似,try之后捕獲異常并且將其內(nèi)容打印出來(lái)。這里要注意的一點(diǎn),except HTTPError必須在第一個(gè),否則 except URLError將同樣接受到 HTTPError 。因?yàn)镠TTPError是URLError的子類(lèi),如果URLError在前面它會(huì)捕捉到所有的URLError (包括 HTTPError )。我們建一個(gè)urllib2_test09.py來(lái)示范一下第二種異常處理的方案:二巳 from urllib2 import Request, urlopen, URLError, HTTPError電出 req = Request( HYPERL

27、INK /callmewhy /callmewhy)益-好 try:47室 response = urlopen(req)except URLError, e:51:.】: if hasattr(e, code):53/iprint The server couldnt fulfill the request.55: aprint Error code: , e.code57elif hasattr(e, reason):汾. Pprint We failed to reach a server.616 1print Reason: , e.reason但K: else:(3print No

28、exception was raised.6# everything is fine復(fù)制代碼Python 網(wǎng)絡(luò)爬蟲(chóng)(四):Opener與Handler 的介紹和實(shí)例應(yīng)用在開(kāi)始后面的內(nèi)容之前,先來(lái)解釋一下urllib2中的兩個(gè)個(gè)方法:info and 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è)url

29、lib2_test10.py 來(lái)比較一下原始 URL和重定向的鏈接:from urllib2 import Request, urlopen, URLError, HTTPError等不71 old_url = HYPERLINK /b1UZuP /b1UZuP72 req = Request(old_url)3 response = urlopen(req)74 print Old url : + old_urlOld url ihnrp:/imrl-cn/blUZuPReal url :http:/www.polyuest_of_the_be3t_elevator_pitch _awari

30、i/bfcca_votirLg_prace5 s .ptip ?voted_cearriti=670fisectian=lfibbca year_id_3 I2.info():這個(gè)返回對(duì)象的字典對(duì)象,該字典描述了獲取的頁(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)用:飛 from urllib2 import Request, urlopen, URLError, HTTP

31、Error77用 old_url = HYPERLINK 為 req = Request(old_url):二 response = urlopen(req)$ print Info():口 print ()復(fù)制代碼運(yùn)行的結(jié)果如下,可以看到頁(yè)面的相關(guān)信息:三三 restart一二二三 Info(): Date: Tae, IT May 2013 06;10:01 GHT Server: BWS/1,Q Content-Length: 10450 Cantent-Type: text/html;chars&t=utf-8 Cache-Control; private Set-Cookie: BD

32、SVHTH-4; path=/ Seu-Conkie: H_PS_ESSID-242S_2362_1466_1945_1738_22A9_226O_2251; path-/; dortiin-. SetCcokie: BAIDUlD=SB39D3D917ES5C3DEAa0DAF9S57A3E5A; FG=1; expiTesue, 14-May- 3 06; 10 ; 01 GMT, paith=7; domain=. baidv, com Expirea: Tue, 14 May 2013 06:10:DI GMT P3F: CP- OTI DSP COR IVft OUR IND COM

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

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

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

36、指定了 scheme和 一個(gè) realm,看起來(lái)像這樣:Www-authenticate: SCHEME realm=REALM.例如Www-authenticate: Basic realm=cPanel Users _客戶端必須使用新的請(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)映射用戶名和密碼。如果你知道realm(從服務(wù)器發(fā)送來(lái)的頭里)是什么,你就能使用

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

38、ding: utf-8 -*-;import urllib285心#創(chuàng)建一個(gè)密碼管理者g7 password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()施出#添加用戶名和密碼9091 top_level_url = HYPERLINK /foo/ /foo/更免#如果知道realm,我們可以使用他代替None.第 # password_mgr.add_password(None, top_level_url, username, password)貨 password_mgr.add_password(None, top_level_url,

39、why, 1223)於#7 #創(chuàng)建了一個(gè)新的 handler58 handler = urllib2.HTTPBasicAuthHandler(password_mgr)筠ICO # 創(chuàng)建opened (OpenerDirector實(shí)例)101 opener = urllib2.build_opener(handler)Iffi16 a_url = HYPERLINK / /im#使用 opener獲取一個(gè) URL106 opener.open(a_url)107K # 安裝 opener.1(P #現(xiàn)在所有調(diào)用urllib2.urlopen 將用我們的 opener.110 urllib2.

40、install_opener(opener)111112復(fù)制代碼注意:以上的例子我們僅僅提供我們的HTTPBasicAuthHandler給build opener 。默認(rèn)的 openers 有正常狀況的 handlers : ProxyHandler , UnknownHandler , HTTPHandler , HTTPDefaultErrorHandler , HTTPRedirectHandler , FTPHandler , FileHandler , HTTPErrorProcessor 。代碼中的top_level_url實(shí)際上可以是完整URL(包含http:,以及主機(jī)名及可選

41、的端口號(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é)。I.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 :import urllib2e enable_proxy = Trueproxy_handler

42、= urllib2.ProxyHandler(http : http:8080)null_proxy_handler = urllib2.ProxyHandler()if enable_proxy:opener = urllib2.build_opener(proxy_handler)else:opener = urllib2.build_opener(null_proxy_handler)9 urllib2.install_opener(opener)復(fù)制代碼這里要注意的一個(gè)細(xì)節(jié),使用urllib2.install opener()會(huì)設(shè)置 urllib2 的全局 opener 。這樣后面的使

43、用會(huì)很方便,但不能做更細(xì)致的控制,比如想在程序中使用兩個(gè)不同的Proxy設(shè)置等。|比較好的做法是不使用install opener去更改全局的設(shè)置,而只是直接調(diào)用opener的open方法代替全局的urlopen 方法。.Timeout 設(shè)置在老版 Python中(Python2.6前),urllib2的API并沒(méi)有暴露 Timeout的設(shè)置,要設(shè)置 Timeout值,只能更改Socket的全局 Timeout 值。import urllib2.1.1 import socket12 socket.setdefaulttimeout(10) # 10秒鐘后超時(shí)13 urllib2.socket

44、.setdefaulttimeout(10) #另一種方式復(fù)制代碼在Python 2.6 以后,超時(shí)可以通過(guò) urllib2.urlopen() 的timeout參數(shù)直接設(shè)置。14 import urllib2I.: response = urllib2.urlopen(http:, timeout=10)復(fù)制代碼.在 HTTP Request 中加入特定的 Header要加入header ,需要使用Request對(duì)象::& import urllib2,1 request = urllib2.Request(http:/)IS request.add_header(User-Agent, f

45、ake-client),l response = urllib2.urlopen(request) , print response.read()復(fù)制代碼對(duì)有些header要特別留意,服務(wù)器會(huì)針對(duì)這些header做檢查User-Agent :有些服務(wù)器或 Proxy會(huì)通過(guò)該值來(lái)判斷是否是瀏覽器發(fā)出的請(qǐng)求Content-Type :在使用 REST接口時(shí),服務(wù)器會(huì)檢查該值,用來(lái)確定 HTTP Body中的內(nèi) 容該怎樣解析。常見(jiàn)的取值有:application/xml :在 XML RPC,如 RESTful/SOAP 調(diào)用時(shí)使用application/json :在 JSON RPC 調(diào)用時(shí)使用

46、application/x-www-form-urlencoded :瀏覽器提交 Web 表單時(shí)使用在使用服務(wù)器提供的RESTful或SOAP服務(wù)時(shí),Content-Type設(shè)置錯(cuò)誤會(huì)導(dǎo)致服務(wù)器拒絕服務(wù)4.Redirecturllib2默認(rèn)情況下會(huì)針對(duì)HTTP 3XX返回碼自動(dòng)進(jìn)行 redirect動(dòng)作,無(wú)需人工配置。要檢測(cè)是否發(fā)生了 redirect動(dòng)作,只要檢查一下Response的URL和 Request的URL是否致就可以了。| import urllib222 my_url = 23 response = urllib2.urlopen(my_url)X redirected = r

47、esponse.geturl() = my_url.?: print redirected35方 my_url = HYPERLINK /b1UZuP /b1UZuPresponse = urllib2.urlopen(my_url)redirected = response.geturl() = my_url1,print redirected復(fù)制代碼如果不想自動(dòng)redirect ,除了使用更低層次的httplib 庫(kù)之外,還可以自定義 HTTPRedirectHandler 類(lèi)。l import urllib2class RedirectHandler(urllib2.HTTPRedire

48、ctHandler):33 def http_error_301(self, req, fp, code, msg, headers):print 301pass36 def http_error_302(self, req, fp, code, msg, headers):?print 303pass39Op opener = urllib2.build_opener(RedirectHandler)| opener.open( HYPERLINK /b1UZuP /b1UZuP)復(fù)制代碼5.Cookieurllib2對(duì)Cookie的處理也是自動(dòng)的。如果需要得到某個(gè)Cookie項(xiàng)的值,可以這

49、么做:import urllib24, import cookielib-U cookie = cookielib.CookieJar()45 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)& response = opener.open()4;: for item in cookie:妙 print Name = +4; print Value = +item.value復(fù)制代碼運(yùn)行之后就會(huì)輸出訪問(wèn)百度的Cookie值:Haire = BAIDUIDValue = 67F3AB9024 9CDB85175F0

50、5DB33EB993:FGl = HPSPSSIDValue - 212S_1455_1945_17SS_225ONair.e = BDSVRTMValue = 176.使用 HTTP 的PUT 和 DELETE 方法urllib2 只支持 HTTP的 GET和POST方法,如果要使用 HTTP PUT和 DELETE ,只能 使用比較低層的 httplib庫(kù)。雖然如此,我們還是能通過(guò)下面的方式,使 urllib2能夠發(fā)出 PUT或DELETE的請(qǐng)求:import urllib2三| request = urllib2.Request(uri, data=data)52 request.get

51、_method = lambda: PUT # or DELETEresponse = urllib2.urlopen(request)復(fù)制代碼7.得到HTTP的返回碼對(duì)于200 OK來(lái)說(shuō),只要使用urlopen返回的response對(duì)象的getcode()方法就可以得到HTTP的返回碼。但對(duì)其它返回碼來(lái)說(shuō),urlopen會(huì)拋出異常。這時(shí)候,就要檢查異常對(duì)象的 code 屬性了 : import urllib2try::包response = urllib2.urlopen( HYPERLINK /why /why)?. except urllib2.HTTPError, e:Nprint e

52、.code復(fù)制代碼.Debug Log使用urllib2時(shí),可以通過(guò)下面的方法把debug Log打開(kāi),這樣收發(fā)包的內(nèi)容就會(huì)在屏幕上打印出來(lái),方便調(diào)試,有時(shí)可以省去抓包的工作import urllib2. h httpHandler = urllib2.HTTPHandler(debuglevel=1)(1: httpsHandler = urllib2.HTTPSHandler(debuglevel=1)Op opener = urllib2.build_opener(httpHandler, httpsHandler)色 urllib2.install_opener(opener)response = urllib2.urlopen()復(fù)制代碼這樣就可以看到傳輸?shù)臄?shù)據(jù)包內(nèi)容了:Eytnan 2.7 . a (detauit, Apr 1U工3: 31: N專(zhuān))MiiU v.ibUD 3N tit fint5 11J on win *32 Type copyright, r,rcxeditsrr ar license 0 rv for more infourjatian. RESTART jend: GET / HTTP/1lrnAccepu-Enc0dingi xdenuicyrXnHos: www.google,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論