版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
內容提內容提本書講解了如何使用P川lOil來編寫網絡爬蟲程序,內容包括網絡爬蟲簡介,從頁面中抓取數據的三種方法,提取緩存中的數據,使用多個線程和進程來進行并發(fā)抓取,如何抓取動態(tài)頁面中的內容,與表單進行交互,處理頁面中的驗證碼問題以及使ScarpyPortia來進行數據抓取,并在最后使用本書介紹的數據抓取技術對幾個真實的網站進行了抓取,旨在幫助讀者活學活用書中介紹的技術。本書適合有一定Python編程經驗,而且對爬蟲技術感興趣的讀者閱讀關于作來自澳大利亞關于作來自澳大利亞畢業(yè)于墨爾本大學計算機科學專業(yè)。業(yè)后,他創(chuàng)辦了一家專注于網絡爬蟲的公司,為超過50個國家的業(yè)務提供遠程工作。他精通于世界語,可以使用漢語和韓語對話,并且積極投身于開源軟件。他目前在牛津大學攻讀研究生學位,并利用業(yè)余時間研發(fā)自主無人機我要感謝TimothyBaldwin教授將我引入這個令人興奮的領域本書編寫時在巴黎招待我的ηiara可Douc以關于審稿Bur咄是一名常駐紐約的數據記者,關于審稿Bur咄是一名常駐紐約的數據記者,其工作是為華爾街日報繪交互式圖表。他在新墨西哥州立大學獲得了新聞學和信息系統(tǒng)專業(yè)位,然后在紐約城市大學新聞學研究院獲得了新聞學專業(yè)碩士學位我要感謝我的妻子isa鼓勵我協(xié)助本書的創(chuàng)作,的叔叔Mica耐心解答我的編程問題, 以及我的父親Richard激發(fā)了我對新聞學和寫作的熱愛WilliamSankey是一位數據專業(yè)人士,也是一位業(yè)余開發(fā)人員,生活在里蘭州科利奇帕克市。他于2012年畢業(yè)于約翰·霍普金斯大學,獲得了公政策碩士學位,專業(yè)方向為定量分析。他目前在 政策研究有限責任公&擔任健康服務研究員,從事與美國醫(yī)療保險和醫(yī)療補助服務中心(CMS)相關的項目。這些項目包括責任醫(yī)療機構評估以及精神病院住院患者預統(tǒng)監(jiān)測我要感謝我深愛的妻子Julia和頑皮的小貓Ruby,給予我全部的愛和AyushTiwari是一名Python開發(fā)者,本科就讀AyushTiwari是一名Python開發(fā)者,本科就讀于印度工學院羅克分校。發(fā)領域。對他而言,審閱本書是一個非常棒的經歷。他不僅是一名審稿人,也是一名狂熱的網絡爬蟲學習者。他向所有Python愛好者推薦本書,以便享他熱衷于Python網絡爬蟲,曾參與體育直播訂閱、通用P川lil電子商務網絡爬蟲(在Miran相關項目。Djo應用開發(fā)了就業(yè)門戶,幫助改善印度工學院羅克分他還使用的就業(yè)流程除了后端開發(fā)之外,他還喜歡使用諸如u上訪問到他的項目,他的用戶名是tiwariayush。他喜歡徒步穿越喜馬拉雅山谷,每年會參加多次徒步行走活動。此外,他還喜歡彈他的成就還包括參加國際知名Super30小組并在其中成為排名保持者。他在高中時,還參加了國際奧林匹克數學競賽。b我的家庭成員(我的姐姐Aditi、我的父母以及Anand先生)、我在VI和IMG的朋友以及我的教授都為我提供了很大的幫助。我要感謝他們所有人對我的支持。最后,感謝尊敬的ackt出版社團隊出版了這些非常好的技術我要對他們在編寫2..a.&.刷..a.&.刷互聯(lián)網包含了迄今為止最有用的數據集,并且大部分可以免費公開訪問。但是,這些數據難以復用。它們被嵌入在網站的結構和樣式當中,需要抽取出來才能使用。從網頁中抽取數據的過程又被稱為網絡爬蟲。隨著越來越的信息被發(fā)布到網絡上,網絡爬蟲也變得越來越有用第1章,網絡爬蟲簡介,介紹了網絡爬蟲,并講解了爬取網站的方法。第2章,數據抓取,展示了如何從網頁中抽取數據。第3章,下載緩存,學習了如何通過緩存結果避免重復下載的問題。第4章,并發(fā)下載,通過并行下載加速數據抓取。第5章,動態(tài)內容示了如何從動態(tài)網站中抽取數第6章,表單交互,展示了如何與表單進行交互而訪問你需要的數據。第7章,驗證碼處理,闡述了如何訪問被驗證碼圖像保護的數據。第8Scrapy學習了如何使用流行的高級cay第9章結,對我們介紹的這些網絡爬蟲技術進行總結前本書中所有的代碼都己經在Python前本書中所有的代碼都己經在Python環(huán)境中進行過測試,并且可以http//bitbucket.og/wspcode下載到這些源代碼理想情況下本書未來的版本會將示例代碼移植到Python3當中。不過,現(xiàn)在依賴的很多庫(比如Scrapy/Twisted、Mechaize和Ghost)還只支持Python2。為了幫助闡明爬取示例我們創(chuàng)建了一個示例其http//xaple.webscraping.com。由于該網站限制了下載內容的速度,因此如果你希望網站源代碼和安裝說明。我們決定為本書中使用的大部分示例搭建一個定制網而不是抓取活躍網站,這樣我們就對環(huán)境擁有了完全控制。這種方式為我們提供了穩(wěn)定性,因為活躍網站要比書中的定制網站更新更加頻繁,并且當你嘗試運行爬蟲示例時,代碼可能已經無法工作。另外,定制網站允許我們自定義示例,用于闡釋特定技巧并避免其他干擾。最后,活躍網站可能并不歡迎我們使用它作為學習網絡爬蟲的對象,并且可能會嘗試封禁我們的爬蟲。使用我們自己定制的網站可以規(guī)避這些風險,不過在這些例子中學到的技巧確實也可以應到這些活躍網站當中閱讀本書需要有一定的編程經驗,并且不適用于絕對的初學者。在實踐中我們將會首先實現(xiàn)我們自己的網絡爬蟲技術版本,然后才會介紹現(xiàn)有的流行這樣可以讓你更好地理解這些技術是如何工作的。本書中的這些示例塊假設你已經擁有Python語言以及使用pip安裝模塊的能力。如果你想復習一這些知識 有一本非常好的免費在線書籍可以使用,其作者為2前Pilri前Pilrim書籍網址是httpwwwdvetopythonnet。這本書也是我此外,這些例子還假設你己經了解網頁是如何使用HTML進行構建并過Jvcipt更新的知識的既有知識也很有用,不過它們不是必需的,這些技術會在需要使用時進行介紹。上述很多主題的詳細參考資料可以從http://.w3schols.獲取到3第1網絡網絡爬蟲是否合…………背景調 第1網絡網絡爬蟲是否合…………背景調 檢查網站地 估算網站大 識別網站所用技術尋找網站所有 …編寫第一個網絡爬蟲………8下載網 I遍歷爬蟲鏈接爬 本章小結… 第2數據抓分析網 三種網頁抓取方法正則表達 目BeautifuSoup·········………目BeautifuSoup·········………………………結論…………為鏈接爬蟲添加抓取回 本章小 第3下載緩為鏈接爬蟲添加緩存支持…·····················… 磁盤緩 實 緩存測 節(jié)省磁盤空間………………清理過期數 缺點…………·數據庫緩 NQL是什 …·…………安裝MongoD MongoDB緩存實 壓 緩存測…·”…………本章小結………第4并發(fā)下100萬個網 串行爬 多線程爬 2目線程和進程如何工 實 多進程爬 性 目線程和進程如何工 實 多進程爬 性 本章小結 第5動態(tài)內動態(tài)網頁示 對動態(tài)網頁進行逆向工程 渲染動態(tài)網 PyQt還是PySid 執(zhí)行JavaScri 使用WebKit與網站交 本章小 第6表單交第7登錄表 支持內容更新的登錄腳本擴 使Mechanize模塊實現(xiàn)自動化表單處 本章小結1驗證碼處注冊賬號 …·光學字符識別處理復雜驗證 111使用驗證碼處理服 9kw入 3與注冊功能集成本章小結 第8與注冊功能集成本章小結 第8安 …··啟動項目8.2.1定義模 l檢查結 中斷與恢復爬蟲”…………8.38.3安裝………標注優(yōu)化爬蟲 …·檢查結果 使用Scrapeyl實現(xiàn)自動化抓 本章小結……………第9總’40O2章中,我們將章中,我們將會介紹如下主題解釋合法性質疑對目標網站進行背景調研逐步完善一個高級網絡爬蟲1.設我有并且想要及時了解競爭對我可以每天訪問他們的網站,與我店鋪中鞋子的價格進行對比。但是,如果我店鋪中的鞋類品種繁多或是希望能夠更加頻繁地查看價格變化的話,就需要花費大量的時間,甚至難以實現(xiàn)。再舉一個例子,我看中了一雙鞋,想等促銷時再購買。我可能需要每天訪問這家鞋店的網站來查看這雙鞋是否價,也許需要等待幾個月的時間,我才能如愿盼到這雙鞋促銷上述兩個重復性的手工流程都可以利用本書介紹的網絡爬蟲技術實現(xiàn)自動處理1章網絡爬蟲簡P,1章網絡爬蟲簡P,P,但是它們通常會限制可以抓取的數據,以及訪問這些數據的頻率。另外對于網的開發(fā)者而言維護前端界面比維護后端API接口優(yōu)先級更高??偽覀儾荒軆H僅依賴于API去訪問我們所需的在線數據而是應該學習些網絡爬蟲技術的相關知識1網絡爬蟲目前還處于早期的蠻荒階段,允許哪些行為”這種基本秩序還處于建設之中。從目前的實踐來看,如果抓取數據的行為用于個人使用,則不存在問題而如果數據用于轉載那么抓取的數據類型就非常關鍵了。世界各地法院的一些案件可以幫助我們確定哪些網絡爬蟲行為是允Co的案件中,在Feist的國聯(lián)邦最高法院裁定抓取并轉載真實數據(比如,電話清單〉是允許的。而在澳大TelstraCorporationLimited起訴PhoneDirectoriesCompanyLtd這一類似案件中,則裁定只有擁有明確作者的數據,才可以獲得,是允許的最終裁定定期抓取和深度這些案件告訴我們,當抓取的數據是現(xiàn)實生活中的真實數據(比如電話清單)時,是允許轉載的。但是,如果是原創(chuàng)數據(比如,意地址和評論),通常就會受到版權限制,而不能轉載無論如何,當你抓取某個網站的數據時記住自己是該網站的訪客,應當約束自己的抓取行為,否則他們可能會封禁你的IP甚至采取更進一步的這就要求下載請求的速度需要限定在一個合理值之內 并且還法律行要設定一個專屬的用戶代理來標識自己。在下面的小節(jié)中我們將會對這些踐進行具體介紹21關于上述幾個法律案件的更多信息可以參考下述地址?getcase.?http://www.bvhd.dk/uploads/tx/SogHandelsrettensafgrelseiOfir-1在深入討論爬取一個網站之前,我們首先1關于上述幾個法律案件的更多信息可以參考下述地址?getcase.?http://www.bvhd.dk/uploads/tx/SogHandelsrettensafgrelseiOfir-1在深入討論爬取一個網站之前,我們首先需要對目標站點的規(guī)模和結構行一定程度的了解。網站自身的robots們提供一定的幫助,此外還有一些能提供更詳細信息的外部工具,比如Goog1.3.1檢查站t,站時存在哪些限制。這些限制雖然僅僅作為建議給出,但是良好的網絡公民都應當遵守這些限制。在爬取之前,檢查rob.txt文件這一寶貴資源可以最小站相關.們的示例文件robots.中的內容可以訪問httpexampwebscraping.co/ots.獲?。#?,戶--3aaBwoneq4tacasr·e1章網絡爬蟲#sectionU1章網絡爬蟲#sectionUser-agent:*Crawl-delay:5Disallow:/trap#sectionSitemap:http:///sitemap.Crl在sect爬蟲爬取該網站,不過這種寫法可能無法起到應有的作用,因為惡意爬蟲本不會遵從robots.txt的要求。章后面的一個子將會展示如何讓爬自動遵守robots的要求section2規(guī)定,無論使用哪種用戶代理,都應該在兩次下載請求之間給出5秒的抓取延遲,我們需要遵從該建議以避免服務器過載。這里還有一個trp鏈接用于封禁那些爬取了不允許鏈接的惡意爬蟲。如果你訪問了這個鏈接服務器就會封禁你的IP一分鐘!一個真實的網能會對你的IP封禁更長時間至是永久封禁不過如果這樣設置的話我們就無法section3義了一個Sitemap文我們將在下一節(jié)中了解如何檢1.3.2檢查網站地圖網站提供的Stemap文件(即網站地圖)可以幫助爬蟲定位網站最新的內容而無須爬取每一個網頁。如果想要了解更多信息可以從http:wwwsitemapsorprtocol.htl獲取網圖標的St<?xmlversion=1encoding=UTF8<urlsetxmlns=”httpwwwsitemapsorgschemassitemap/0.9<url><loc>http://example.webscraping.com/view/Afghanistan-</loc><<url><loc>http://example.webscraping.com/view/Aland-Islands-41</loc></url><url><loc>http:///view/Albania-3</1</loc></url><url><loc>http:///view/Albania-3</loc></urlset>網站地圖提供了所有網頁的鏈接,我們會在后面的小節(jié)中使用這些信息,用于創(chuàng)建我們的第一個爬蟲。雖然Siemap文件提供了一種爬取網站的有效方式但是我們仍需對其謹慎處理因為該文件經常存在缺失整的問題1.3.3估算網站大小目標網大小會影響我們如何進行爬取如果是像我們的示這樣只有幾百個URL的網站,效率并沒有那么重要:但如果是擁有數百萬個網頁的站點,使用串行下載可能需要持續(xù)數月才能完成,這時就需要使用第4章站可能已經爬取過我們感興趣的網。我們可以通過Goole搜索的site詞過濾域名結果,從而獲取該信息我們可以從http/w.search了解到該接口及其他高級搜索參數的用法com/adva口圖1.1所示為使用sie關鍵詞對我們的示例網站進行搜索的結果Google中搜site:example.webscraping.即從圖1.1中可以看出此時Google估算該網擁有個網頁,這和不過對于更大型的網站,我會發(fā)現(xiàn)Google的估算并不在域名后面添加URL路徑,可以對結果進行過濾僅顯示網某些部分。1.2所示為搜siteexamplewebscrapingcomview的結果該搜索條件會限制Google只搜索國家頁面51第章網絡爬蟲簡介Aboul202re田JltS伺45蕃AF?ExampleExam阱嗣b陽叩ing\¥盹腳.Ar目,聞geria·Angela·senin·Sotswana·刷刷1第章網絡爬蟲簡介Aboul202re田JltS伺45蕃AF?ExampleExam阱嗣b陽叩ing\¥盹腳.Ar目,聞geria·Angela·senin·Sotswana·刷刷Fa回·6田undlC副陌roonca陽Verde·C田11ra1Ari國nR邱刷lc·Chwebs掛NA-εxa『npleex翻F瑞E翼田胃pieweb缸萬冒pir咱w雹』畫捶.IJ。曲ArAn竄山l國Anti凱iaar晴B酣budaSaintEus恒屈JSNE姐 scrapingNalklnalFl咽’M回:1,267,00S嗯且惜據陽elli劇,問pula如n:10,676,27專lso:Country:IJ脅,.Cai就醋’Nlam町C曲睛酣吐AF.Tlcl:J班CurCode:NG-Examplewebsαapinge刷腳.wet刷刷lisol閘NationalFl啕:島國:923,768squa陽鬧。metres.Pcψul硝or應154,00口,00.1聰C咀Jntry:N精制a巳apl國EAlli!由acon劇團提:AFTld:.ngcurrencyC時居圖1.1About117明ults(0.52seamExampleweb部rapingNatio捕’F陸g:A,回:76squ町ekllom鈍國.Population:65,22苗,i四:GG.Cou晴y.G佳emse于“CapitalStPeterp。她Con伽entEU.Tld:.gg.CurrencyCode:GBP.Examplewebscraping回am樹e.w唾民臼撞倒fv梅w/Je陀曹y-113Nat陽nalF句:陽明:116呵U腳扭llornet陽.P句“l(fā)a切罰;閡,612.lso:JE.Country:Jerse滬PK-scrapingFl句:A陌a:8部,S鉛squa用kfm悅s.Population:184,404,791.國C由mtry:Pak陸;tan.Cap幅:1時ama缸ad.Cont加劇1l:AS“l(fā)ld:.pkCurrencyCodewebsite-C皿miry:Ma姐ysia.Ca回國:KualaL四npur.Con11nentAS.Tld:.my.C町rency町圖1這種附加的過濾條件非常有用,因為在理想情況下,你只希望爬取網站包含有用數據的部分,而不是爬取網站的每個頁面611識別網站所用構建網站所使用的技術類型也會對我們如何爬取11識別網站所用構建網站所使用的技術類型也會對我們如何爬取產生影響。有一個十分有用的工具可以檢查網構建的技術類型一-lwith模塊。該模塊的安裝pipinstallbuiltwi該模塊將URL為參數下載該URL并對其進行分析,然后返回該網站使用的技術。下面是使用該模塊的一個例子。》>imp。rtbuiltwi》>builtwith.parse(’http://example.webscraping.c。m’{ujavascriptfre。rks:[ujQl且ery,uM。dernizr,u’jQl且eryUI][u’Pyth。n’]u’pr。graming-languages’u’web-f。rks’ [u’Web2py’,u’TwitterB。。tstrap’]u’web-servers’:[u’Nginx’]從上面的返回結果中可以看出示例網用了Python的W2py框架,另外還使用了一些通用的Jvcript庫,因此該網內容很有可能是嵌在HML中的,相對而言比較容易抓取。而如果改用AngularJS構建該網,此時的網站內容就很可能是動態(tài)加載的。另外,如果網站使用了A.NET么在爬取網頁時,就必須要用到會話管理和表單提交了。的情況,我們會在第5章和第6章中進行介紹。對于這些更加復1.3.5對于一些網站我們可能會關心其所有者是誰。比如我們已知網站的絡爬蟲,那么我們最好把下載速度控制得更加保守一些為有者會封禁網找到網站的所有者我們可以使用O協(xié)議查詢域名的注冊者是誰。Pywhos7第l網絡爬蟲簡pipinstallpyth。n-wh。下面是使用該模塊a第l網絡爬蟲簡pipinstallpyth。n-wh。下面是使用該模塊ap.om這個域名進行WHOIS查詢時的返回》>ip。rtwh?!罚緋rintwhois.wh。is(’appsp。t.[:、四”NSlG。。GLECOM”NS2.G。。COMNS4G。。GLE”ns4.q。。qle.com”,”ns2.q。。qle.com”,”nsl.q。。qle.GLE]”。rq”:”G。。Inc”e啤ails”:[useclaints。nit。r.com”,”dnsad皿in@q。。glecom”從結果中可以看出該域名歸屬于Goog實際上也確實如此該域名用于GoogleppEngine服務的當我們爬取該域名時就需要分小因Google經常會阻斷網絡爬蟲,盡管實際上其自身就是一個網絡爬蟲業(yè)務1編寫第一個網絡爬為了抓取網,我們首先需要下載包含有感興趣數據的網頁該過程一般被稱為爬取(rawlng)爬取一個網站有很多種方法,而選用哪種方法更加合適則取決于目標網結構中首先會探討如何安全地下載網頁然后會介紹如下3種爬取網站的常見方法814編寫第一個網絡爬蟲爬取網站地圖遍歷每個網頁的數據庫D跟蹤網14編寫第一個網絡爬蟲爬取網站地圖遍歷每個網頁的數據庫D跟蹤網頁鏈接。下載網頁···1.4.要想爬取網頁,我們首先需要將其下載下來。下面的示例腳本使用模塊下載URLllbimporturllib2defdownload(url)returnurllib2url。pen(urlread當傳入URL參數時該函數將會下載網頁并返回其HTML。不過,這個代碼片段存在一個問題,即當下載網頁時,我們可能會遇到一些無法控制錯誤會拋出異常,然后比如請求的頁面可能不存在此時urlli腳本。安全起見,下面再給出一個更健壯的本,可以捕獲這些異常importurldefdownload(url)printD。wnl。adingurltryhtml=urllib2.urlopen(url).read()excepturllib2.URLErrorase:printDownladerrrereasnhtml=Nonereturn現(xiàn)在,當出現(xiàn)下載錯誤時該函數能夠捕獲到異常然后返回None1. 下載時遇到的錯誤經常是臨時性的,比如服務器過載時返回的ServiceUnavailable錯誤。對于此類錯誤,我們可以嘗試重新下載,因為這個服務器問題現(xiàn)在可能己解決。不過,我們不需要對所有錯誤都嘗試9wwwsimple00wwwsimple00.om電子書分享第1網絡爬蟲簡新下載如果服務器返回的是404otFound種錯誤則該網頁目前并不存在,再次嘗試同樣的請求一般也不會出現(xiàn)不同的結果。teretnT完整列表,詳情可參考https://oos.ietf.org/html/rfc7231#函數發(fā)生Sxx錯誤時重試下載即可。下面是支持重試下載功能的新本代碼defdownload(url,numretries=2printD。wnloadingurltry:html=urllib2.urlopen(url).read()excepturllib2.URLErrorase:print’Downloaderror:’,e.reasonhtml=Noneifnumretries>ifhasattr(e,’code’)and500<=e.code<600:#recursivelyretrySxxHTTPerrorsreturndownload(url,numretries-1)return現(xiàn)在,當download函數遇到Sxx錯誤碼時將會遞歸調用函數自身進行重試。此外函數增加了一個參數用于設定重試下載的次數其默認值為兩次我們在這里限網頁下載的嘗試次數是因為服務器錯誤時還沒有解決。想要測試函數,可以嘗試下載http://httpsat.us/500,該網址會始終返回500錯誤碼》>d。wnl。ad(’http://httpstatus500’Downl。adinghttp://httpstat.us/500D。wnloaderr。r:InternalServerErr。rD。wnl。ading:htp://httpstat.us/500Downloaderr。r:InternalServerErr。zD。wnl。ading: http://httpstat.us/500D。wnloaderr。r:InternalServerErr。r10wwwsimple00.om電子書分享wwwsimple000co機電子書分享14編寫第一個網絡爬蟲wwwsimple000co機電子書分享14編寫第一個網絡爬蟲從上面的返回結果可以看出,downoad函數的行為和預期一致,先嘗試下載網頁,在接收到500錯誤后,又進行了兩次重試才放棄。2.設置用戶代默認情況下,7作為用戶代理下使用Pythonurllib2.llb頁內容其27是Python的版本號。如果能使用可辨識的用戶代理則此外,也許是因為這樣可以避免我們的網絡爬蟲碰到一些問題更好歷過質量不佳的Python網爬蟲造成的服器過載,一些網站還會封默認的用戶代理。 比如,在使用P同il默認用戶代理的情況下,訪問http/wwwetupcom,前會返回如1.3所示的訪問拒絕提示Accessη1eownerofthiswebsite()hasbannedyouraccessbasedon(?RayID:Tim臼飽mp:Mon.06心ct-1418:55:48Yo咀rIPaddres:62Reques撞edURL:www.mee燦/E.π·orreferencenumber:I0IOerID:FL33Fser-????圖.3因此,為了下載更加可靠,我們需要控制用戶代理的設定下面的代碼download函數進行了修改,設定了一個默認的用戶代理wsw”(即WebScrapingwithPython的首字母縮寫)defd。wnload(urluseragent=wsnumretries=2printDownloadingurlheaders={’User-agent’:useragentrequest=urllib2.Request(url,headers=headerstry:=urllib2.urlopen(request)?readexcepturllib2.URLErrorasprint’Downloaderror:’,e.reasonhtml=11wwwsimple000co機電子書分享wwwsimple000co機電子書分享第l網絡爬蟲wwwsimple000co機電子書分享第l網絡爬蟲簡ifnumretries>ifhasattr(e, ’code’)and500<=e.code<600:#retry5XXHTTPerrorsreturndownl。ad(url,user agent,numretries-return現(xiàn)在,我們擁有了一個靈活函數,可以在后續(xù)示例中得到復用該函數能夠捕獲異常重試下載并設用戶代理1.網站地圖爬在第一個簡單的爬蟲中,我們將使用示例網站robots.txt文件中發(fā)現(xiàn)的網站地圖來下載所有網頁。為了解析網站地圖,我們將會使用一個簡單正則表達式,從<loc>標簽中提取出URL而在下一章中,我們將會介紹種更加健壯的解析方法一-css選擇器 下面是該示例爬蟲的代碼defcrawlsitemap(url)#downloadthesitemapfilesitemap=downl。adurl#extractthesitemaplinkslinks=re.findall(’<loc>(.*?)</loc>’,sitemap#downloadeachforlinkinlinkshtml=download(link)#scrapehtml?,F(xiàn)在,運行網站地圖爬蟲,從示例網站中下載所有國家頁面》crawl_sitemap(’http://example.webscraping.com/sitemap.xml’Dwnloading:http://example.webscraping.com/sit阻礙.mlhtp:/example.webscrapingc。/vinisn-D。loadn:D。wnl。ading:D。wnloading:http://example.webscraping.com/view/Aland-Islands-2htp://example.webscraping.com/view/Albania-3可以看出,上述運行結果和我們的預期一致,不過正如前文所述,我們無法依靠Siemap文件提供每個網頁的鏈接。下一節(jié)中,我們將會介紹另-簡單的爬蟲,該爬蟲不再依賴于iemap文件12wwwsimple000co機電子書分享www.simple000co算機電子書分享l.4編寫第一個網絡爬蟲1ID遍歷本節(jié)中,www.simple000co算機電子書分享l.4編寫第一個網絡爬蟲1ID遍歷本節(jié)中,我們將利用網站結構的弱點,更加輕松地訪問所有內容。下面是一些示例國家的URL。http:IIexample.webscrapi口/view/Afghanista口-1http:IIexample.webscrapiηg.com/view/Australia http:IIexample.webscrapi口g.com/view/Brazil???可以看出,這些URL只在結尾處有所區(qū)別,包括國家名(作為頁面別名和ID。在URL中包含頁面別名是非常普遍的做法可以對搜索引擎優(yōu)化起幫助作用。一般情況下,Web服務器會忽略這個字符串,只使用D來匹配據庫中的相關記錄。加載http://example.webscrapi呵.com/view/,測試示例網站中的鏈接是否仍然可用。測結果如圖所示NationalCo「647,500squa『eCu「rencyName:PostalCodeFormatfa”-AF,ps,uz-TMCNIRTJPKwww.simple000co算機電子書分享1章網絡爬蟲簡從圖中可以看出,網頁依然可以加載成功,也就是說該方法是有1章網絡爬蟲簡從圖中可以看出,網頁依然可以加載成功,也就是說該方法是有用的現(xiàn)在,我們就可以忽略頁面別名,只遍歷D來下載所有國家的頁面。下面importitertoolsforpageinitertoolscou口t1url=httpexample.webscrapingcom/view/-宅d屯html=download(url)ifhtmlisNone:breakelse:#success-ca口scrapetheresultpasD設此時已到達最后一個國家的頁面不過,這種實現(xiàn)方式存在一個缺陷,D到某個間隔點,爬蟲就會立即退出。下面是這段代碼的改進版本中連續(xù)發(fā)生多次下載錯誤后才會退出程序在該版#maximumnumberofconsecutivedownloaderrorsallowedmaxerrors=#currentnumberofconsecutivedownloaderrorsnumerrors=forpageiitertoolscountlurl=http/examplewebscrapingcom/view/-宅d屯html=download(url)ifhtmlisNone:#receivedannumerrors+=ifnumerrors#errortryingtodownloadthis1==maxerrorsmaximumnumber#consecutiveerrorssoexitbreakelse#success-canscrapetheresult#numerrors=wwwsimple00.om電子書分享14編寫第一個網絡爬蟲上面代碼中實現(xiàn)的爬蟲需要連續(xù)5wwwsimple00.om電子書分享14編寫第一個網絡爬蟲上面代碼中實現(xiàn)的爬蟲需要連續(xù)5次下載錯誤才會停止遍歷,這樣就很大站D,這種方法也無法保證始終可用。比如,一些網站會檢查頁面別名是否滿足預期果不是返回404NtFound錯誤而另一些網站則會使用連續(xù)大數作為ID,或是不使用數值作為ID,此時遍歷就難以發(fā)揮其作用了。例如Amazon使用SN作為圖書ID這種編碼包含至10位數字。使用D對Amazon的圖書進行遍歷需要測試數十億次,因此這種方法肯定不是取該站內容最高效的方法1鏈接爬到目前為止,我們已經利用示例網站的結構特點實現(xiàn)了兩個簡單爬蟲,用于下載所有的國家頁只要這兩種技術可用,就應當使用其進行爬因為這兩種方法最小化了需要下載的網頁數量。不過,對于另一些網站,我們讓爬更像普,感興內。通過跟蹤所有鏈接的方式,我們可以很容易地下載整個網站頁面但是,這種方法會下載大量我們并不需要的網頁。例如,我們想要從一個在線論壇中抓取用戶賬號詳情頁,那么此時我們只需要下載賬號頁,而不需要下載討論貼的頁面。本節(jié)中的鏈接爬蟲將使用正則表達式來確定需要下載哪些頁面。下面是這段代碼的初始版本importdeflink_crawler(seed_url,link_regex)”””CrawlfromthegivenseedURLfollowinglinksmatchedbylinkregex]。)-15wwwsimple00.om電子書分享eeaueelonesueww rqCeulewuweu4wwwsimple000.c算m機電子書分第1章網絡wwwsimple000.c算m機電子書分第1章網絡爬蟲簡#filterforlinksmatchingourregularexpressionforlinkingetlinks(html):ifre.match(linkregexlikcrawl_queue.append(link)defgetlinks(html)Retur口alistoflinksfrom#aregularexpressionextractalllinksfromthewebpageregex=pile(<a>]+href=[\]()[\re.#listofalllinksfromthewebpageretur口webpageregex.findall(html)’只需要調用licrawler函數,并傳入兩個參數要運行這段代碼要爬取的網站URL和用于跟蹤鏈接的正則表達式。對于示例網我們想爬取的是國家列表索引頁和國家頁面。其中,索引頁鏈接格式如下?http:IIxaple.webscraping.com/x/1http:IIxaple.webscraping.com土口dex/?國家頁鏈接格式如下http:I/xaple.webscraping.com//Afhaitan-httpI/examplewebscrapingcomview/Aland-Is口ds??因此,我們可以用/(index[view)/這個簡單的正則表達式來匹配這兩類網頁 當爬蟲使用這些輸入參數運行時會發(fā)生什么呢?你會發(fā)現(xiàn)我們得到如下的下載錯誤》>linkcrawler(http/’,’I(indexIview)’)Downloading:http://Downloading:/index/1Traceback(mostrecentcalllast)ValueError:unknownurltypeIidex/1wwwsimple000.c算m機電子書分www.simple000co算機電子書分享網.4編寫第一個網絡爬蟲可看出,出在下載/ndex/1時,該鏈接只有的路徑部分正在瀏覽哪個網頁,所以在瀏覽器瀏覽時,相對鏈接是能夠正常工作的但是llib2無法獲知上下文的為了讓需要www.simple000co算機電子書分享網.4編寫第一個網絡爬蟲可看出,出在下載/ndex/1時,該鏈接只有的路徑部分正在瀏覽哪個網頁,所以在瀏覽器瀏覽時,相對鏈接是能夠正常工作的但是llib2無法獲知上下文的為了讓需要將鏈接轉換為絕對鏈接的形式,以便包含定位2能夠定位網頁,我頁的所有細節(jié)。如你Pyton中確實有用來實現(xiàn)一功能的模塊該模塊稱為urparse面是licraler的改進版本使用urlparse模塊來創(chuàng)建絕對路徑importurlparsedeflink_crawler(seedurl,linkregex)”””CrawlfromthegivenseedURLfollowinglinksmatchedbylink---h(huán)tml=download(urlforlinkingetlinks(html)ifre.match(link_regex,link)lik=urlparseurljoinseedurllink)crawl_queue.append(link)當你運行這段代碼時,會發(fā)現(xiàn)雖然網頁下載沒有出現(xiàn)錯誤,但是同樣的點總是會被不斷下載到這是因為這些地點相互之間存在鏈接。比如,澳大利亞鏈接到了南極洲,而南極洲也存在到澳大利亞的鏈接,此時爬蟲就會要想避免重復爬取相同的鏈接它們之間不斷循環(huán)下去我們需現(xiàn)URL的功能,可以避免重復下載rwler函數,己具備存儲己deflinkcrawler(seedurl,linkregex)crawlqueue=[seedurl#keeptrackwhichURL’shaveseenbefore)口-)-)口www.simple000co算機電子書分享網14sppleueetaeuueeqoeSzurLeWoErereWacC1414eulErhcwewwwsimple00om電子書分享第wwwsimple00om電子書分享第l網絡爬蟲#checkiflinkmatchesexpectedregexifre.match(linkregex,link):#formabsolutelinklink=urlparseurljoin(seed_url,link)#checkifhavealreadyseenthislinkiflinknotiseenseen.crawlqueue.append(l當運行該腳本時,它會爬取所有地點,并且能夠如期停止。最終,我們得高級功現(xiàn)在,讓我們?yōu)殒溄优老x添加一些功能,使其在爬取其他網站時更用。解robot.txt首先,我們需要解析robots.txt文件,以避免下載禁止爬取的URL用Python自帶的robotparser模塊,就可以輕松完成這項工作,如下的代碼所示》>imp。rtz。b。》>rp=r。b。tparserRob。tFileParser()》>rp.set_urlhttp://ex四1plewebscraping.comrob。ts.txt’》>rpread()》》》url=’=’BadCrawlerrp.can_fetch(use?二agent url》》=G。。dCrawlerrpcan_fetch(user_agentlft函數確指定的用戶代理是否允許訪問網頁在本例中當用戶代理設為’BadCrawler’時,robotparser模塊會返回結果表明無法獲取網頁這和示例網robotstxt的定義一樣。18wwwsimple00om電子書分享wwwsimple00om電子書分享14編寫第一個網絡爬蟲為了將該功能wwwsimple00om電子書分享14編寫第一個網絡爬蟲為了將該功能集成到爬蟲中,我們需要在crawl循環(huán)中添加該檢查。whilecrawlqueuecrawl_queuep。purl#checkurlpassesrobots.txtrestrictionsifrp.can_fetch(user_agent,url):elseprintBl。ckedbyrobotstx支持代有時我們需要使用代理訪問某個網比如,Netflix屏蔽了美國以外大多數國家。使用ib支持代理并沒有想象中那么容易(可以嘗試使用更友好PythonHTTP模塊requests來實現(xiàn)該其文檔地址為http//)下面是使用ib支持代理的代碼proxyopener=urllib2.build_opener(pr。xyparams={urlparse.urlparse(url).scheme:proxy}。peneraddhandlerurllib2ProxyHandlerpr。xy_paramsresponse=openerpenrequestdefdownload(url,user_agent=’wswp’,proxy=None,num_retries=2)print’Downloading:’,urlheaders={’User-agent’user_agent}request=urllib2.Request(url,headers=headersopener=urllib2build一。penerifproxyproxyparams{urlparse.urlparse(url).scheme:proxy}openeraddhandlerurllib2Pr。xyHandler(proxyparams))tryhtml=openerpenrequestreadexcepturllib2URLErrorase:printDownladerrorereason19wwwsimple00om電子書分享算機電子書分享網1章網絡爬蟲簡介html=ifnumretries算機電子書分享網1章網絡爬蟲簡介html=ifnumretries>ifhasattr(e,’code’)and500<=e.code<#retrySXXHTTPerrorshtml=download(url,useragent,proxy,numretries-1)return下載F險。為了降低這些風險,我們可以在兩次下載之間添加延時,從而對爬蟲速下面是實現(xiàn)了該功能類的代碼classThrottle”””Addadelaybetweendownloadstothesamedef一_init一_(selfdelay)#amountofdelaybetweendownloadsforeachdomainself.delay=delay#timestampofwhenadomainwaslastaccess=self.{}defwait(self,url)domain=urlparseurlparseurl).netl。last_accessed=selfd。mainsget(domainifselfdelay>0andlastaccessedisn。tNonesleepsecs=self.delay-(datetime.datetime.now()lastaccessed).secondsifsleepsecs>#domainhasbeenaccessedrecently#soneedtosleeptime.sleep(sleepsecs)#updatethelastaccessedtimeselfd。mainsd。main=datetimedatetime-Trtte類記錄了每個域名上訪問的時間,如果當前時間距離上訪問時間小指定延時,則執(zhí)行睡眠操作。我們可以在每次下載之Throttle對爬蟲進行限速算機電子書分享網算機電子書分享網1編寫第一個網絡爬蟲thr。ttle=Throttledelay)throttle.wait(urlresult=download(url,headers,proxy=proxy,numretries=numretries)避免爬蟲陷目前,我們的爬蟲會跟蹤所算機電子書分享網1編寫第一個網絡爬蟲thr。ttle=Throttledelay)throttle.wait(urlresult=download(url,headers,proxy=proxy,numretries=numretries)避免爬蟲陷目前,我們的爬蟲會跟蹤所有之前沒有訪問過的鏈接。但是,一些網站會動態(tài)生成頁面內容,這樣就會出現(xiàn)無限多的網頁比如網有一個在線日歷功能,提供了可以訪問下個月和下一年的鏈接,那么下個月的頁面中同樣會包含訪問再下個月的鏈接,這樣頁面就會無止境地鏈接下去。這種情況被想要避免陷入爬蟲陷阱,一個簡單的方法是記錄到達當前網頁經過了多少個鏈接,也就是深度。當到達最大深度時,爬蟲就不再向隊列中添加該網頁中的鏈接了。要實現(xiàn)這一功能,我們需要修改seen變量。該變量原先只錄訪問過的網頁鏈接,現(xiàn)在修改為一個字典,增加了頁面深度的記錄deflinkcrawler(...,maxdepth=2):maxdepth=2口=電=--、。iflinknotinseen『+()該功能,只需將max_depth設為一個負數即可,此時當前深度永遠不會與最終版這個高級鏈接爬蟲的完整源代碼可以在https:bitbucket.or/li_w3算機電子書分享網1htpeeknupnilLnenersneeeshefd第1章網絡爬蟲試這段代碼,我們可以將用戶代理設置為BCrw也就是章第1章網絡爬蟲試這段代碼,我們可以將用戶代理設置為BCrw也就是章前文從下面的運行結果中可以述的被robts.屏蔽了的那個用戶代理爬蟲果然被屏蔽了,代碼啟動后馬上就會結束》》=’http://ex四iplewebscrapingc。lirgex=’/(ivie)》>link_crawler(seed_urlliregexuser_agent=’BadCrawler’Blockedbyrobots.txt:http://example.webscraping.現(xiàn)在,讓我們使用默認的用戶代理,并將最大深度設置為1,這樣只有主》>li」crawlerseed_urlliregexD。wnl。ading:http/examplewebscrapingcomindexDownl。adinghttp/examplewebscrapingc。m/index/lDownl。ading:D。wnl。ading:D。wnloading:Downloading:Downloading:D。wnloading:D。wnloading:D。wnlading:http://example.webscraping.cov-and-Barbuda-10http://exa皿l.webscraping.c。m/view/Antarctica-9http://example.webscraping.c。皿/iewuilla-ht://example.webscraping.com/view/Ang。la7http://example.webscraping.com/view/Andorra-http://ex皿1ple.webscraping.c。m/view/陽.erican-Sa5http://ex四ple.w,由scraping.com/view/Algeria-4http://example.webscraping.com/view/Albania-http:/examplewebscrapingcom/view/Aland-工sl2http://example.webscraping.c。m/view/Afghanistan-1和預期一樣,爬蟲在下載完國家列表的第一頁之后就停止了1.本章小結本章介紹了網絡爬蟲,然后開發(fā)了一個能夠在后章節(jié)中用的成熟蟲。此外,我們還介紹了一些外部工具和模塊的使用方法,用于了解網站網站地圖爬取延時以及各種爬取策略用戶代理我們將討論如何從己爬取到的網頁中獲取數據數據抓在上一章中,我們構建了一數據抓在上一章中,我們構建了一個爬蟲,可以通過跟蹤鏈接的方式下載我們所需的網頁。雖然這個例子很有意思, 卻不夠實用, 因為爬蟲在下載網頁之后又將結果丟棄掉了?,F(xiàn)在,我們需要讓這個爬蟲從每個網頁中抽取一些數據然后實現(xiàn)某些事情這種做法也被稱為抓取 首先,我們會介紹一FirebugLite的瀏覽器擴展,用于檢查網頁內容,如果你有一些網絡開發(fā)背景的話,可能己經對該擴展十分熟悉了。然后,BeautiSoup們會介紹三種抽取網頁數據的方法,分別是正則表達式lxml。最后,我們將對比這數據抓取方法2.分析網想要了解一個網頁的結構如何 可以使用查看源代碼的方法。在大多數覽器中,都可以在頁面上右鍵單擊選擇源代碼,如圖21所示pagesource選工頁,獲取網頁我們可以在H刊伍的下述代碼中找到我們感興趣的數據<table><trid=”places_national_flag_row”><tdclass=”w2p_fl”><labefor=”places_national_flag2id=”placesnationallabel”>National</label></td><tdclass=”w2pfw”><imgsrc=”/ <trid=”places口eighboursfor=”placesid=”placesrow"><tdclass=”w2plabel”>Neighbours:' 2id=”placesnationallabel”>National</label></td><tdclass=”w2pfw”><imgsrc=”/ <trid=”places口eighboursfor=”placesid=”placesrow"><tdclass=”w2plabel”>Neighbours:' class=”w2pLc;i.:ir1器244,820squarekilorne甘NationalCurrencyC創(chuàng)eCurrencyNamePostalCodeFo『SaveTranslatetons因ctw1ll1Firebug?en-GB,cy-GIuser-AgentInspect對于瀏覽器解析而言,缺失空白符和格式并無大礙,但在我們閱讀時則會造一定困難。要想更好地理解該表格,我們將使用FirebugLite擴展。該擴展適用于所有瀏覽器,我們可以通過https://getfirebugcomfirebuglite頁面獲取到該擴展。如果愿意的話,F(xiàn)irefox用戶可以安裝完整版的擴展,不過Lite版本己經包含了我們在本章和第6章中所用到的功能Firebug安裝完成后可以右鍵單擊我們在抓取中感興擴展,不過Lite版本己經包含了我們在本章和第6章中所用到的功能Firebug安裝完成后可以右鍵單擊我們在抓取中感興趣的網頁部分e然后在菜單中選擇Inspect如圖2.2所示Cu廳encyCurrencySaveTranslatetoViewpageVi四'/pageNeighbou「Inspect并顯示選中元素周此時,瀏覽器就會打開如圖2.3所示的Firebug面板,圍的HTML層次結構。如圖2.3所示 當選擇國家面積這一屬性時 我們可以從Firebug面板清晰地看到,該值包含在class為w2pfw的td>元素中,而<td>元素又ID為places arearowtr元素的子元素?,F(xiàn)在我們就獲取到需要抓取的面積數據的所有信息了e計算機電子書第2數據抓取Script臼bodydata計算機電子書第2數據抓取Script臼bodydatady-mini;"sectionid=可nain"class=陰陽inrow與日divclass=·pn旦、國<fomaction=”?!眅nctype=飛ultipart/fonn-data”mεthod=’'post”〉<tridplaces_nationaflag_rowtrid="lacsa_><tdclass="1"2p_fl”<td三種網頁抓取方現(xiàn)在我們已經了解了該網頁的結構,下面將要介紹三種抓取其中數據的方法。首先是正則表達式,然后是流行的BeautifulSoup模塊,最后是強的lxml模塊正則表達式還不熟悉,或是需要一些提示時httpsdocs.pytho日org/2/howtoregexhtml獲得完整介紹首先需要嘗試匹配<td>元素當我們使用正則表達式抓取面積數據時,的內容,如下所示?!贰倒port》>url=’httpelewebscrapi口gcom/view/Un工-Kingdom239》>html=download(url>>>re.findall(’<tdclass=”w2pw”(.*?)</td>’[’<imgsrc=”/places/stat工c/images/flags/gb.pnghtml/〉’計算機電子書2.2三種網頁抓取方法’244,820squarekilometres’’62.2三種網頁抓取方法’244,820squarekilometres’’62,348,7’,’G’UnitedKingd。m'L。ndonahref=letinent/EUEU/a>’,’.uk’,’GBP’,’Pound’,’@#@@I@##@@I自由##@日I@@##@@I@@@@I@@#自@@IGIRO"(([AZd2}[AZ2)I(AZ\d3}[AZ]2)([A-Z{2}\\d{2[A-Z]{2})I([A-Z]{2}\\d{3[-Z]{2}IAZd[AZdA』Z]2I([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})I(GIROA))$’’en-GB,cy-GB,gd’<divahref=isoEIEadiv從上述結果中可以看出,多個國家屬性都使用了<tdclassw2fw標簽。要想分離出面積屬性,我們可以只選擇其中的第二個元素,如下所示[lre.findall(’<tdclass=”w2pfw”>(.??)</td>html244820squarekilmetres雖然現(xiàn)在可以使用這個方案,但是如果網頁發(fā)生變化,該方案很可能就會失效。比如表格發(fā)生了變化,去除了第二行中的國土面積數據。如果我們只在現(xiàn)在抓取數據,就可以忽略這種未來可能發(fā)生的變化。但是,如果我們希望未來還能再次抓取該數據,就需要給出更加健壯的解決方案,從而盡可能避免這種布局變化所帶來的影響。想要該正則表達式更加健壯,我們可以將其父元素tr>也加入進來。由于該元素具有ID屬性,所以應該是唯一的》refindall(<trid=placesareaclass=”w2pfl”><labelfor=”placesareai”placesarealabel”>Area:</label><class=w2pfw()td,html[244820squarekilometreswwwsimple000om機電子書分wwwsimple000om機電子書分享網2章數據抓取這個迭代版本看起來更好一些,但是網頁更新還有很多其他方式,同樣可以讓該正則表達式無法滿足。比如,將雙引號變?yōu)閱我?,<td>標簽之間添加多余的空格,或是變更area label等。下面是嘗試支持這些可能性的改進版本》>refindall(<trid="places r。w>.??<td\sclass=[\’]w2pfw[\’]〉(</td’,html[’244,820squarekilometres’雖然該正則表達式更容易適應未來變化,但又存在難以構造、可讀性差的問題 此外 還有一些微小的布局變化也會使該正則表達式無法滿足在td>標簽里添加title屬性。比如從本例中可以看出,正則表達式為我們提供了抓取數據的快捷方式,但該方法過于脆弱,容易在網頁更新后出現(xiàn)問題。幸好,還有一些更好的解決方案,我們會在接下來的小節(jié)中繼續(xù)介紹。2.2.2BeautifulBeautifulSoup是一個非常流行Python模塊。該模塊可以解析網提供定位內容的便捷接口。如果你還沒有安裝該模塊,可以使用下面的命令安裝其最新版本pipinstallils。BeautifulSoup的第一步是將己下載的內容解析為soup文檔使由于大多數網頁都不具備良好的HTML格式,因此BeautifulSoup需要對其實際格式進行確定。例如,在下面這個簡單網頁的列表中,存在屬性值兩側引號缺失和標簽未閉含的問題<ulclass=country><li>Area<li>P。pulation</wwwsimple000om機電子書分享網算機電子書分享網2.2方法如果Population列表項被解析為Area列表項的子元素,而不是并的兩算機電子書分享網2.2方法如果Population列表項被解析為Area列表項的子元素,而不是并的兩個列表項的話,我們在抓取時就會得到錯誤的結果。下面讓我們看一BeautifulSoup是如何處理的①。》>frombs4importBeautifulSoup》》》》》br。kenhtml=<ulclass=country><li>Areali>Populationul#parsethesoup=BeautifulSoup(broken_html,’html.parser’fixedhtml=soup.prettifyprintfixed<ulclass=country<li>Area</工<li>Population</li></ul></body></Soup從上面的執(zhí)行結果中可以看出Beauti能夠正確解析缺失的引號并閉合標簽,此外還添加了<html>和<body>標簽使其成為完整findall()方法來定位我們需要的HTML文檔?,F(xiàn)在可以使用元素了find()》>ul=soupfind(ul’,attrs={class’coutry})ulfind(li)#returnsjustthefirst<li>Area</li>ulfindall(l)#returnsallmatche[¢除了…倒叫……檔li>ArealiliPopulatili其網址為:httpwww.crummycomsoftwareBeautifu1Soup/bs4doc/①譯者注2此處使用的是時也on內置庫,由于不同版本的容錯能力有所區(qū)別,讀者在實踐中可能無法得到正確結果。相關內容可參考zhttpswwwcrummy.comsoftware/Beautifu1Soup/bs4doc/installingaparser.算機電子書分享網2章數據抓取下面是使用該方法抽取示例國家面積數據的完整代碼》》frombs4importBeautifulSoup2章數據抓取下面是使用該方法抽取示例國家面積數據的完整代碼》》frombs4importBeautifulSoupurl=’http:///places/view/UnitedKingdom239’html=download(urlsoup=BeautifulSoup(html#1catethearea》》》》》》trtdareasoup.find(attrs={’id’:’places_area_row’})tr.find(attrs={’class’:’w2p_f’))#locate=td.text#extractthetextfromthisarea》>print244,820squarekilometres這段代碼雖然比正則表達式的代碼更加復雜,但更容易構造和理解。而且,像多余的空格和標簽屬性這種布局上的小變化,我們也無須再擔心了2.2.3Lxml是基于libxml2這一XML解析庫的Python封裝。該模塊使用語言編寫,解析速度比BeautifulSoup更快,不過安裝過程也更為復雜。最的安裝說明可以參考http://Lxmlde/installationhtml和Soup一樣,使lxml模塊的第一步也是將有可能不合法的HTML解析為統(tǒng)一格式。下面是使用該模塊解析同一個不完整HTML的例子》>importlxml》>brokenhtml=<ulclass=country><li>Area<li>Population<ul》》》tree=lxml.html.fromstring(broken_html)#parsethefixedhtml=lxml.html.tostring(tree,pretty_print=True)printfixed_htmlclass=”country"><li>Area</li><li>Population</li></lxml也可以正確解析屬性兩側缺失的引號,并閉合標簽不同樣地,該模塊沒有額外添加<html>和<body>標簽www.simple000co算機電子書分享網2.2三種網頁抓取方法解析完輸入內容之后, 進入選擇元www.s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版國際金融風險管理合同范本3篇
- 二零二五版建筑工地勞務用工及社會保障服務合同范本3篇
- 二零二五年酒店客房協(xié)議價優(yōu)惠合作合同3篇
- 2024政府采購合同環(huán)境與安全監(jiān)督協(xié)議3篇
- 2025年新型城鎮(zhèn)化項目水電設施安裝施工合同3篇
- 二零二五版板房租賃與租賃期滿資產評估與轉讓合同3篇
- 二零二五年度出租車司機服務規(guī)范與客戶滿意度提升合同3篇
- 二零二五年透水混凝土工程驗收與評估合同2篇
- 二零二五年智能交通管理系統(tǒng)采購合同3篇
- 二零二五版房屋代理租賃資產評估合同3篇
- 蓋洛普Q12解讀和實施完整版
- 2023年Web前端技術試題
- GB/T 20840.8-2007互感器第8部分:電子式電流互感器
- GB/T 14864-2013實心聚乙烯絕緣柔軟射頻電纜
- 品牌策劃與推廣-項目5-品牌推廣課件
- 信息學奧賽-計算機基礎知識(完整版)資料
- 發(fā)煙硫酸(CAS:8014-95-7)理化性質及危險特性表
- 數字信號處理(課件)
- 公路自然災害防治對策課件
- 耳鳴中醫(yī)臨床路徑
- 安徽身份證號碼前6位
評論
0/150
提交評論