任意网页文章内容提取(采集)算法

分类: 程序开发 发布时间: 2014-04-09 01:22 浏览: 3,873 次

做过采集的人都知道,要采集一个网站,就要根据网站结构写正则,这是最传统的做法,这种做法优点就是采集精度可以做到非常细,可以采集任意结构的网站,不过这种做法也非常的具有局限性,一套规则只能使用于一个网站,遇上网站结构变动又要重新分析,调整规则,非常被动。

我就一直在想,如果程序可以做到人那样的识别程度,那就可以采集任意网站正文内容了,上网找了下,果然已经有很多类似的算法了,主要有以下几种:

1、基于Dom 树
1)、利用开源包HTML Tidy 处理HTML,更正其中错误或不规范的地方;
2)、根据较规范的HTML 建立Dom 树,然后递归遍历Dom 树,比较并识别各种非正文信息,包括广告、链接群和非重要节点信息;广告信息移除:需要建立经常更新的广告服务器列表;链接群移除:计算网页包含的链接个数同非链接的词个数的比例;
3)、非正文信息移除后,Dom 树中剩余的内容就是正文信息,直接从余下的树节
点中抽取。
存在问题:Dom 树的建立对HTML 是否良构要求较高,而且树的建立和遍历时空
复杂度高,树遍历方法也因HTML 标签不同会有差异。

2、基于网页分割找正文块
1)、网页正确分割后,正文提取工作简化为对正文块的判断;
2)、分割是利用HTML 标签中的分隔线以及一些视觉信息(如文字颜色、字体大小、文字信息等)。
存在问题:不同网站的HTML 风格迥异,分割没有统一方法,通用性难以保证。

3、基于标记窗
1)、先取出文章标题;
2)、两个标签及其内部包含的文本合在一起称为一个标记窗(比如<h1>text</h1>中text 就是标记窗内的文本),取出所有标记窗内的文字;
3)、对文章标题和每个标记窗内的文本分词;
4)、计算标题序列与每个标记窗文本序列的词语距离L,如果L 小于一个阈值,则将此标记窗内的文本看做是正文文本。
存在问题:标记窗的提法很好,但每个标记窗文本都要先分词,在计算词序列距离,效率?

4、基于数据挖掘或机器学习
用到了文本分类、聚类、隐马模型、数据挖掘等。
存在问题:简单问题复杂化。

5、基于逻辑行和最大接纳距离的网页正文抽取
1)、考虑人们编写网页时的一些启发规则,考虑了正文的物理位置会靠的很近;
2)、做出以下推论:
HTML 每一行都表示一个完整的语义;
正文代码在物理位置上会靠的很近;
正文代码的一行中大都是文字;
正文代码的一行中非HTML 标签的文字数量较多;
正文代码的一行中超链接长度所占比率不会很大;
3)、凡符合上述推论的代码行被认为是一个正文行;
存在问题:正文在物理位置上的确会很接近,但标题很长的链接群以及较长的文章评论信息同样满足上述条件。仍要靠html 标签做判断。

6、基于行块分布函数的通用网页正文抽取:线性时间、不建DOM树、与HTML标签无关

首次将网页正文抽取问题转化为求页面的行块分布函数,这种方法不用建立Dom树,不被病态HTML所累(事实上与HTML标签完全无关)。通过在线性时间内建立的行块分布函数图,直接准确定位网页正文。同时采用了统计与规则相结合的方法来处理通用性问题。作者相信简单的事情总应该用最简单的办法来解决这一亘古不变的道理。整个算法实现代码不足百行。但量不在多,在法。

项目网址:http://code.google.com/p/cx-extractor/

 

以上面算法都是来自第6种算法的分析论文。

第6种算法是我认为最好的算法,效率快,实现简单。但也有不好的地方,这种算法主要针对的是采集文章,也就是文字内容多的网页,因为其原理就是把网页去标签,然后分块,哪一块文本多就认为是正文,在使用的过程中发现如下问题:

1、不能采集图片;

2、会误采集链接聚集块做正文,如:相关文章,文章导读,这些地方标题加起来的文本有时会超过正文;

3、没做标题识别。

对代码做简单的修复,就可以修复上面的问题:

1、保存图片标签,使用[img=x]代替;

2、保存链接文本,使用[a=x]代替链接块;

3、标题识别比较容易,从title就可以拿到,再做简单的过滤就可以。

修改后的程序匹配的结果比原算法匹配到的精准了很多,还有很大的调整空间,作者在论文中也说明了这一点。

目前程序还没完全做到精准,个别类型网站还是不适用,比如相册(纯图片),影视(线链接)。

 

应用实例:http://www.denhuo.com/

网站内内容是有些乱,基本不可用,还是垃圾网站一个。相信有朋友在百度会搜到类似的网站,不过那些网站可能不是这样做的,也可能是单纯的关键字堆积。

相信再改造下可以做到更精准匹配,结果会越来越好!

修复完善,到时会把代码共享出来。请大家关注我的博客,拖鞋小站(http://www.39gs.com/),希望跟大家一起学习。

 

 

 

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!