Python網絡爬蟲數據解析方式總結與比較(供高手討論)

編程語言 Python 網絡爬蟲 HTML 跟著Guoery開心玩挖掘 2017-05-27

1.前言

大數據時代,數據的來源成員眾多公司和研究者的心頭疼,每家公司都說是自己的數據,都不會承認自己建設有網絡爬蟲,而實際上,你懂得。

一般網絡爬蟲爬取數據的過程是:

  1. 找到包含我們需要的信息的網址(URL)列表,存入待爬列表;

  2. 從待爬列表取出URL,通過 HTTP 協議把頁面內容下載回來;

  3. 從頁面的 HTML 中解析出需要的信息,或者找到更多的URL存入待爬列表;

  4. 判斷待爬列表是否為空,如果不為空,則回到 2 繼續。

顯然在整個這個過程中,獲取待爬URL列表和數據解析是網絡爬蟲的關鍵。關於如何找到待爬的URL的方式,本人在前面的幾篇文章中已經有詳細的介紹。而關於數據解析則由很多的方式,各個高手眾說紛紜,每人的使用習慣也不全一樣,本人拋磚引玉,對幾種方式做了一個總結,等待各位高手捧場。

(一個小九九:頭條裡面體育、情感、搞笑、明星類的文章閱讀量和評論互動蹭蹭蹭就上去了,而技術類的文章閱讀量則一直非常少,一方面是專業技術類的人本來就少,二來是在體育之類的文章裡每人都很容易做一個無所不能的噴子。因此我想借討論貼的模式,一方面讓大家共聚一堂,分享自己的成果,也吸取別人的經驗,另一方面也順便讓我的帖子沾點光。)

2.問題:需要提取下面圖中的舉報電話

Python網絡爬蟲數據解析方式總結與比較(供高手討論)

3.讓人又愛有恨的正則表達式

簡單的字符串處理,類似於split,substring等等我天天在用,可是你叫我寫一個Email的正則表達式,對不起,我還真的不會,只能找度娘。當然在部分的爬蟲數據解析的過程中,不可避免的要用到正則表達式,基礎的大家還是要會一點。

對於以上問題,如果用正則來做,那麼就可以採用以下Python程序:

Python網絡爬蟲數據解析方式總結與比較(供高手討論)

比如上面這個案例,(.*?)是正則匹配時的一個群,.和*可以匹配任意多個字符,加上?就是最小匹配,也就是非貪婪模式,或者說說就是匹配儘可能短的字符串。

4.Python爬蟲利器Beautiful Soup庫

官方文檔如下介紹:Beautiful Soup 是一個可以從 HTML 或 XML 文件中提取數據的 Python 庫.它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式.BeautifulSoup 不僅支持 HTML 解析器,還支持一些第三方的解析器,如,lxml,XML,html5lib但是需要安裝相應的庫。

4.1使用html.parser解析器

其原理這裡不做解釋,其python程序如下:

Python網絡爬蟲數據解析方式總結與比較(供高手討論)

4.2 使用lxml解析器

具體的python程序示例如下:

Python網絡爬蟲數據解析方式總結與比較(供高手討論)

5.Python網絡爬蟲利器lxml庫

lxml是Python語言裡和XML以及HTML工作的功能最豐富和最容易使用的庫。lxml是為libxml2和libxslt庫的一個Python化的綁定。它與眾不同的地方是它兼顧了這些庫的速度和功能完整性,以及純Python API的簡潔性,大部分與熟知的ElementTree API兼容但比之更優越。

利用lxml庫進行數據解析的時候,根據其對元素定位方法的不同,又可以分為採用xpath和採用cssselect兩種方式。

5.1 lxml中使用Xpath進行數據解析

XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷,使用Xpath是一種效率比較高的解析方法.

上面案例的Python程序如下:

Python網絡爬蟲數據解析方式總結與比較(供高手討論)

5.2 lxml中使用cssselect進行數據解析

借用其官網的一段話:

cssselect parses CSS3 Selectors and translate them to XPath 1.0 expressions. Such expressions can be used in lxml or another XPath engine to find the matching elements in an XML or HTML document.

也就是其本質上還是轉換為xpath進行結點定位,但如果你對JQuery特別熟悉的話,那麼使用cssselect也就非常順利了。

Python網絡爬蟲數據解析方式總結與比較(供高手討論)

6.分析比較

以上的幾種方式裡面到底選誰呢?可以從兩方面進行比較,解析耗費的時間和使用難度。

程序運行耗費時間比較:

將以上的代碼各執行10000次,計算運行時間,得到以下圖。

Python網絡爬蟲數據解析方式總結與比較(供高手討論)

可以發現執行最短的是正則表達式方法,而最慢的則是BS中的HTMLParser方法,同時我們也發現LXML中的cssselect方法要比LXML的xpath方法要忙,其實在前面的介紹就已經指出cssselect還是要轉換為xpath的,因此可以想象其肯定要比xpath慢。

使用難度:

在使用難度上,正則表達式毫無意外是最難的,而其他幾個則比較均衡。

結論:

根據以上分析,我們是不是可以得出一個小小的結論:使用Lxml的Xpath進行數據解析是比較合適的呢?比如在Scrapy爬蟲框架中,就是通過特定的 XPath或者 CSS表達式來“選擇” HTML文件中的某個部分。

當然,其實各種方法都有自身的優缺點,在不同的場合可以使用不同的方法。你們使用的情況如何呢?什麼是你的最愛?你遇到什麼坑?歡迎給大家分享一下。

相關推薦

推薦中...