这是「进击的Coder」的第 593 篇技术分享
作者:韦世东
来源:NightTeam
“
阅读本文大概需要 8 分钟。
”输入网页文本(不需要输入 xpath),自动结构化输出标题、发布时间、正文、作者、来源等信息。
为了流量,标题有点唬。但算法确实可以做到多源、多站点通用,目前已经应用在生产环境当中,效果可以。
先体验一下
打开体验地址(或者点击下方的阅读原文) -> 体验页面[1] ,体验页面比较简单,主要划分了 3 个区域:体验须知、参数输入区、解析结果展示区。
在开始体验前,大家可以阅读一下体验须知。
① 打开一个新闻网页,例如 永福:林业科技特派员助力麻竹种植[2]。
② 然后在页面空白处右键,在弹出的选项卡里选中查看页面源代码
然后我们就看到浏览器新窗口里显示的网页原文本
③ 全选文本,复制下来。找一个 Base64 编码的在线工具[3]
④ 将复制的网页原文本粘贴到框 1 中,然后点击加密按钮,届时相应的 Base64 编码就会出现在框 2 中,点击复制按钮即可把内容复制到剪贴板
⑤ 回到我们的体验页,把 Base64 内容粘贴到参数输入区的网页框里,并在网址处填入这篇文章对应的网址。
⑥ 点击开始分析按钮,稍等一会儿,体验页上会弹出一个关于解析结果的提示。然后你就可以滑到下方的解析结果展示区查看解析结果了。
解析结果展示区主要分为 3 个部分:接口信息、解析耗时统计、解析结果。
其中接口信息主要是后端接口返回的一些信息;
解析耗时统计则是每个环节的耗时记录,单位为毫秒;
解析结果处会显示这个算法的成果,例如文章标题、文章来源、文章发布时间、文章作者、文章正文、正文所在的 HTML 标签、正文所在 HTML 标签的 Class 属性等。
还有根据正文内容计算出来的文章分类、文章标签、文章摘要等。多实体命名+情感分析还在训练中,所以体验页还没有。
我推荐你动手找一些其他新闻类网页,用同样的方式复制、粘贴到体验页进行体验,看看算法的结果如何。
这个算法有什么用处
这种算法在工具应用方面其实我们早已见过:早些年 360 浏览器推出的阅读模式,差不多就是这样的算法。阅读模式可以把那些广告、侧栏、底栏内容都屏蔽掉,让你可以专心阅读文档和小说。
在研发层面,它也发挥着不小的作用。我们来看一些业务场景:
① 假设一个舆情类的公司,它采集新闻文章数据,对内容进行提取后进行标记、训练,最后形成一款舆情产品(例如百什么舆情、什么浪舆情)。
② 再举个栗子,假设一个招投标类的公司,它采集招标类信息,然后对内容进行格式化提取,取出招标标题、标的金额、招标方信息、代理方信息、投标要求等,就可以形成一款招标产品(例如千什么马招标)。
无论是新闻类网站,还是招投标信息类网站,站点数量都是非常庞大的,通常以万计。按照普遍做法,招一批爬虫工程师+一批专门写 xpath 规则的工作人员(通常是苦命的实习生),从这上万个站点中一个个 xpath 填写,然后爬虫采集的时候读取对应的 xpath 进行解析。
几十、一百个网站还好说,这上万个站点的数据想要全填进来,得好几个月。而且有些网站会出现页面规则改动,导致解析不到数据,那就需要每天都更新 xpath。你想想这工作量……
但是有了这样的算法,就不需要一个个 xpath 填写了。
你的团队/公司可以在短时间内采集到大量的数据,你说开不开心
这样的算法厉害吗
厉不厉害先不说,我们看看目前哪些地方有这样的算法或者产品。
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 现代款是基于人类视觉+新闻网页特征规则编写的,大体的逻辑是网页内容通常在网页的中间,这样可以排除左右和上下的噪声。中间的噪声通过块的长短来进行判断,最终可以提取到很准确的正文。
技术细节不能泄露太多,我举个例子。上图中的蓝色块是放置图片的位置。站在 GNE-现代的视角,它会认为蓝色块的宽度跟下面文本的宽度不同,因此这块就会是噪声,应当排除。
那些需要大量样本训练的深度学习类算法咱就不说了,毕竟没有亲身体验过。但有一点可以确定,单纯靠分类、回归类的深度学习是不可能取得好成绩的。不知道现在 bert 模型出来后,有没有人训练出更好的模型。
对比小结:上面列举的例子中,GNE-现代款的正文部分提取效果是最好的,但我记得它需要浏览器进行渲染,在效率方面好像还没有找到很好的解决方案。
本文的算法,大家可以体验一下,毕竟实际体验才能证明好与不好。我觉得目前在效率+准确率+提取能力多方面综合来看,本文的算法能够排得上名次(这是一句很谦虚的话)。
放一个群友提供的哔哩哔哩专栏的解析效果。
算法逻辑是怎样的
不好意思,这个问题我现在不打算讨论,也还没到开源的时候,下一个。
参考了哪些算法
正如前面所提到的,我读过 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
End
崔庆才的新书《Python3网络爬虫开发实战(第二版)》已经正式上市了!书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!
内容介绍:《Python3网络爬虫开发实战(第二版)》内容介绍
扫码购买
好文和朋友一起看~