文档章节

GNE——准确率高达99.9%的新闻类网页通用抽取器

kingname
 kingname
发布于 2019/09/27 10:05
字数 1541
阅读 1.2K
收藏 16
GNE

项目起源

开发这个项目,源自于我在知网发现了一篇关于自动化抽取新闻类网站正文的算法论文——《基于文本及符号密度的网页正文提取方法》

这篇论文中描述的算法看起来简洁清晰,并且符合逻辑。但由于论文中只讲了算法原理,并没有具体的语言实现,所以我使用 Python 根据论文实现了这个抽取器。并分别使用今日头条、网易新闻、游民星空、观察者网、凤凰网、腾讯新闻、ReadHub、新浪新闻做了测试,发现提取效果非常出色,几乎能够达到100%的准确率。

项目现状

项目源代码托管在Github:https://github.com/kingname/GeneralNewsExtractor

在论文中描述的正文提取基础上,我增加了标题、发布时间和文章作者的自动化探测与提取功能。

最后的输出效果如下图所示:

目前这个项目是一个非常非常早期的 Demo,发布出来是希望能够尽快得到大家的使用反馈,从而能够更好地有针对性地进行开发。

本项目取名为抽取器,而不是爬虫,是为了规避不必要的风险,因此,本项目的输入是 HTML,输出是一个字典。请自行使用恰当的方法获取目标网站的 HTML。

本项目现在不会,将来也不会提供主动请求网站 HTML 的功能。

如何使用

使用环境

如果你想体验 GNE 的功能,请按照如下步骤进行:

  1. 安装 GNE
# 以下两种方案任选一种即可

# 使用 pip 安装
pip install --upgrade git+https://github.com/kingname/GeneralNewsExtractor.git

# 使用 pipenv 安装
pipenv install git+https://github.com/kingname/GeneralNewsExtractor.git#egg=gne
  1. 使用 GNE
>>> from gne import GeneralNewsExtractor

>>> html = '''经过渲染的网页 HTML 代码'''

>>> extractor = GeneralNewsExtractor()
>>> result = extractor.extract(html, noise_node_list=['//div[@class="comment-list"]'])
>>> print(result)

{"title": "xxxx", "publish_time": "2019-09-10 11:12:13", "author": "yyy", "content": "zzzz"}

开发环境

如果你需要参与本项目的开发,请按照如下步骤进行。

本项目使用 Pipenv管理 Python 的第三方库。如果你不知道 Pipenv 是什么,请点我跳转

安装完成Pipenv以后,按照如下步骤运行代码:

git clone https://github.com/kingname/GeneralNewsExtractor.git
cd GeneralNewsExtractor
pipenv install
pipenv shell
python3 example.py

特别说明

项目代码中的example.py提供了本项目的基本使用示例。

  • 本项目的测试代码在tests文件夹中
  • 本项目的输入 HTML 为经过 JavaScript 渲染以后的 HTML,而不是普通的网页源代码。所以无论是后端渲染、Ajax 异步加载都适用于本项目。
  • 如果你要手动测试新的目标网站或者目标新闻,那么你可以在 Chrome 浏览器中打开对应页面,然后开启开发者工具,如下图所示:

Elements标签页定位到<html>标签,并右键,选择Copy-Copy OuterHTML,如下图所示

  • 当然,你可以使用 Puppeteer/Pyppeteer、Selenium 或者其他任何方式获取目标页面的JavaScript渲染后的源代码。

  • 获取到源代码以后,通过如下代码提取信息:

from gne import GeneralNewsExtractor

extractor = GeneralNewsExtractor()
html = '你的目标网页正文'
result = extractor.extract(html)
print(result)
  • 如果标题自动提取失败了,你可以指定 XPath:
from gne import GeneralNewsExtractor

extractor = GeneralNewsExtractor()
html = '你的目标网页正文'
result = extractor.extract(html, title_xpath='//h5/text()')
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

运行截图

凤凰网

网易新闻

今日头条

新浪新闻

观察者网

项目文档

GNE 常见问题 Q&A

已知问题

  1. 目前本项目只适用于新闻页的信息提取。如果目标网站不是新闻页,或者是今日头条中的相册型文章,那么抽取结果可能不符合预期。
  2. 可能会有一些新闻页面出现抽取结果中的作者为空字符串的情况,这可能是由于文章本身没有作者,或者使用了已有正则表达式没有覆盖到的情况。

Todo

  • 允许自定义时间、作者的提取Pattern
  • 新闻文章列表页提取
  • 对于多页的新闻,允许传入一个 HTML 列表,GNE 解析以后,自动拼接为完整的新闻正文
  • 优化内容提取速度
  • 测试更多新闻网站
  • ……

交流沟通

如果您觉得GNE对您的日常开发或公司有帮助,请加作者微信 mxqiuchen(或扫描下方二维码) 并注明"GNE",作者会将你拉入群。

验证消息:GNE

论文修订

在使用 Python 实现这个抽取器的过程中,我发现论文里面的公式和方法存在一些纰漏,会导致部分节点报错。我将会单独写几篇文章来介绍这里的修改。请关注我的微信公众号:未闻Code:

© 著作权归作者所有

kingname

kingname

粉丝 15
博文 3
码字总数 4224
作品 2
成都
程序员
私信 提问
新闻网页正文通用抽取器 - GNE-JS

GNE-JS 是基于论文《基于文本及符号密度的网页正文提取方法》实现的新闻网页正文通用抽取器。 在论文中描述的正文提取基础上,还增加了标题、发布时间和文章作者的自动化探测与提取功能。 该...

匿名
2019/10/09
801
2
新闻网页正文通用抽取器 - GNE

GNE 是基于论文《基于文本及符号密度的网页正文提取方法》实现的新闻网页正文通用抽取器。 在论文中描述的正文提取基础上,还增加了标题、发布时间和文章作者的自动化探测与提取功能。 最后的...

kingname
2019/09/24
8.3K
5
基于 Java 的开源网络爬虫框架 - WebCollector

爬虫简介: WebCollector 是一个无须配置、便于二次开发的 Java 爬虫框架(内核),它提供精简的的 API,只需少量代码即可实现一个功能强大的爬虫。WebCollector-Hadoop 是 WebCollector 的 ...

CrawlScript
2014/07/20
19.5W
38
【文智背后的奥秘】系列篇——结构化抽取平台

版权声明:本文由文智原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/91 来源:腾云阁 https://www.qcloud.com/community 随着大数据时代的到来,一个大...

偶素浅小浅
2016/11/03
42
0
【文智背后的奥秘】系列篇——关键词智能提取

版权声明:本文由文智原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/130 来源:腾云阁 https://www.qcloud.com/community 一.关键词自动标注简介 1.关...

偶素浅小浅
2016/11/04
44
0

没有更多内容

加载失败,请刷新页面

加载更多

eclipse创建maven项目

eclipse基础配置 1、修改工作空间默认字符集为UTF-8Eclipse菜单 -> Window -> Preferences -> General ->Workspace2、安装JST Server--默认安装的eclipse Preferences菜单下没有...

丁小屁
45分钟前
39
0
使用Github快速的寻找项目

作为一个3年的码农昨天在学习项目,顺便总结一下 ,在Github找项目的几个常用方式 ,如果对您有帮助,可以点个关注,便于下次光顾! 首先我们来看一下常用命令 1、指定搜索方式 搜索文件中有...

SpiritMark
46分钟前
63
0
检查字符串是否不为空且不为空

如何检查字符串是否不为null也不为空? public void doStuff(String str){ if (str != null && str != "**here I want to check the 'str' is empty or not**") { /* handl......

javail
58分钟前
55
0
No module named 'apscheduler.schedulers'

关于 ModuleNotFoundError: No module named 'apscheduler.schedulers' 和 ModuleNotFoundError: No module named 'apscheduler' 的问题,网上有不少解决。大多数都是因为,文件起名与模块名......

開援带碼
今天
53
0
如何查看Android的系统版本?

有谁知道我怎么能检查系统版本(例如1.0 , 2.2 ,等)编程? #1楼 我无法对答案发表评论,但是Kaushik的答案存在一个严重错误:SDK_INT与系统版本不同,但实际上是指API级别。 if(Build.VER...

技术盛宴
今天
53
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部