自研!东鸽用 Go 语言写了一个能够自动解析新闻网页的算法

这是「进击的Coder」的第 593 篇技术分享

作者:韦世东

来源:NightTeam

阅读本文大概需要 8 分钟。

输入网页文本(不需要输入 xpath),自动结构化输出标题、发布时间、正文、作者、来源等信息。

22c1f12ccb728489c63959c066adfce7.png

为了流量,标题有点唬。但算法确实可以做到多源、多站点通用,目前已经应用在生产环境当中,效果可以。

先体验一下

打开体验地址(或者点击下方的阅读原文) -> 体验页面[1] ,体验页面比较简单,主要划分了 3 个区域:体验须知参数输入区解析结果展示区

在开始体验前,大家可以阅读一下体验须知。

cb86577403369093de7635f7abbb47a9.png

① 打开一个新闻网页,例如 永福:林业科技特派员助力麻竹种植[2]

② 然后在页面空白处右键,在弹出的选项卡里选中查看页面源代码

ca670b6676c838df790eeda83d736336.png

然后我们就看到浏览器新窗口里显示的网页原文本

578484da6f0fb7ea12e02a9309e29faf.png

③ 全选文本,复制下来。找一个 Base64 编码的在线工具[3]

④ 将复制的网页原文本粘贴到框 1 中,然后点击加密按钮,届时相应的 Base64 编码就会出现在框 2 中,点击复制按钮即可把内容复制到剪贴板

cade2586fcebeb708427c5030169d5c0.png

⑤ 回到我们的体验页,把 Base64 内容粘贴到参数输入区网页框里,并在网址处填入这篇文章对应的网址。

bed06b74cfc4bef902c28155a32f4ced.png


⑥ 点击开始分析按钮,稍等一会儿,体验页上会弹出一个关于解析结果的提示。然后你就可以滑到下方的解析结果展示区查看解析结果了。

6375d78ef3dab89dadc0d3a3c084c296.png

解析结果展示区主要分为 3 个部分:接口信息解析耗时统计解析结果

其中接口信息主要是后端接口返回的一些信息;

解析耗时统计则是每个环节的耗时记录,单位为毫秒;

解析结果处会显示这个算法的成果,例如文章标题文章来源文章发布时间文章作者文章正文正文所在的 HTML 标签正文所在 HTML 标签的 Class 属性等。

还有根据正文内容计算出来的文章分类、文章标签、文章摘要等。多实体命名+情感分析还在训练中,所以体验页还没有。

我推荐你动手找一些其他新闻类网页,用同样的方式复制、粘贴到体验页进行体验,看看算法的结果如何。

这个算法有什么用处

这种算法在工具应用方面其实我们早已见过:早些年 360 浏览器推出的阅读模式,差不多就是这样的算法。阅读模式可以把那些广告、侧栏、底栏内容都屏蔽掉,让你可以专心阅读文档和小说。

6a5fb08a4a052ec25163bbbba8d7cea0.png

在研发层面,它也发挥着不小的作用。我们来看一些业务场景

① 假设一个舆情类的公司,它采集新闻文章数据,对内容进行提取后进行标记、训练,最后形成一款舆情产品(例如百什么舆情、什么浪舆情)。

4180bb8ce7624ceeb59f638ca3687634.png

② 再举个栗子,假设一个招投标类的公司,它采集招标类信息,然后对内容进行格式化提取,取出招标标题、标的金额、招标方信息、代理方信息、投标要求等,就可以形成一款招标产品(例如千什么马招标)。

无论是新闻类网站,还是招投标信息类网站,站点数量都是非常庞大的,通常以万计。按照普遍做法,招一批爬虫工程师+一批专门写 xpath 规则的工作人员(通常是苦命的实习生),从这上万个站点中一个个 xpath 填写,然后爬虫采集的时候读取对应的 xpath 进行解析。

d07c28f3eeec92ae4f01256a7aa1b2b6.png

几十、一百个网站还好说,这上万个站点的数据想要全填进来,得好几个月。而且有些网站会出现页面规则改动,导致解析不到数据,那就需要每天都更新 xpath。你想想这工作量……

但是有了这样的算法,就不需要一个个 xpath 填写了。

227d952d8c8f26173f3487bb2bed0dc7.png

你的团队/公司可以在短时间内采集到大量的数据,你说开不开心

这样的算法厉害吗

厉不厉害先不说,我们看看目前哪些地方有这样的算法或者产品。

1、之前有提到过 360 浏览器(现在其他厂商的浏览器)有这样的产品。

2、微软好像有类似能力,还开放了 API 接口。

3、国外开源的 Python 库 Readability。

4、国内开源的 Python 库 GNE。

5、国内一些硕士的研究论文(可以在百度文库搜到)。

6、其他基于深度学习的库,不记得名字了。我记得微软工程师崔庆才写过。

7、国外一个网站,名字忘记了,收费的,很贵很贵。

8、国外有一款 Java 写的,名字里带 News 的,忘记了。

大家现在体验的这款算法,启蒙于 GNE。GNE 早期我通读过源码,跟原作者有过很多交流,请教过很多知识。后来我写的书《Python3 网络爬虫宝典》中有一章是讲解 GNE 算法原理和源码的,在此再次感谢 GNE 作者青南。

浏览器的阅读模式我体验过、Readability 我通过读源码、国内能找到的相关论文我也通读了一遍。目前深度学习相关的库、收费的接口没有测试过。

这类自动解析算法的好坏在几点:效率提取能力准确率。我对自己接触过的几个算法评价一下:

1、Readabiliti 是基于 HTML 标签权重进行评分的,例如 p 标签的权重比 div 的高、h 的比 span 的高等等。在很规范的新闻网站中,效果还可以,但大体上算出来的结果,很是离谱。

2、GNE-早期,GNE 早期是基于标点符号密度的,90% 以上的网页正文解析都没什么问题。但是在实际应用中发现几个问题:内容会被截断、正文字少的会识别错误、发布时间跟页面显示不同等。正文提取相关的问题,都是因为密度算法导致的。时间不准则是因为提取优先级和逻辑选择了另一种方式。

3、国内论文,因为国外的我看不懂,我只能搜国内的来看。普遍来看,基于文字密度、标点符号密度、位置、距离等等,效果其实都是不怎么好的。这里你可能会问,为什么论文里的结果很好?

那是因为测试的样本选得好啊!!!

4、GNE-现代,GNE 现代款是基于人类视觉+新闻网页特征规则编写的,大体的逻辑是网页内容通常在网页的中间,这样可以排除左右和上下的噪声。中间的噪声通过块的长短来进行判断,最终可以提取到很准确的正文。

d0841698a872900dddf92a73da1ca7b0.png

技术细节不能泄露太多,我举个例子。上图中的蓝色块是放置图片的位置。站在 GNE-现代的视角,它会认为蓝色块的宽度跟下面文本的宽度不同,因此这块就会是噪声,应当排除。

那些需要大量样本训练的深度学习类算法咱就不说了,毕竟没有亲身体验过。但有一点可以确定,单纯靠分类、回归类的深度学习是不可能取得好成绩的。不知道现在 bert 模型出来后,有没有人训练出更好的模型。

对比小结:上面列举的例子中,GNE-现代款的正文部分提取效果是最好的,但我记得它需要浏览器进行渲染,在效率方面好像还没有找到很好的解决方案。

1e07fa688b0712f28731e52b2cbcd1ee.png

本文的算法,大家可以体验一下,毕竟实际体验才能证明好与不好。我觉得目前在效率+准确率+提取能力多方面综合来看,本文的算法能够排得上名次(这是一句很谦虚的话)。

放一个群友提供的哔哩哔哩专栏的解析效果。

9a9eb39c0e195f689ae6563385836654.png

算法逻辑是怎样的

不好意思,这个问题我现在不打算讨论,也还没到开源的时候,下一个。

参考了哪些算法

正如前面所提到的,我读过 Readability、GNE-早期 的源码,又看过了国内大部分相关论文。

最开始我是基于 GNE-早期 进行优化和改造的。

翻阅了大量的深度学习相关资料,终于确定不再走这条路线,因为事实证明效果都没有达到我想要的效果。

后来突然有一天,我在那里看着《天行九歌》抉择那一集,就有了灵感。经过短暂的 coding 后进行了测试,发现结果可行,就一头扎了进去。这一扎,就是20年……

不对

是 200 天

可以横向扩展到哪些领域

现在主要应用在新闻类数据解析中,后面可以扩展到招投标网页解析、电商网页解析、药品网页解析等等。

如果你从深度学习的角度来看,它们可能需要做不同的训练、准备不同的样本、使用不一样的算法模型。但从我这个算法原理来看,它们都是一样的,适当改动就可以得到另一个领域的解析算法。

References

[1] 体验页面: http://39.105.152.125:3597/
[2] 永福:林业科技特派员助力麻竹种植: http://glhd.gxnews.com.cn/staticpages/20220321/newgx62388054-20687881.shtml
[3] 在线工具: https://www.qqxiuzi.cn/bianma/base64.htm

7774bcd1963c5c29ef4c140ae78511b1.png

End

崔庆才的新书《Python3网络爬虫开发实战(第二版)》已经正式上市了!书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,‍同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!

内容介绍:《Python3网络爬虫开发实战(第二版)》内容介绍

4be02a47e72d92eb518ce3dbc62daf53.png

扫码购买

dc220eae846a2328c0f6319a2018d73c.png

好文和朋友一起看~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值