2018-12-24 網頁爬蟲第二講

這一講,我會為大家講解常見的靜態(tài)頁面(同步加載)爬蟲技巧以及一般網頁的分析過程。

靜態(tài)網頁手動分析方法和工具我們以作者初學爬蟲時發(fā)現(xiàn)的一個站點作為第一個案例,宅男可能會發(fā)現(xiàn)一個新大陸括弧笑,給大家隆重介紹這個站點------豆瓣妹子(若鏈接失效請訪問:https://www.dbmeinv.com/)。

生活學習中,我們可能有時需要收集很多的圖片,比如做機器學習的圖像識別,就是建立在數(shù)以億計的圖片基礎上通過一定的算法訓練學習出來的。這里以這個網站為例,假裝我們需要下載很多的妹子的圖片。從這個網頁上看,妹子圖片是不少,但是要把這些圖片一一保存到我們的本地文件夾里,只能一個一個的在圖片上右鍵,選擇"圖片另存為",能不能由計算機快速的、批量的完成這一枯燥的工作呢?答案當然是肯定的,畢竟這是爬蟲專場教程。

首先,需要給大家科普的一點就是,爬蟲的核心并不是爬,而是對網頁的分析,拿到一個陌生的網頁,如何獲取到自己想要的最干凈、最簡潔、最穩(wěn)定的部分,才是爬蟲的奧義所在,因此,我將首先教大家如何分析一張簡單的網頁。

這里要用到的工具是Chrome Developer Tools。這是谷歌瀏覽器內嵌的一個開發(fā)者工具,我們可以按F12打開它,或者在網頁空白處右鍵,選擇檢查(N),或者按住默認快捷鍵Ctrl + Shift + I來召喚這個工具。開發(fā)者工具大概長下面這個樣子:


點擊一下這個按鈕,按鈕會變成藍色的選取狀態(tài),如下圖:

這時候將鼠標移至我們需要的網頁元素上,比如這里我們想下載圖片,就將鼠標移至圖片上,圖片上會出現(xiàn)一個淡藍色的浮層,如下圖所示:


美女

這時候再次點擊鼠標,開發(fā)者工具便會將代碼定位到圖片所在位置的代碼,并用藍色高亮顯示,如下圖所示:

在這里,我們可以在img標簽里找到圖片的真實地址。

網頁解析模塊 -- BeautifulSoup

以上是我們手動分析網頁的過程,那么如何用Python語言將這一過程自動化,實現(xiàn)批量的下載圖片呢?這里需要再給大家介紹一個新的模塊,叫做Beautifulsoup

BeautifulSoup是一個可以從HTML或XML文件中提取數(shù)據的Python庫。它能夠通過你喜歡的轉換器實現(xiàn)慣用的文檔導航,查找,修改文檔的方式。Beautiful Soup會幫你節(jié)省數(shù)小時甚至數(shù)天的工作時間。(解釋來自Beautiful Soup 4.2.0 文檔(若鏈接無法打開,請訪問https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html))

簡單的說,Beautifulsoup就是一個用來解析網頁的模塊,同樣,我們用第一講所說的pip工具來安裝,由于Beautifulsoup 3已經停止維護,Beautifulsoup模塊遷移到bs4,因此,我們需要在命令行輸入pip install bs4來完成Beautifulsoup模塊的安裝,完成后使用from bs4 import BeautifulSoup進行調用。

如第一講一樣, 先寫一個demo:

注釋1:這里新建了一個Beautifulsoup對象,它有兩個必要的參數(shù),第一個參數(shù)是HTML代碼對象,比如這里content存儲了URL為"https://www.dbmeinv.com/"的這張網頁的HTML代碼,它是個字符串或者是一個文件句柄第二個參數(shù)是HTML解析器,這個解析器可以使用內置標準的"html.parser",也可以安裝第三方的解析器,比如lxmlhtml5lib

說到"lxml"模塊的安裝,我們需要再一次使用第一講所提到的pip工具來安裝。按照第一講所說的,我們可以在命令行里直接輸入pip install lxml來安裝。但是,這里有點小問題,或許是不兼容,或許是其他什么原因,作者也沒有去詳細了解,導致無法正確安裝lxml模塊,在這里給大家推薦一個網站Unofficial Windows Binaries for Python Extension Packages(若鏈接失效請訪問:https://www.lfd.uci.edu/~gohlke/pythonlibs/),可以理解為這是一個Python非標準庫的合集,專業(yè)治療各種pypi版模塊不能正確安裝的問題,里面有很多模塊,選擇對應Python版本的就可以安裝了。網頁截圖如下:

附:幾種解析器的對比:(參考Beautifulsoup官方文檔)

注釋2:這里使用了soup對象的一個方法"find_all()",字面理解就是"找出所有的",那么找出什么,如何定位這個所謂的"什么"?這里就要傳入兩個參數(shù),第一個是HTML文檔的節(jié)點名,也可以理解為HTML的標簽名;第二個則是該節(jié)點的class類名,比如上面代碼中,我要找出該網頁上所有的img節(jié)點,且我需要的img節(jié)點的類名為"height_min"。但是對于一些沒有class類名的HTML元素我們該如何尋找?

我們還可以用到另一個屬性:attrs,比如這里可以寫成:


?attrs是字典類型,冒號左邊為關鍵字,右邊為關鍵字的值。不一定要通過class來查找某一個元素,也可以通過比如"id","name","type"等各種HTML的屬性,如果想要的元素實在沒有其他屬性,可以先定位到該元素的父屬性,再使用".children"定位到該元素。更多Beautifulsoup的高級用法請參考上面的"Beautiful Soup 4.2.0 文檔"。

注釋3:注釋2返回的是一個列表對象,包含了整張網頁上的圖片,因此這里用一個循環(huán),分別處理每一張圖片。

注釋4:因為img實際上是一個BeautifulSoup的Tag對象,所以可以通過"attrs"屬性將img解析為一個字典對象,通過鍵值"src"取出圖片的真實地址。

注釋5:同注釋4,取出了圖片的標題,作為圖片的文件名。

注釋6:這里需要重新請求圖片的地址,獲得圖片二進制的返回值,因為是圖片,所以不能用decode()解碼,必須以二進制的方式寫入,后面的寫入模式"wb",加了個"b"就是表示以二進制的形式,具體Python文件的讀寫請參考一篇博文:Python 文件I/O | 菜鳥教程(若鏈接失效請訪問:http://www.runoob.com/python/python-files-io.html)。

本講小結

本講主要為大家講解了兩個知識點:

靜態(tài)網頁的手動分析方法和工具

網頁解析模塊 ------ BeautifulSoup

在這里建議大家使用Google Chrome作為默認瀏覽器,當然FireFox也可以,作者比較偏好谷歌,個人喜好吧啊哈哈,還有就是Chrome的開發(fā)者工具確實很強大,還有其他很多功能將在后面的章節(jié)為大家繼續(xù)講解。

至于Beautifulsoup的功能也非常強大,作者這里只是以取出圖片作為一個例子,還可以取出很多的東西,至于有的童鞋想實現(xiàn)"翻頁下載",我就給大家提供一個思路,就是去獲取頁面翻頁按鈕的鏈接地址,如果能發(fā)現(xiàn)什么URL的規(guī)律,就很方便了,再嵌套一個for循環(huán)或者while循環(huán)就好了,如果沒什么規(guī)律,那大概就是后面要說的動態(tài)頁面的內容了(我剛才試了一下還是有規(guī)律的,大家可以舉一反三,自行嘗試)。另外,豆瓣妹子有反爬蟲系統(tǒng),在爬取一定數(shù)量的圖片后,會無法爬取,這個我也將在后面為大家講解。

這一講到此結束,感謝大家的耐心閱讀。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 3,122評論 1 3
  • 第一部分 創(chuàng)建爬蟲 重點介紹網絡數(shù)據采集的基本原理 : 如何用 Python 從網絡服務器 請求信息,如何對服務器...
    萬事皆成閱讀 2,294評論 0 5
  • 靈性指導 這段時間所做的事情都感覺好象是老天爺安排好的一樣,夢想成為金融方面理財規(guī)劃師的定位和角色終于實現(xiàn)了,不管...
    童鷺_閱讀 253評論 0 0
  • 2016年11月27日 星期日 早 這周集寧還是比較冷的,剛下完一場雪,不過一天天的又回溫了,感覺今年真的很不錯啊...
    無厘小阿先_閱讀 826評論 0 2
  • 最近好久也沒去宇宙中心,沉迷學習無法自拔。一個月左右的時間,又能見到大家啦~這一次更多的是溫馨的團聚,閃電、朱琳主...
    森和閱讀 226評論 1 0

友情鏈接更多精彩內容