网页采集器的自动识别算法( 网站数据的抓取分析(一)的工作本文档)

优采云 发布时间: 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 页面?

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线