任意網頁文章內容提?。ú杉┧惴?/h1>
分類: 程序開發 發布時間: 2014-04-09 01:22 瀏覽: 4,290 次

做過采集的人都知道,要采集一個網站,就要根據網站結構寫正則,這是最傳統的做法,這種做法優點就是采集精度可以做到非常細,可以采集任意結構的網站,不過這種做法也非常的具有局限性,一套規則只能使用于一個網站,遇上網站結構變動又要重新分析,調整規則,非常被動。

我就一直在想,如果程序可以做到人那樣的識別程度,那就可以采集任意網站正文內容了,上網找了下,果然已經有很多類似的算法了,主要有以下幾種:

1、基于Dom 樹
1)、利用開源包HTML Tidy 處理HTML,更正其中錯誤或不規范的地方;
2)、根據較規范的HTML 建立Dom 樹,然后遞歸遍歷Dom 樹,比較并識別各種非正文信息,包括廣告、鏈接群和非重要節點信息;廣告信息移除:需要建立經常更新的廣告服務器列表;鏈接群移除:計算網頁包含的鏈接個數同非鏈接的詞個數的比例;
3)、非正文信息移除后,Dom 樹中剩余的內容就是正文信息,直接從余下的樹節
點中抽取。
存在問題:Dom 樹的建立對HTML 是否良構要求較高,而且樹的建立和遍歷時空
復雜度高,樹遍歷方法也因HTML 標簽不同會有差異。

2、基于網頁分割找正文塊
1)、網頁正確分割后,正文提取工作簡化為對正文塊的判斷;
2)、分割是利用HTML 標簽中的分隔線以及一些視覺信息(如文字顏色、字體大小、文字信息等)。
存在問題:不同網站的HTML 風格迥異,分割沒有統一方法,通用性難以保證。

3、基于標記窗
1)、先取出文章標題;
2)、兩個標簽及其內部包含的文本合在一起稱為一個標記窗(比如<h1>text</h1>中text 就是標記窗內的文本),取出所有標記窗內的文字;
3)、對文章標題和每個標記窗內的文本分詞;
4)、計算標題序列與每個標記窗文本序列的詞語距離L,如果L 小于一個閾值,則將此標記窗內的文本看做是正文文本。
存在問題:標記窗的提法很好,但每個標記窗文本都要先分詞,在計算詞序列距離,效率?

4、基于數據挖掘或機器學習
用到了文本分類、聚類、隱馬模型、數據挖掘等。
存在問題:簡單問題復雜化。

5、基于邏輯行和最大接納距離的網頁正文抽取
1)、考慮人們編寫網頁時的一些啟發規則,考慮了正文的物理位置會靠的很近;
2)、做出以下推論:
HTML 每一行都表示一個完整的語義;
正文代碼在物理位置上會靠的很近;
正文代碼的一行中大都是文字;
正文代碼的一行中非HTML 標簽的文字數量較多;
正文代碼的一行中超鏈接長度所占比率不會很大;
3)、凡符合上述推論的代碼行被認為是一個正文行;
存在問題:正文在物理位置上的確會很接近,但標題很長的鏈接群以及較長的文章評論信息同樣滿足上述條件。仍要靠html 標簽做判斷。

6、基于行塊分布函數的通用網頁正文抽?。壕€性時間、不建DOM樹、與HTML標簽無關

首次將網頁正文抽取問題轉化為求頁面的行塊分布函數,這種方法不用建立Dom樹,不被病態HTML所累(事實上與HTML標簽完全無關)。通過在線性時間內建立的行塊分布函數圖,直接準確定位網頁正文。同時采用了統計與規則相結合的方法來處理通用性問題。作者相信簡單的事情總應該用最簡單的辦法來解決這一亙古不變的道理。整個算法實現代碼不足百行。但量不在多,在法。

項目網址:http://code.google.com/p/cx-extractor/

 

以上面算法都是來自第6種算法的分析論文。

第6種算法是我認為最好的算法,效率快,實現簡單。但也有不好的地方,這種算法主要針對的是采集文章,也就是文字內容多的網頁,因為其原理就是把網頁去標簽,然后分塊,哪一塊文本多就認為是正文,在使用的過程中發現如下問題:

1、不能采集圖片;

2、會誤采集鏈接聚集塊做正文,如:相關文章,文章導讀,這些地方標題加起來的文本有時會超過正文;

3、沒做標題識別。

對代碼做簡單的修復,就可以修復上面的問題:

1、保存圖片標簽,使用[img=x]代替;

2、保存鏈接文本,使用[a=x]代替鏈接塊;

3、標題識別比較容易,從title就可以拿到,再做簡單的過濾就可以。

修改后的程序匹配的結果比原算法匹配到的精準了很多,還有很大的調整空間,作者在論文中也說明了這一點。

目前程序還沒完全做到精準,個別類型網站還是不適用,比如相冊(純圖片),影視(線鏈接)。

 

應用實例:http://www.denhuo.com/

網站內內容是有些亂,基本不可用,還是垃圾網站一個。相信有朋友在百度會搜到類似的網站,不過那些網站可能不是這樣做的,也可能是單純的關鍵字堆積。

相信再改造下可以做到更精準匹配,結果會越來越好!

修復完善,到時會把代碼共享出來。請大家關注我的博客,拖鞋小站(http://www.bapingbao.top/),希望跟大家一起學習。

 

 

 

 

如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!

今日特肖