GNE——准确率高达99.9%的新闻类网页通用抽取器
项目起源
开发这个项目,源自于我在知网发现了一篇关于自动化抽取新闻类网站正文的算法论文——《基于文本及符号密度的网页正文提取方法》)
这篇论文中描述的算法看起来简洁清晰,并且符合逻辑。但由于论文中只讲了算法原理,并没有具体的语言实现,所以我使用 Python 根据论文实现了这个抽取器。并分别使用今日头条、网易新闻、游民星空、观察者网、凤凰网、腾讯新闻、ReadHub、新浪新闻做了测试,发现提取效果非常出色,几乎能够达到100%的准确率。
项目现状
项目源代码托管在Github:https://github.com/kingname/GeneralNewsExtractor
在论文中描述的正文提取基础上,我增加了标题、发布时间和文章作者的自动化探测与提取功能。
最后的输出效果如下图所示:
目前这个项目是一个非常非常早期的 Demo,发布出来是希望能够尽快得到大家的使用反馈,从而能够更好地有针对性地进行开发。
本项目取名为抽取器
,而不是爬虫
,是为了规避不必要的风险,因此,本项目的输入是 HTML,输出是一个字典。请自行使用恰当的方法获取目标网站的 HTML。
本项目现在不会,将来也不会提供主动请求网站 HTML 的功能。
如何使用
使用环境
如果你想体验 GNE 的功能,请按照如下步骤进行:
- 安装 GNE
# 以下两种方案任选一种即可 # 使用 pip 安装 pip install --upgrade git+https://github.com/kingname/GeneralNewsExtractor.git # 使用 pipenv 安装 pipenv install git+https://github.com/kingname/GeneralNewsExtractor.git#egg=gne
- 使用 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
。
运行截图
凤凰网
网易新闻
今日头条
新浪新闻
观察者网
项目文档
已知问题
- 目前本项目只适用于新闻页的信息提取。如果目标网站不是新闻页,或者是今日头条中的相册型文章,那么抽取结果可能不符合预期。
- 可能会有一些新闻页面出现抽取结果中的作者为空字符串的情况,这可能是由于文章本身没有作者,或者使用了已有正则表达式没有覆盖到的情况。
Todo
- 允许自定义时间、作者的提取Pattern
- 新闻文章列表页提取
- 对于多页的新闻,允许传入一个 HTML 列表,GNE 解析以后,自动拼接为完整的新闻正文
- 优化内容提取速度
- 测试更多新闻网站
- ……
交流沟通
如果您觉得GNE对您的日常开发或公司有帮助,请加作者微信 mxqiuchen(或扫描下方二维码) 并注明"GNE",作者会将你拉入群。
验证消息:GNE
论文修订
在使用 Python 实现这个抽取器的过程中,我发现论文里面的公式和方法存在一些纰漏,会导致部分节点报错。我将会单独写几篇文章来介绍这里的修改。请关注我的微信公众号:未闻Code:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
手把手实现一条延时消息
前言 近期在维护公司的调度平台,其中有个关键功能那就是定时任务;定时任务大家平时肯定接触的不少,比如 JDK 中的 Timer、ScheduledExecutorService、调度框架 Quartz 等。 通常用于实现 XX 时间后的延时任务,或周期性任务; 比如一个常见的业务场景:用户下单 N 分钟未能支付便自动取消订单。 实现这类需求通常有两种方式: 轮询定时任务:给定周期内扫描所有未支付的订单,查看时间是否到期。 延时消息:订单创建的时候发送一条 N 分钟到期的信息,一旦消息消费后便可判断订单是否可以取消。 先看第一种,这类方式实现较为简单,只需要启动一个定时任务即可;但缺点同样也很明显,这个间隔扫描的时间不好控制。 给短了会造成很多无意义的扫描,增大数据库压力,给长了又会使得误差较大。 当然最大的问题还是效率较低,随着订单增多耗时会呈线性增长,最差的情况甚至会出现上一波轮询还没有扫描完,下一波调度又来了。 这时第二种方案就要显得靠谱多了,通过延时消息可以去掉不必要的订单扫描,实时性也比较高。 延时消息 这里我们不过多讨论这类需求如何实现;重点聊聊这个延时消息,看它是如何实现的...
- 下一篇
Python 之父的解析器系列之七:PEG 解析器的元语法
原题 | A Meta-Grammar for PEG Parsers 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫(“Python猫”公众号作者) 声明 | 本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议。为便于阅读,内容略有改动。本系列的译文已在 Github 开源,项目地址:https://github.com/chinesehuazhou/guido_blog_translation 本周我们使解析器生成器完成“自托管”(self-hosted),也就是让它自己生成解析器。 首先我们有了一个解析器生成器,其中一部分是语法解析器。我们可以称之为元解析器(meta-parser)。该元解析器与要生成的解析器类似:GrammarParser 继承自Parser ,它使用相同的 mark()/reset()/expect() 机制。然而,它是手写的。但是,只能是手写么? 在编译器设计中有一个传统,即编译器使用它要编译的语言编写。我深切地记得在我初学编程时,当时用的 Pascal 编译器是用 Pascal 本身编写的,G...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群