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

項目起源

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

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

項目現狀

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

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

目前這個項目是一個很是很是早期的 Demo,發佈出來是但願可以儘快獲得你們的使用反饋,從而可以更好地有針對性地進行開發。github

本項目取名爲抽取器,而不是爬蟲,是爲了規避沒必要要的風險,所以,本項目的輸入是 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
  • 自動識別新聞列表頁
  • 優化內容提取速度
  • 測試更多新聞網站
  • ……

交流溝通

  • 項目地址:github.com/kingname/Ge…
  • 若是您以爲GNE對您的平常開發或公司有幫助,請加做者微信 mxqiuchen(或掃描下方二維碼) 並註明"GNE",做者會將你拉入羣。

驗證消息:GNE

相關文章
相關標籤/搜索