1. 程式人生 > >新聞類網頁正文通用抽取器

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

專案起源

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

這篇論文中描述的演算法看起來簡潔清晰,並且符合邏輯。但由於論文中只講了演算法原理,並沒有具體的語言實現,所以我使用 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
  • 本專案的交流微信群: