新聞類網頁正文通用抽取器

項目起源

開發這個項目,源自於我在知網發現了一篇關於自動化抽取新聞類網站正文的算法論文——《基於文本及符號密度的網頁正文提取方法》

這篇論文中描述的算法看起來簡潔清晰,並且符合邏輯。但由於論文中只講了算法原理,並沒有具體的語言實現,所以我使用 Python 根據論文實現了這個抽取器。並分別使用今日頭條、網易新聞、遊民星空、觀察者網、鳳凰網、騰訊新聞、ReadHub、新浪新聞做了測試,發現提取效果非常出色,幾乎能夠達到100%的準確率。

項目現狀

在論文中描述的正文提取基礎上,我增加了標題、發佈時間和文章作者的自動化探測與提取功能。

最後的輸出效果如下圖所示:

目前這個項目是一個非常非常早期的 Demo,發佈出來是希望能夠儘快得到大家的使用反饋,從而能夠更好地有針對性地進行開發。

本項目取名爲抽取器,而不是爬蟲,是爲了規避不必要的風險,因此,本項目的輸入是 HTML,輸出是一個字典。請自行使用恰當的方法獲取目標網站的 HTML。

本項目現在不會,將來也不會提供主動請求網站 HTML 的功能。

如何使用

項目代碼中的GeneralNewsCrawler.py提供了本項目的基本使用示例。

  • 本項目的測試代碼在test文件夾中
  • 本項目的輸入 HTML 爲經過 JavaScript 渲染以後的 HTML,而不是普通的網頁源代碼。所以無論是後端渲染、Ajax 異步加載都適用於本項目。
  • 如果你要手動測試新的目標網站或者目標新聞,那麼你可以在 Chrome 瀏覽器中打開對應頁面,然後開啓開發者工具,如下圖所示:

Elements標籤頁定位到<html>標籤,並右鍵,選擇Copy-Copy OuterHTML,如下圖所示

  • 當然,你可以使用 Puppeteer/Pyppeteer、Selenium 或者其他任何方式獲取目標頁面的JavaScript渲染後的源代碼。

  • 獲取到源代碼以後,通過如下代碼提取信息:

from GeneralNewsCrawler import GeneralNewsExtractor

extractor = 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

已知問題

  1. 目前本項目只適用於新聞頁的信息提取。如果目標網站不是新聞頁,或者是今日頭條中的相冊型文章,那麼抽取結果可能不符合預期。
  2. 可能會有一些新聞頁面出現抽取結果中的作者爲空字符串的情況,這可能是由於文章本身沒有作者,或者使用了已有正則表達式沒有覆蓋到的情況。

Todo

  • 使用一個配置文件來存放常量數據,而不是直接 Hard Code 寫在代碼中。
  • 允許自定義時間、作者的提取Pattern
  • 自動識別新聞列表頁
  • 優化內容提取速度
  • 測試更多新聞網站
  • ……

交流溝通

  • 項目地址:https://github.com/kingname/GeneralNewsExtractor
  • 本項目的交流微信羣:

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