网页采集器的自动识别算法( 网站数据的抓取分析(一)的工作本文档)
优采云 发布时间: 2021-09-05 19:06网页采集器的自动识别算法(
网站数据的抓取分析(一)的工作本文档)
简介
网站数据捕获分析是当今许多互联网业务的一个非常重要的部分。舆情分析、网络搜索、定向广告等都涉及到大量的data采集analysis。面对采集下的各种网页,分析和识别文本是一项更具挑战性的任务
本文档分为以下几个部分:
背景
分析和挖掘互联网网页数据价值的第一步是识别真实文本,消除页面上的外来噪声,以便更好地分析。然而,面对奇怪的页面布局和显示,为每个页面创建一个页面解析模板不仅费时费力,而且在页面修改时之前的工作也将毫无意义
业界现有算法
针对这种情况,业界为了提高效率,通过不同的算法实现了文本自动提取。下面我们简单介绍一下相关的实现
文字密度
简介
基于文本密度的算法是遍历页面上所有只收录文本节点的dom节点。遍历当前dom节点。当节点中的文本量占整个页面的文本量大于0.4时,则认为是文本区,否则继续遍历父节点
缺点
基于文本密度的算法对英文页面有很好的效果。对于噪点较多的中文网页,识别区域可能比文本区域大,对图片内容等网页无能为力。
代表
刚刚阅读的Chrome扩展就是用这个算法通过css解决识别区域大于文本区域的情况。具体方法是通过css隐藏footer、header、comment、ad等类名和标签名。虽然可以达到很高的准确率,但还是会出现文字误伤的情况
文字特征
简介
基于文本特征的算法是识别页面上所有的文本区域,根据文本的特征来识别文本。标签符号数量、文本长度峰值变化等特征来识别文本
缺点
对图片内容还是无能为力
代表
Chrome自带阅读模式(开启方法:在chrome://flags页面搜索阅读模式即可启动)
重量计算
简介
对于文本特征的权重计算,使用的特征是:标点符号的数量、文本的长度、文本链接的密度。通过以上特征的加权计算,将得分加权给父节点,给祖父节点一半的权重。最后找出权重最高的dom节点是text节点
缺点
该算法需要解析DOM树,所以执行效率稍慢。由于是对dom进行加权赋值计算,对于普通div包裹的p标签类型的网页,可以达到100%的识别率,但是对于不遵循套路的网页,文字会丢失。例如:文本用多个div包裹,最后用一个div包裹这些div,这样权重计算后,其中一个div被识别,另一个文本丢失
代表
Safari 的阅读模式。该算法在safari中进行了更优化,识别率更高。原创代码基于著名的 arc90 实验室的 Readability。该算法已在firefox、chrome插件和flipboard中实现商业化。 Firefox 使用的源代码现已开源,地址:Readability
深度可读性
通过超简版简单的学习可读性,可以直接在富文本的web控制台运行查看识别效果
let maybeNode = {
score:0,
};
const nodes = document.body.getElementsByTagName('p');
for(var i = 0, len = nodes.length; i < len; i++){
const node = nodes[i];
let score = 1;
const text = node.innerText;
score += text.split(/:|。|;|,|,|\.|\?|”/).length;
score += Math.min(Math.floor(text.length / 100), 3);
typeof node.score !== 'number' && (node.score = 0);
node.score += score;
node.setAttribute('score', node.score);
node.score > maybeNode.score && (maybeNode = node);
let index = 0;
let tempNode = node.parentElement;
while (tempNode && tempNode.tagName !== 'BODY'){
if(/div|article|section/i.test(tempNode.tagName)){
typeof tempNode.score !== 'number' && (tempNode.score = 0);
tempNode.score += score / (index < 2 ? index + 2 : index * 3);
tempNode.setAttribute('score', tempNode.score);
tempNode.score > maybeNode.score && (maybeNode = tempNode);
if (++index >= 3) {
break;
}
}
tempNode = tempNode.parentElement;
}
}
maybeNode && (maybeNode.style.border = '1px solid red');
如何实现更好的算法
如上所述,不同的算法都有一定的缺点。我们如何实现更好的算法?
目前只有可读性的表现是卓越的,所以我们基于可读性来思考
单页应用?图片页面? iframe 页面?