采集上万站点不在话下,一款能够自动解析新闻网页的算法

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

image.png

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

先体验一下

打开体验地址 -> 体验页面 ,体验页面比较简单,主要划分了 3 个区域:体验须知参数输入区解析结果展示区

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

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

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

image.png

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

image.png

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

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

image.png

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

image.png

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

image.png

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

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

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

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

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

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

这个算法有什么用处

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

image.png

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

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

image.png

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

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

image.png

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

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

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

image.png

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

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

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

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

算法逻辑是怎样的

image.png

不好意思,这个问题我现在不打算讨论,下一个。

参考了哪些算法

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

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

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

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

不对

是 200 天

可以横向扩展到哪些领域

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

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

题外话

之前面试一家叫什么科的上市公司,我跟他说分布式爬虫、自动化解析算法。

面试官不信,我都画图给他普及知识了,还不信。

我说在数据中转方面,用消息队列好过用 redis,又跟我杠。于是我又列举了一些消息确认机制、缓冲层、多订阅的知识点和场景。最后还是要坚持 redis 就是最好。

他在理论上说不过我,但我没有进入第二轮,你说这事办的?

猜你喜欢

转载自juejin.im/post/7078220041417654302
今日推荐