項目起源
開發這個項目,源自于我在知網發現了一篇關于自動化抽取新聞類網站正文的算法論文——《基于文本及符號密度的網頁正文提取方法》
這篇論文中描述的算法看起來簡潔清晰,并且符合邏輯。但由于論文中只講了算法原理,并沒有具體的語言實現,所以我使用 Python 根據論文實現了這個抽取器。并分別使用今日頭條、網易新聞、游民星空、觀察者網、鳳凰網、騰訊新聞、ReadHub、新浪新聞做了測試,發現提取效果非常出色,幾乎能夠達到100%的準確率。
項目現狀
在論文中描述的正文提取基礎上,我增加了標題、發布時間和文章作者的自動化探測與提取功能。
最后的輸出效果如下圖所示:
目前這個項目是一個非常非常早期的 Demo,發布出來是希望能夠盡快得到大家的使用反饋,從而能夠更好地有針對性地進行開發。
本項目取名為抽取器,而不是爬蟲,是為了規避不必要的風險,因此,本項目的輸入是 HTML,輸出是一個字典。請自行使用恰當的方法獲取目標網站的 HTML。
本項目現在不會,將來也不會提供主動請求網站 HTML 的功能。
如何使用
項目代碼中的GeneralNewsCrawler.py提供了本項目的基本使用示例。
- 本項目的測試代碼在test文件夾中
- 本項目的輸入 HTML 為經過 JavaScript 渲染以后的 HTML,而不是普通的網頁源代碼。所以無論是后端渲染、Ajax 異步加載都適用于本項目。
- 如果你要手動測試新的目標網站或者目標新聞,那么你可以在 Chrome 瀏覽器中打開對應頁面,然后開啟開發者工具,如下圖所示:
在Elements標簽頁定位到標簽,并右鍵,選擇Copy-Copy OuterHTML,如下圖所示
- 當然,你可以使用 Puppeteer/Pyppeteer、Selenium 或者其他任何方式獲取目標頁面的JavaScript渲染后的源代碼。
- 獲取到源代碼以后,通過如下代碼提取信息:
from GeneralNewsCrawler import GeneralNewsExtractorextractor = GeneralNewsExtractor()html = '你的目標網頁正文'result = extractor.extract(html)print(result)
對大多數新聞頁面而言,以上的寫法就能夠解決問題了。
但某些新聞網頁下面會有評論,評論里面可能存在長篇大論,它們會看起來比真正的新聞正文更像是正文,因此extractor.extract()方法還有一個默認參數noise_mode_list,用于在網頁預處理時提前把評論區域整個移除。
noise_mode_list的值是一個列表,列表里面的每一個元素都是 XPath,對應了你需要提前移除的,可能會導致干擾的目標標簽。
例如,觀察者網下面的評論區域對應的Xpath 為//div[@class="comment-list"]。所以在提取觀察者網時,為了防止評論干擾,就可以加上這個參數:
result = extractor.extract(html, noise_node_list=['//div[@class="comment-list"]'])
test文件夾中的網頁的提取結果,請查看result.txt。
已知問題
- 目前本項目只適用于新聞頁的信息提取。如果目標網站不是新聞頁,或者是今日頭條中的相冊型文章,那么抽取結果可能不符合預期。
- 可能會有一些新聞頁面出現抽取結果中的作者為空字符串的情況,這可能是由于文章本身沒有作者,或者使用了已有正則表達式沒有覆蓋到的情況。
Todo
- 使用一個配置文件來存放常量數據,而不是直接 Hard Code 寫在代碼中。
- 允許自定義時間、作者的提取Pattern
- 自動識別新聞列表頁
- 優化內容提取速度
- 測試更多新聞網站
- ……
交流溝通
- 項目地址:https://github.com/kingname/GeneralNewsExtractor
轉載自原文:https://www.cnblogs.com/xieqiankun/p/generalnewsextractor.html
作者:青南