python 網(wǎng)絡爬蟲.doc_第1頁
python 網(wǎng)絡爬蟲.doc_第2頁
python 網(wǎng)絡爬蟲.doc_第3頁
python 網(wǎng)絡爬蟲.doc_第4頁
python 網(wǎng)絡爬蟲.doc_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

抓取網(wǎng)頁的含義和URL基本構(gòu)成1、網(wǎng)絡爬蟲的定義網(wǎng)絡爬蟲,即Web Spider,是一個很形象的名字。把互聯(lián)網(wǎng)比喻成一個蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來爬去的蜘蛛。網(wǎng)絡蜘蛛是通過網(wǎng)頁的鏈接地址來尋找網(wǎng)頁的。從網(wǎng)站某一個頁面(通常是首頁)開始,讀取網(wǎng)頁的內(nèi)容,找到在網(wǎng)頁中的其它鏈接地址,然后通過這些鏈接地址尋找下一個網(wǎng)頁,這樣一直循環(huán)下去,直到把這個網(wǎng)站所有的網(wǎng)頁都抓取完為止。如果把整個互聯(lián)網(wǎng)當成一個網(wǎng)站,那么網(wǎng)絡蜘蛛就可以用這個原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁都抓取下來。這樣看來,網(wǎng)絡爬蟲就是一個爬行程序,一個抓取網(wǎng)頁的程序。網(wǎng)絡爬蟲的基本操作是抓取網(wǎng)頁。那么如何才能隨心所欲地獲得自己想要的頁面?我們先從URL開始。2、瀏覽網(wǎng)頁的過程抓取網(wǎng)頁的過程其實和讀者平時使用IE瀏覽器瀏覽網(wǎng)頁的道理是一樣的。比如說你在瀏覽器的地址欄中輸入 這個地址。打開網(wǎng)頁的過程其實就是瀏覽器作為一個瀏覽的“客戶端”,向服務器端發(fā)送了 一次請求,把服務器端的文件“抓”到本地,再進行解釋、展現(xiàn)。HTML是一種標記語言,用標簽標記內(nèi)容并加以解析和區(qū)分。瀏覽器的功能是將獲取到的HTML代碼進行解析,然后將原始的代碼轉(zhuǎn)變成我們直接看到的網(wǎng)站頁面。3、URI的概念和舉例簡單的來講,URL就是在瀏覽器端輸入的 這個字符串。在理解URL之前,首先要理解URI的概念。什么是URI?Web上每種可用的資源,如 HTML文檔、圖像、視頻片段、程序等都由一個通用資源標志符(Universal Resource Identifier, URI)進行定位。URI通常由三部分組成:訪問資源的命名機制;存放資源的主機名;資源自身 的名稱,由路徑表示。如下面的URI:/myhtml/html1223/我們可以這樣解釋它:這是一個可以通過HTTP協(xié)議訪問的資源,位于主機 上,通過路徑“/html/html40”訪問。4、URL的理解和舉例URL是URI的一個子集。它是Uniform Resource Locator的縮寫,譯為“統(tǒng)一資源定位 符”。通俗地說,URL是Internet上描述信息資源的字符串,主要用在各種WWW客戶程序和服務器程序上。采用URL可以用一種統(tǒng)一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。URL的格式由三部分組成:第一部分是協(xié)議(或稱為服務方式)。第二部分是存有該資源的主機IP地址(有時也包括端口號)。第三部分是主機資源的具體地址,如目錄和文件名等。第一部分和第二部分用“:/”符號隔開,第二部分和第三部分用“/”符號隔開。第一部分和第二部分是不可缺少的,第三部分有時可以省略。下面來看看兩個URL的小例子。1.HTTP協(xié)議的URL示例:使用超級文本傳輸協(xié)議HTTP,提供超級文本信息服務的資源。例:/channel/welcome.htm其計算機域名為。超級文本文件(文件類型為.html)是在目錄 /channel下的welcome.htm。這是中國人民日報的一臺計算機。例:/talk/talk1.htm其計算機域名為。超級文本文件(文件類型為.html)是在目錄/talk下的talk1.htm。這是瑞得聊天室的地址,可由此進入瑞得聊天室的第1室。2文件的URL用URL表示文件時,服務器方式用file表示,后面要有主機IP地址、文件的存取路 徑(即目錄)和文件名等信息。有時可以省略目錄和文件名,但“/”符號不能省略。例:file://pub/files/foobar.txt上面這個URL代表存放在主機上的pub/files/目錄下的一個文件,文件名是foobar.txt。例:file://pub代表主機上的目錄/pub。例:file://代表主機的根目錄。爬蟲最主要的處理對象就是URL,它根據(jù)URL地址取得所需要的文件內(nèi)容,然后對它 進行進一步的處理。因此,準確地理解URL對理解網(wǎng)絡爬蟲至關(guān)重要。利用urllib2通過指定的URL抓取網(wǎng)頁內(nèi)容所謂網(wǎng)頁抓取,就是把URL地址中指定的網(wǎng)絡資源從網(wǎng)絡流中讀取出來,保存到本地。類似于使用程序模擬IE瀏覽器的功能,把URL作為HTTP請求的內(nèi)容發(fā)送到服務器端, 然后讀取服務器端的響應資源。在Python中,我們使用urllib2這個組件來抓取網(wǎng)頁。urllib2是Python的一個獲取URLs(Uniform Resource Locators)的組件。它以urlopen函數(shù)的形式提供了一個非常簡單的接口。最簡單的urllib2的應用代碼只需要四行。我們新建一個文件urllib2_test01.py來感受一下urllib2的作用:pythonview plaincopy1. importurllib22. response=urllib2.urlopen(/)3. html=response.read()4. printhtml按下F5可以看到運行的結(jié)果:我們可以打開百度主頁,右擊,選擇查看源代碼(火狐OR谷歌瀏覽器均可),會發(fā)現(xiàn)也是完全一樣的內(nèi)容。也就是說,上面這四行代碼將我們訪問百度時瀏覽器收到的代碼們?nèi)看蛴×顺鰜?。這就是一個最簡單的urllib2的例子。除了http:,URL同樣可以使用ftp:,file:等等來替代。HTTP是基于請求和應答機制的:客戶端提出請求,服務端提供應答。urllib2用一個Request對象來映射你提出的HTTP請求。在它最簡單的使用形式中你將用你要請求的地址創(chuàng)建一個Request對象,通過調(diào)用urlopen并傳入Request對象,將返回一個相關(guān)請求response對象,這個應答對象如同一個文件對象,所以你可以在Response中調(diào)用.read()。我們新建一個文件urllib2_test02.py來感受一下:pythonview plaincopy1. importurllib22. req=urllib2.Request()3. response=urllib2.urlopen(req)4. the_page=response.read()5. printthe_page可以看到輸出的內(nèi)容和test01是一樣的。urllib2使用相同的接口處理所有的URL頭。例如你可以像下面那樣創(chuàng)建一個ftp請求。pythonview plaincopy1. req=urllib2.Request(/)在HTTP請求時,允許你做額外的兩件事。1.發(fā)送data表單數(shù)據(jù)這個內(nèi)容相信做過Web端的都不會陌生,有時候你希望發(fā)送一些數(shù)據(jù)到URL(通常URL與CGI通用網(wǎng)關(guān)接口腳本,或其他WEB應用程序掛接)。在HTTP中,這個經(jīng)常使用熟知的POST請求發(fā)送。這個通常在你提交一個HTML表單時由你的瀏覽器來做。并不是所有的POSTs都來源于表單,你能夠使用POST提交任意的數(shù)據(jù)到你自己的程序。一般的HTML表單,data需要編碼成標準形式。然后做為data參數(shù)傳到Request對象。編碼工作使用urllib的函數(shù)而非urllib2。我們新建一個文件urllib2_test03.py來感受一下:pythonview plaincopy1. importurllib2. importurllib23. 4. url=/register.cgi5. 6. values=name:WHY,7. location:SDU,8. language:Python9. 10. data=urllib.urlencode(values)#編碼工作11. req=urllib2.Request(url,data)#發(fā)送請求同時傳data表單12. response=urllib2.urlopen(req)#接受反饋的信息13. the_page=response.read()#讀取反饋的內(nèi)容如果沒有傳送data參數(shù),urllib2使用GET方式的請求。GET和POST請求的不同之處是POST請求通常有副作用,它們會由于某種途徑改變系統(tǒng)狀態(tài)(例如提交成堆垃圾到你的門口)。Data同樣可以通過在Get請求的URL本身上面編碼來傳送。pythonview plaincopy1. importurllib22. importurllib3. 4. data=5. 6. dataname=WHY7. datalocation=SDU8. datalanguage=Python9. 10. url_values=urllib.urlencode(data)11. printurl_values12. 13. name=Somebody+Here&language=Python&location=Northampton14. url=/example.cgi15. full_url=url+?+url_values16. 17. data=urllib2.open(full_url)這樣就實現(xiàn)了Data數(shù)據(jù)的Get傳送。2.設(shè)置Headers到http請求有一些站點不喜歡被程序(非人為訪問)訪問,或者發(fā)送不同版本的內(nèi)容到不同的瀏覽器。默認的urllib2把自己作為“Python-urllib/x.y”(x和y是Python主版本和次版本號,例如Python-urllib/2.7),這個身份可能會讓站點迷惑,或者干脆不工作。瀏覽器確認自己身份是通過User-Agent頭,當你創(chuàng)建了一個請求對象,你可以給他一個包含頭數(shù)據(jù)的字典。下面的例子發(fā)送跟上面一樣的內(nèi)容,但把自身模擬成Internet Explorer。pythonview plaincopy1. importurllib2. importurllib23. 4. url=/cgi-bin/register.cgi5. 6. user_agent=Mozilla/4.0(compatible;MSIE5.5;WindowsNT)7. values=name:WHY,8. location:SDU,9. language:Python10. 11. headers=User-Agent:user_agent12. data=urllib.urlencode(values)13. req=urllib2.Request(url,data,headers)14. response=urllib2.urlopen(req)15. the_page=response.read()異常的處理和HTTP狀態(tài)碼的分類先來說一說HTTP的異常處理問題。當urlopen不能夠處理一個response時,產(chǎn)生urlError。不過通常的Python APIs異常如ValueError,TypeError等也會同時產(chǎn)生。HTTPError是urlError的子類,通常在特定HTTP URLs中產(chǎn)生。1.URLError通常,URLError在沒有網(wǎng)絡連接(沒有路由到特定服務器),或者服務器不存在的情況下產(chǎn)生。這種情況下,異常同樣會帶有reason屬性,它是一個tuple(可以理解為不可變的數(shù)組),包含了一個錯誤號和一個錯誤信息。我們建一個urllib2_test06.py來感受一下異常的處理:pythonview plaincopy1. importurllib22. 3. req=urllib2.Request()4. 5. try:urllib2.urlopen(req)6. 7. excepturllib2.URLError,e:8. printe.reason按下F5,可以看到打印出來的內(nèi)容是:Errno 11001 getaddrinfo failed也就是說,錯誤號是11001,內(nèi)容是getaddrinfo failed2.HTTPError服務器上每一個HTTP 應答對象response包含一個數(shù)字狀態(tài)碼。有時狀態(tài)碼指出服務器無法完成請求。默認的處理器會為你處理一部分這種應答。例如:假如response是一個重定向,需要客戶端從別的地址獲取文檔,urllib2將為你處理。其他不能處理的,urlopen會產(chǎn)生一個HTTPError。典型的錯誤包含404(頁面無法找到),403(請求禁止),和401(帶驗證請求)。HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應的狀態(tài)。比如客戶端向服務器發(fā)送請求,如果成功地獲得請求的資源,則返回的狀態(tài)碼為200,表示響應成功。如果請求的資源不存在, 則通常返回404錯誤。HTTP狀態(tài)碼通常分為5種類型,分別以15五個數(shù)字開頭,由3位整數(shù)組成:-200:請求成功 處理方式:獲得響應的內(nèi)容,進行處理201:請求完成,結(jié)果是創(chuàng)建了新資源。新創(chuàng)建資源的URI可在響應的實體中得到 處理方式:爬蟲中不會遇到202:請求被接受,但處理尚未完成 處理方式:阻塞等待204:服務器端已經(jīng)實現(xiàn)了請求,但是沒有返回新的信 息。如果客戶是用戶代理,則無須為此更新自身的文檔視圖。 處理方式:丟棄300:該狀態(tài)碼不被HTTP/1.0的應用程序直接使用, 只是作為3XX類型回應的默認解釋。存在多個可用的被請求資源。 處理方式:若程序中能夠處理,則進行進一步處理,如果程序中不能處理,則丟棄301:請求到的資源都會分配一個永久的URL,這樣就可以在將來通過該URL來訪問此資源 處理方式:重定向到分配的URL302:請求到的資源在一個不同的URL處臨時保存 處理方式:重定向到臨時的URL304 請求的資源未更新 處理方式:丟棄400 非法請求 處理方式:丟棄401 未授權(quán) 處理方式:丟棄403 禁止 處理方式:丟棄404 沒有找到 處理方式:丟棄5XX 回應代碼以“5”開頭的狀態(tài)碼表示服務器端發(fā)現(xiàn)自己出現(xiàn)錯誤,不能繼續(xù)執(zhí)行請求 處理方式:丟棄-HTTPError實例產(chǎn)生后會有一個整型code屬性,是服務器發(fā)送的相關(guān)錯誤號。Error Codes錯誤碼因為默認的處理器處理了重定向(300以外號碼),并且100-299范圍的號碼指示成功,所以你只能看到400-599的錯誤號碼。BaseHTTPServer.BaseHTTPRequestHandler.response是一個很有用的應答號碼字典,顯示了HTTP協(xié)議使用的所有的應答號。當一個錯誤號產(chǎn)生后,服務器返回一個HTTP錯誤號,和一個錯誤頁面。你可以使用HTTPError實例作為頁面返回的應答對象response。這表示和錯誤屬性一樣,它同樣包含了read,geturl,和info方法。我們建一個urllib2_test07.py來感受一下:pythonview plaincopy1. importurllib22. req=urllib2.Request(/callmewhy)3. 4. try:5. urllib2.urlopen(req)6. 7. excepturllib2.URLError,e:8. 9. printe.code10. #printe.read()按下F5可以看見輸出了404的錯誤碼,也就說沒有找到這個頁面。3.Wrapping所以如果你想為HTTPError或URLError做準備,將有兩個基本的辦法。推薦使用第二種。我們建一個urllib2_test08.py來示范一下第一種異常處理的方案:pythonview plaincopy1. fromurllib2importRequest,urlopen,URLError,HTTPError2. 3. req=Request(/callmewhy)4. 5. try:6. 7. response=urlopen(req)8. 9. exceptHTTPError,e:10. 11. printTheservercouldntfulfilltherequest.12. 13. printErrorcode:,e.code14. 15. exceptURLError,e:16. 17. printWefailedtoreachaserver.18. 19. printReason:,e.reason20. 21. else:22. printNoexceptionwasraised.23. #everythingisfine和其他語言相似,try之后捕獲異常并且將其內(nèi)容打印出來。這里要注意的一點,except HTTPError 必須在第一個,否則except URLError將同樣接受到HTTPError。因為HTTPError是URLError的子類,如果URLError在前面它會捕捉到所有的URLError(包括HTTPError)。我們建一個urllib2_test09.py來示范一下第二種異常處理的方案:pythonview plaincopy1. fromurllib2importRequest,urlopen,URLError,HTTPError2. 3. req=Request(/callmewhy)4. 5. try:6. 7. response=urlopen(req)8. 9. exceptURLError,e:10. 11. ifhasattr(e,reason):12. 13. printWefailedtoreachaserver.14. 15. printReason:,e.reason16. 17. elifhasattr(e,code):18. 19. printTheservercouldntfulfilltherequest.20. 21. printErrorcode:,e.code22. 23. else:24. printNoexceptionwasraised.25. #everythingisfineOpener與Handler的介紹和實例應用在開始后面的內(nèi)容之前,先來解釋一下urllib2中的兩個個方法:info and geturlurlopen返回的應答對象response(或者HTTPError實例)有兩個很有用的方法info()和geturl()1.geturl():這個返回獲取的真實的URL,這個很有用,因為urlopen(或者opener對象使用的)或許會有重定向。獲取的URL或許跟請求URL不同。以人人中的一個超級鏈接為例,我們建一個urllib2_test10.py來比較一下原始URL和重定向的鏈接:pythonview plaincopy1. fromurllib2importRequest,urlopen,URLError,HTTPError2. 3. 4. old_url=/b1UZuP5. req=Request(old_url)6. response=urlopen(req)7. printOldurl:+old_url8. printRealurl:+response.geturl()運行之后可以看到真正的鏈接指向的網(wǎng)址:2.info():這個返回對象的字典對象,該字典描述了獲取的頁面情況。通常是服務器發(fā)送的特定頭headers。目前是httplib.HTTPMessage 實例。經(jīng)典的headers包含Content-length,Content-type,和其他內(nèi)容。我們建一個urllib2_test11.py來測試一下info的應用:pythonview plaincopy1. fromurllib2importRequest,urlopen,URLError,HTTPError2. 3. old_url=4. req=Request(old_url)5. response=urlopen(req)6. printInfo():7. ()運行的結(jié)果如下,可以看到頁面的相關(guān)信息:下面來說一說urllib2中的兩個重要概念:Openers和Handlers。1.Openers:當你獲取一個URL你使用一個opener(一個urllib2.OpenerDirector的實例)。正常情況下,我們使用默認opener:通過urlopen。但你能夠創(chuàng)建個性的openers。2.Handles:Openers使用處理器handlers,所有的“繁重”工作由handlers處理。每個handlers知道如何通過特定協(xié)議打開URLs,或者如何處理URL打開時的各個方面。例如HTTP重定向或者HTTP cookies。如果你希望用特定處理器獲取URLs你會想創(chuàng)建一個openers,例如獲取一個能處理cookie的opener,或者獲取一個不重定向的opener。要創(chuàng)建一個 opener,可以實例化一個OpenerDirector,然后調(diào)用.add_handler(some_handler_instance)。同樣,可以使用build_opener,這是一個更加方便的函數(shù),用來創(chuàng)建opener對象,他只需要一次函數(shù)調(diào)用。build_opener默認添加幾個處理器,但提供快捷的方法來添加或更新默認處理器。其他的處理器handlers你或許會希望處理代理,驗證,和其他常用但有點特殊的情況。install_opener 用來創(chuàng)建(全局)默認opener。這個表示調(diào)用urlopen將使用你安裝的opener。Opener對象有一個open方法。該方法可以像urlopen函數(shù)那樣直接用來獲取urls:通常不必調(diào)用install_opener,除了為了方便。說完了上面兩個內(nèi)容,下面我們來看一下基本認證的內(nèi)容,這里會用到上面提及的Opener和Handler。Basic Authentication 基本驗證為了展示創(chuàng)建和安裝一個handler,我們將使用HTTPBasicAuthHandler。當需要基礎(chǔ)驗證時,服務器發(fā)送一個header(401錯誤碼) 請求驗證。這個指定了scheme 和一個realm,看起來像這樣:Www-authenticate: SCHEME realm=REALM.例如Www-authenticate: Basic realm=cPanel Users客戶端必須使用新的請求,并在請求頭里包含正確的姓名和密碼。這是“基礎(chǔ)驗證”,為了簡化這個過程,我們可以創(chuàng)建一個HTTPBasicAuthHandler的實例,并讓opener使用這個handler就可以啦。HTTPBasicAuthHandler使用一個密碼管理的對象來處理URLs和realms來映射用戶名和密碼。如果你知道realm(從服務器發(fā)送來的頭里)是什么,你就能使用HTTPPasswordMgr。通常人們不關(guān)心realm是什么。那樣的話,就能用方便的HTTPPasswordMgrWithDefaultRealm。這個將在你為URL指定一個默認的用戶名和密碼。這將在你為特定realm提供一個其他組合時得到提供。我們通過給realm參數(shù)指定None提供給add_password來指示這種情況。最高層次的URL是第一個要求驗證的URL。你傳給.add_password()更深層次的URLs將同樣合適。說了這么多廢話,下面來用一個例子演示一下上面說到的內(nèi)容。我們建一個urllib2_test12.py來測試一下info的應用:pythonview plaincopy1. #-*-coding:utf-8-*-2. importurllib23. 4. #創(chuàng)建一個密碼管理者5. password_mgr=urllib2.HTTPPasswordMgrWithDefaultRealm()6. 7. #添加用戶名和密碼8. 9. top_level_url=/foo/10. 11. #如果知道realm,我們可以使用他代替None.12. #password_mgr.add_password(None,top_level_url,username,password)13. password_mgr.add_password(None,top_level_url,why,1223)14. 15. #創(chuàng)建了一個新的handler16. handler=urllib2.HTTPBasicAuthHandler(password_mgr)17. 18. #創(chuàng)建opener(OpenerDirector實例)19. opener=urllib2.build_opener(handler)20. 21. a_url=/22. 23. #使用opener獲取一個URL24. opener.open(a_url)25. 26. #安裝opener.27. #現(xiàn)在所有調(diào)用urllib2.urlopen將用我們的opener.28. urllib2.install_opener(opener)29. 30. 注意:以上的例子我們僅僅提供我們的HHTPBasicAuthHandler給build_opener。默認的openers有正常狀況的handlers:ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler,F(xiàn)TPHandler, FileHandler, HTTPErrorProcessor。代碼中的top_level_url 實際上可以是完整URL(包含http:,以及主機名及可選的端口號)。例如:/。也可以是一個“authority”(即主機名和可選的包含端口號)。例如:“” or “:8080”。后者包含了端口號。urllib2的使用細節(jié)與抓站技巧前面說到了urllib2的簡單入門,下面整理了一部分urllib2的使用細節(jié)。1.Proxy 的設(shè)置urllib2 默認會使用環(huán)境變量 http_proxy 來設(shè)置 HTTP Proxy。如果想在程序中明確控制 Proxy 而不受環(huán)境變量的影響,可以使用代理。新建test14來實現(xiàn)一個簡單的代理Demo:pythonview plaincopy1. importurllib22. enable_proxy=True3. proxy_handler=urllib2.ProxyHandler(http::8080)4. null_proxy_handler=urllib2.ProxyHandler()5. ifenable_proxy:6. opener=urllib2.build_opener(proxy_handler)7. else:8. opener=urllib2.build_opener(null_proxy_handler)9. urllib2.install_opener(opener)這里要注意的一個細節(jié),使用 urllib2.install_opener() 會設(shè)置 urllib2 的全局 opener 。這樣后面的使用會很方便,但不能做更細致的控制,比如想在程序中使用兩個不同的 Proxy 設(shè)置等。比較好的做法是不使用 install_opener 去更改全局的設(shè)置,而只是直接調(diào)用 opener 的 open 方法代替全局的 urlopen 方法。2.Timeout 設(shè)置在老版 Python 中(Python2.6前),urllib2 的 API 并沒有暴露 Timeout 的設(shè)置,要設(shè)置 Timeout 值,只能更改 Socket 的全局 Timeout 值。pythonview plaincopy1. importurllib22. importsocket3. socket.setdefaulttimeout(10)#10秒鐘后超時4. urllib2.socket.setdefaulttimeout(10)#另一種方式在 Python 2.6 以后,超時可以通過 urllib2.urlopen() 的 timeout 參數(shù)直接設(shè)置。pythonview plaincopy1. importurllib22. response=urllib2.urlopen(,timeout=10)3.在 HTTP Request 中加入特定的 Header要加入 header,需要使用 Request 對象:pythonview plaincopy1. importurllib22. request=urllib2.Request(/)3. request.add_header(User-Agent,fake-client)4. response=urllib2.urlopen(request)5. printresponse.read()對有些 header 要特別留意,服務器會針對這些 header 做檢查User-Agent : 有些服務器或 Proxy 會通過該值來判斷是否是瀏覽器發(fā)出的請求Content-Type : 在使用 REST 接口時,服務器會檢查該值,用來確定 HTTP Body 中的內(nèi)容該怎樣解析。常見的取值有:application/xml : 在 XML RPC,如 RESTful/SOAP 調(diào)用時使用application/json : 在 JSON RPC 調(diào)用時使用application/x-www-form-urlencoded : 瀏覽器提交 Web 表單時使用在使用服務器提供的 RESTful 或 SOAP 服務時, Content-Type 設(shè)置錯誤會導致服務器拒絕服務4.Redirecturllib2 默認情況下會針對 HTTP 3XX 返回碼自動進行 redirect 動作,無需人工配置。要檢測是否發(fā)生了 redirect 動作,只要檢查一下 Response 的 URL 和 Request 的 URL 是否一致就可以了。pythonview plaincopy1. importurllib22. my_url=3. response=urllib2.urlopen(my_url)4. redirected=response.geturl()=my_url5. printredirected6. 7. my_url=/b1UZuP8. response=urllib2.urlopen(my_url)9. redirected=response.geturl()=my_url10. printredirected如果不想自動 redirect,除了使用更低層次的 httplib 庫之外,還可以自定義HTTPRedirectHandler 類。pythonview plaincopy1. importurllib22. classRedirectHandler(urllib2.HTTPRedirectHandler):3. defhttp_error_301(self,req,fp,code,msg,headers):4. print3015. pass6. defhttp_error_302(self,req,fp,code,msg,headers):7. print3038. pass9. 10. opener=urllib2.build_opener(RedirectHandler)11. opener.open(/b1UZuP)5.Cookieurllib2 對 Cookie 的處理也是自動的。如果需要得到某個 Cookie 項的值,可以這么做:pythonview plaincopy1. importurllib22. importcookielib3. cookie=cookielib.CookieJar()4. opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)5. response=opener.open()6. foritemincookie:7. printName=+8. printValue=+item.value運行之后就會輸出訪問百度的Cookie值:6.使用 HTTP 的 PUT 和 DELETE 方法urllib2 只支持 HTTP 的 GET 和 POST 方法,如果要使用 HTTP PUT 和 DELETE ,只能使用比較低層的 httplib 庫。雖然如此,我們還是能通過下面的方式,使 urllib2 能夠發(fā)出 PUT 或DELETE 的請求:pythonview plaincopy1. importurllib22. request=urllib2.Request(uri,data=data)3. request.get_method=lambda:PUT#orDELETE4. response=urllib2.urlopen(request)7.得到 HTTP 的返回碼對于 200 OK 來說,只要使用 urlopen 返回的 response 對象的 getcode() 方法就可以得到 HTTP 的返回碼。但對其它返回碼來說,urlopen 會拋出異常。這時候,就要檢查異常對象的 code 屬性了:pythonview plaincopy1. importurllib22. try:3. response=urllib2.urlopen(/why)4. excepturllib2.HTTPError,e:5. printe.code8.Debug Log使用 urllib2 時,可以通過下面的方法把 debug Log 打開,這樣收發(fā)包的內(nèi)容就會在屏幕上打印出來,方便調(diào)試,有時可以省去抓包的工作pythonview plaincopy1. importurllib22. httpHandler=urllib2.HTTPHandler(debuglevel=1)3. httpsHandler=urllib2.HTTPSHandler(debuglevel=1)4. opener=urllib2.build_opener(httpHandler,httpsHandler)5. urllib2.install_opener(opener)6. response=urllib2.urlopen()這樣就可以看到傳輸?shù)臄?shù)據(jù)包內(nèi)容了:9.表單的處理登錄必要填表,表單怎么填?首先利用工具截取所要填表的內(nèi)容。比如我

溫馨提示

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

評論

0/150

提交評論