3種網頁抓取方法

      網友投稿 1081 2022-05-30

      3種抓取其中數據的方法。首先是正則表達式,然后是流行的BeautifulSoup模塊,最后是強大的lxml模塊。

      1 正則表達式

      如果你對正則表達式還不熟悉,或是需要一些提示,那么你可以查閱https://docs.python.org/2/howto/regex.html獲得完整介紹。即使你使用過其他編程語言的正則表達式,我依然推薦你一步一步溫習一下Python中正則表達式的寫法。

      由于每章中都可能構建或使用前面章節的內容,因此我建議你按照類似本書代碼庫的文件結構進行配置。所有代碼都可以從代碼庫的code目錄中運行,以便導入工作正常。如果你希望創建一個不同的結構,請注意需要變更所有來自其他章的導入操作(比如下述代碼中的from chp1.advanced_link_crawler)。

      當我們使用正則表達式抓取國家(或地區)面積數據時,首先需要嘗試匹配``元素中的內容,如下所示。

      從上述結果中可以看出,多個國家(或地區)屬性都使用了``標簽。如果我們只想抓取國家(或地區)面積,可以只選擇第二個匹配的元素,如下所示。

      雖然現在可以使用這個方案,但是如果網頁發生變化,該方案很可能就會失效。比如表格發生了變化,去除了第二個匹配元素中的面積數據。如果我們只在當下抓取數據,就可以忽略這種未來可能發生的變化。但是,如果我們希望在未來某一時刻能夠再次抓取該數據,就需要給出更加健壯的解決方案,從而盡可能避免這種布局變化所帶來的影響。想要該正則表達式更加明確,我們可以將其父元素``也加入進來,由于該元素具有ID屬性,所以應該是唯一的。

      這個迭代版本看起來更好一些,但是網頁更新還有很多其他方式,同樣可以讓該正則表達式無法滿足。比如,將雙引號變為單引號,``標簽之間添加多余的空格,或是變更area_label等。下面是嘗試支持這些可能性的改進版本。

      雖然該正則表達式更容易適應未來變化,但又存在難以構造、可讀性差的問題。此外,還有很多其他微小的布局變化也會使該正則表達式無法滿足,比如在``標簽里添加title屬性,或者tr、td元素修改了它們的CSS類或ID。

      從本例中可以看出,正則表達式為我們提供了抓取數據的快捷方式,但是該方法過于脆弱,容易在網頁更新后出現問題。幸好,還有更好的數據抽取解決方案,比如我們將在本章介紹的其他抓取庫。

      2 Beautiful Soup

      Beautiful Soup 是一個非常流行的Python庫,它可以解析網頁,并提供了定位內容的便捷接口。如果你還沒有安裝該模塊,可以使用下面的命令安裝其最新版本。

      使用Beautiful Soup的第一步是將已下載的HTML內容解析為soup文檔。由于許多網頁都不具備良好的HTML格式,因此Beautiful Soup需要對其標簽開合狀態進行修正。例如,在下面這個簡單網頁的列表中,存在屬性值兩側引號缺失和標簽未閉合的問題。

      如果Population列表項被解析為Area列表項的子元素,而不是并列的兩個列表項的話,我們在抓取時就會得到錯誤的結果。下面讓我們看一下Beautiful Soup是如何處理的。

      我們可以看到,使用默認的html.parser并沒有得到正確解析的HTML。從前面的代碼片段可以看出,由于它使用了嵌套的li元素,因此可能會導致定位困難。幸運的是,我們還有其他解析器可以選擇。我們可以安裝LXML(2.2.3節中將會詳細介紹),或使用html5lib。要想安裝html5lib,只需使用pip。

      現在,我們可以重復這段代碼,只對解析器做如下變更。

      此時,使用了html5lib的BeautifulSoup已經能夠正確解析缺失的屬性引號以及閉合標簽,并且還添加了和標簽,使其成為完整的HTML文檔。當你使用lxml時,也可以看到類似的結果。

      現在,我們可以使用find()和find_all()方法來定位我們需要的元素了。

      想要了解可用方法和參數的完整列表,請訪問Beautiful Soup的官方文檔。

      下面是使用該方法抽取示例網站中國家(或地區)面積數據的完整代碼。

      這段代碼雖然比正則表達式的代碼更加復雜,但又更容易構造和理解。而且,像多余的空格和標簽屬性這種布局上的小變化,我們也無須再擔心了。我們還知道即使頁面中包含了不完整的HTML,Beautiful Soup也能幫助我們整理該頁面,從而讓我們可以從非常不完整的網站代碼中抽取數據。

      3 Lxml

      Lxml 是基于libxml2這一XML解析庫構建的Python庫,它使用C語言編寫,解析速度比Beautiful Soup更快,不過安裝過程也更為復雜,尤其是在Windows中。最新的安裝說明可以參考http://lxml.de/installation.html。如果你在自行安裝該庫時遇到困難,也可以使用Anaconda來實現。

      你可能對Anaconda不太熟悉,它是由Continuum Analytics公司員工創建的主要專注于開源數據科學包的包和環境管理器。你可以按照其安裝說明下載及安裝Anaconda。需要注意的是,使用Anaconda的快速安裝會將你的PYTHON_PATH設置為Conda的Python安裝位置。

      和Beautiful Soup一樣,使用lxml模塊的第一步也是將有可能不合法的HTML解析為統一格式。下面是使用該模塊解析同一個不完整HTML的例子。

      同樣地,lxml也可以正確解析屬性兩側缺失的引號,并閉合標簽,不過該模塊沒有額外添加和標簽。這些都不是標準XML的要求,因此對于lxml來說,插入它們并不是必要的。

      3種網頁抓取方法

      解析完輸入內容之后,進入選擇元素的步驟,此時lxml有幾種不同的方法,比如XPath選擇器和類似Beautiful Soup的find()方法。不過,在本例中,我們將會使用CSS選擇器,因為它更加簡潔,并且能夠在第5章解析動態內容時得以復用。一些讀者可能由于他們在jQuery選擇器方面的經驗或是前端Web應用開發中的使用對它們已經有所熟悉。在本章的后續部分,我們將對比這些選擇器與XPath的性能。要想使用CSS選擇器,你可能需要先安裝cssselect庫,如下所示。

      現在,我們可以使用lxml的CSS選擇器,抽取示例頁面中的面積數據了。

      通過對代碼樹使用cssselect方法,我們可以利用CSS語法來選擇表格中ID為places_area__row的行元素,然后是類為w2p_fw的子表格數據標簽。由于cssselect返回的是一個列表,我們需要獲取其中的第一個結果,并調用text_content方法,以迭代所有子元素并返回每個元素的相關文本。在本例中,盡管我們只有一個元素,但是該功能對于更加復雜的抽取示例來說非常有用。

      針對Python 3.6版本編寫。

      提供示例完整源碼和實例網站搭建源碼,確保用戶能在本地成功復現爬取網站環境,并保障網站的穩定性與可靠性以及代碼運行結果的可再現性。

      Internet上包含了許多有用的數據,其中大部分是可以免費公開訪問的。但是,這些數據不容易使用,它們內嵌在網站的架構和樣式中,在提取時也需要多加小心。網絡爬取技術作為一種收集和理解網絡上海量信息的方式,正變得越來越有用。

      本書是使用Python 3.6的新特性來爬取網絡數據的入門指南。本書講解了從靜態網站提取數據的方法,以及如何使用數據庫和文件緩存技術來節省時間并管理服務器負載,然后介紹了如何使用瀏覽器、爬蟲和并發爬蟲開發一個更為復雜的爬蟲。

      借助于PyQt和Selenium,你可以決定何時以及如何從依賴JavaScript的網站上爬取數據,以及更好地理解在受CAPTCHA保護的復雜網站上提交表單的方法。本書還講解了使用Python包(比如mechanize)進行自動化處理的方法、使用Scrapy庫創建基于類的爬蟲的方法,以及如何在真實的網站上實施所學的爬蟲技巧。

      本書最后還涵蓋了使用爬蟲對網站進行測試、遠程爬取技術、圖像處理以及其他相關的主題。

      本文轉載自異步社區

      軟件開發 python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:nginx之詳細配置記錄
      下一篇:計算廣告:競價廣告計價算法、搜索廣告系統
      相關文章
      亚洲欧洲精品成人久久曰影片 | 亚洲成a人片在线观看无码专区 | 亚洲av无码乱码国产精品fc2| 国产成人精品日本亚洲专区| 亚洲第一区精品观看| 亚洲国产成人精品无码区二本| 亚洲最大成人网色香蕉| 亚洲国产成人99精品激情在线| 亚洲人成黄网在线观看| 亚洲人成在久久综合网站| 亚洲国产日韩在线一区| 亚洲综合校园春色| 久久亚洲国产成人影院| 一本色道久久88—综合亚洲精品 | 亚洲啪啪免费视频| 亚洲无成人网77777| 亚洲剧场午夜在线观看| 亚洲人成电影网站| 国产精品亚洲四区在线观看| 亚洲高清中文字幕免费| 亚洲一线产区二线产区区| 亚洲国产精品无码观看久久| 国产精品久久久久久亚洲影视| 狼人大香伊蕉国产WWW亚洲| va亚洲va日韩不卡在线观看| 亚洲国产成人久久综合一区77| 亚洲精品无码成人片在线观看 | 亚洲视频人成在线播放| 在线A亚洲老鸭窝天堂| 亚洲AV无码专区电影在线观看| 亚洲AV综合色区无码另类小说 | 国产亚洲精品仙踪林在线播放| 亚洲国产精品丝袜在线观看| 亚洲综合图色40p| 亚洲AV福利天堂一区二区三| 亚洲精品永久www忘忧草| 亚洲人成小说网站色| 亚洲AV成人片无码网站| 中文字幕亚洲综合久久男男| 亚洲成Av人片乱码色午夜| 久久精品国产亚洲AV无码偷窥|