零基礎入門學習Python爬蟲(第二節)

目錄:

  • 靜態網頁手動分析方法和工具

  • 網頁解析模塊 BeautifulSoup

  • 本講小結

  • 關於作者

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

靜態網頁手動分析方法和工具

我們以作者初學爬蟲時發現的一個站點作爲第一個案例,宅男可能會發現一個新大陸括弧笑,給大家隆重介紹這個站點——豆瓣妹子,放一張截圖激發一下大家學習的熱情:

零基礎入門學習Python爬蟲(第二節)



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

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

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

零基礎入門學習Python爬蟲(第二節)


在這一講裏,我們介紹的網頁主要內容不是由異步獲取的,而是隨網頁的加載同步生成的,因此主要用到的是開發者工具左上角元素選取工具(我是這麼叫的。。可能不專業),也就是下圖紅色框中的那個按鈕:

零基礎入門學習Python爬蟲(第二節)


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

零基礎入門學習Python爬蟲(第二節)


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

零基礎入門學習Python爬蟲(第二節)


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

零基礎入門學習Python爬蟲(第二節)


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

網頁解析模塊 – BeautifulSoup

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

BeautifulSoup是一個可以從HTML或XML文件中提取數據的Python庫。它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式。Beautiful Soup會幫你節省數小時甚至數天的工作時間。(解釋來自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:

零基礎入門學習Python爬蟲(第二節)


註釋1:這裏新建了一個Beautifulsoup對象,它有兩個必要的參數,第一個參數是HTML代碼對象,比如這裏content存儲了URL爲”https://www.dbmeinv.com/“的這張網頁的HTML代碼,它是個字符串或者是一個文件句柄第二個參數是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非標準庫的合集,專業治療各種pypi版模塊不能正確安裝的問題,裏面有很多模塊,選擇對應Python版本的就可以安裝了。網頁截圖如下:

零基礎入門學習Python爬蟲(第二節)


比如我們要安裝基於32位Python 3.5版本的lxml模塊,就可以按Ctrl + F查詢lxml然後找到如下圖的內容:

零基礎入門學習Python爬蟲(第二節)


點擊紅色框中的內容便可以下載,下載完成後,打開命令行 ,切換到下載文件的目錄,執行命令pip install lxml-4.1.1-cp35-cp35m-win32.whl(這裏一定要寫完整的文件名),便可以成功安裝lxml模塊了。

html5lib“模塊因爲作者沒使用過,所以不多說了,大家可以自行嘗試。

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

零基礎入門學習Python爬蟲(第二節)


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

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

 img_list = soup.find_all(name='img', attrs={'class': 'height_min'})

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

  • 註釋3:註釋2返回的是一個列表對象,包含了整張網頁上的圖片,因此這裏用一個循環,分別處理每一張圖片。

  • 註釋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)。

本講小結

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

  1. 靜態網頁的手動分析方法和工具

  2. 網頁解析模塊 —— BeautifulSoup

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

至於Beautifulsoup的功能也非常強大,作者這裏只是以取出圖片作爲一個例子,還可以取出很多的東西,至於有的童鞋想實現”翻頁下載“,我就給大家提供一個思路,就是去獲取頁面翻頁按鈕的鏈接地址,如果能發現什麼URL的規律,就很方便了,再嵌套一個for循環或者while循環就好了,如果沒什麼規律,那大概就是後面要說的動態頁面的內容了(我剛纔試了一下還是有規律的,大家可以舉一反三,自行嘗試)。另外,豆瓣妹子有反爬蟲系統,在爬取一定數量的圖片後,會無法爬取,這個我也將在後面爲大家講解。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章