我找到的3种实现方法,但基于dom节点的评分制筛选算法
优采云 发布时间: 2021-03-22 20:01我找到的3种实现方法,但基于dom节点的评分制筛选算法
请轻拍法官。 。
我一直对爬网内容非常感兴趣。大约三年前,我曾经做过“新闻阅读器”。那时,我喜欢看新闻。这个想法是,如果您在没有广告的情况下观看新闻,那么您可以保持安静。太好了,所以我开发了一个浏览器书签小部件,该小部件使用js提取页面的主体,然后通过图层封面将其显示在页面上。那时,我唯一想到的就是通过常规规则搜索目标dom。这也是大多数爬网程序的爬网方法。
当时,此功能是通过分析网易,新浪,QQ和Phoenix等每个主要门户网站来实现的。这是最傻瓜式方法,但是优点是准确性高,但是缺点是一旦修改了目标页面的源代码,就可能不得不重新匹配它。
后来,我发现我想看越来越多的页面,以上方法不再适合我的需要。但是最近,因为我开发了它并且需要采集助手,所以我开始寻找解决方案。
我主要找到3种解决方案:
1)基于dom节点的评分系统筛选算法
有一个在国外被称为reader的浏览器书签插件可实现此目的。地址:当时我以很高的准确性给我留下了深刻的印象。
2)基于文本密度的分析(与DOM无关)
这种方法的想法也很好,其适用性更好。我试图使用JS来实现它。但是我的能力有限,并且我没有生产出匹配度太高的产品,所以我放弃了。
3)基于图像识别
这与Alpha Dog使用的方法非常接近。通过图像识别,只要对机器人进行足够的培训就可以完成。在其他领域也有很多案例,但是尚未看到文本识别的具体实现方式(或者没有找到案例)。
以上是我找到的三种方法。
但是基于我只是一名Web开发人员的事实,我对JS仅有很好的了解,而我在其他语言方面的能力非常有限。因此,我尝试了基于dom的过滤,并且发现可读的实现相对复杂。我想知道是否有更有效的解决方案?
后来我发现了一条规则。一般而言,主体部分中的p标签数量非常多,比其他部分要多得多,因为网页的大部分内容都是通过所见即所得编辑器发布的,这些编辑器将生成符合语义的节点。
因此,我利用了这一规则并开发了一个小型抓取插件,效果很好。当然,它仍然是非常基础的,需要改进。
var pt = $doc.find("p").siblings().parent();
var l = pt.length - 1;
var e = l;
var arr = [];
while(l>=0){
arr[l] = $(pt[l]).find("p").length;
l--;
}
var temArr = arr.concat();
var newArr = arrSort(arr);
var c = temArr.indexOf(newArr[e]);
content = $(pt[c]).html();
代码非常简单,但是经过我的测试,可以成功爬网80%以上的网页(主要是文章页)。基于此,我开发了JSpapa采集助手:
如果您有更好的计划,可以在下面进行讨论。
如果您需要转载本文,请与作者联系,请注明转载来源