模拟IE(FireFox)的Spider技术介绍

作者:冲出宇宙
时间:2007-5-21
备注:转载请注明作者。
Spider的技术主要是分为2部分,一个是模拟浏览器(IE,FF等),一个是对页面进行分析。后者可能会被认为并不是属于Spider的。第一部分其实是一个工程的问题,它需要比较常的时间构建,第二部分是一个算法的问题,它需要的时间很难说。
一、为什么需要模拟IE?
不过,可能有朋友会提出一个想法:为什么要模拟IE啊?直接使用IE提供的库多简单的。嗯,这位朋友可能是一个学院派的,即他只是需要这个功能来做实验(很多页面分析算法也是以IE库作为设计的基础的)。IE的主要问题有2个:1)访问页面的速度慢;2)页面处理时间太长。前者是因为IE要访问页面上的所有需要显示的数据(比如,图片,Flash,Js等),虽然它是多线程的,可是就算下载会快速一点也会占用过多的带宽;后者是因为IE需要排版界面(比如,table显示在什么地方啦),这个也是需要花费不少时间的(不过,这样有一个好处,就是可以很容易的知道Element的绝对位置,这点对于某些算法,比如,基于视觉的页面分块,来说是很有用的)。工程上的Spider,不会有那么常的时间和那么大的带宽浪费的,所以,需要自己来构建模拟IE的Spider。
二、模拟IE包含了哪几部分?
对于基于文本的搜索引擎来说,文字是唯一重要的东西。考虑到这一点,我们需要支持的类似IE的功能至少有:1)cookie的支持;2)页面编码的支持;3)js的支持。cookie的支持能够让我们访问需要用户名和密码的资源(很多论坛都必须先登录)。页面编码本来不是一个重要的问题,可是因为很多页面都不注意写编码上去,导致了它也是一个问题了。好在它不算一个难题。对js的支持是模拟IE的最重要的一步。这是因为目前国内的大部分页面都大量的使用了js的缘故。而将来肯定是Ajax满天飞的形势。不支持JS就等于落后了一步。
另外,CSS也是一般页面设计常用的东西,不过,考虑到CSS只是一个页面排版的规范,和实际显示的文本关系不算很大,所以,我们暂时忽略了它。
三、如何模拟IE?
对应cookie和页面编码的支持,这个是一个十分详细的技术,本处避开不谈。而对于JS的模拟来说,我们可能只有唯一的选择:Rhino(或者其C实现SpiderMonkey)。Rhino是Mozilla著名的JS脚本运行开源库,它提供了基本的支持JS脚本解释运行的库。它的官方网址是:http://www.mozilla.org/rhino/。Rhino支持一般的ECMA标准的JS脚本。
其实,我们还有一个选择,同样是使用Mozilla的开源代码。这个选择就是:从FireFox的源代码中提取出JS处理部分的代码。也就是说,我们可以把FireFox里面除了Gecko等图形和安全部分的其他部分都提取出来。可惜的是,我们之前在这个方面的努力是以失败告终的。目前与此有关的一个项目可以参考MozillaHtmlParser:http://sourceforge.net/project/showfiles.php?group_id=186646,这是一个从FireFox源代码中提取HtmlParser部分的项目,需要注意的是,根据FireFox这部分的源代码可以看到,它对Html页面的处理并没有包括Script的分析(好像忽略了Script标签)。
四、Rhino有哪些不足?
Rhino只是提供了基本的满足ECMA标准的JS解析和运行功能,这就意味着它有很多不足之处。至少包括了:
1)Rhino不包含浏览器Host部分
所谓的浏览器Host部分,是指满足Html4.0标准的DOM对象。举例来说,Rhino并不支持你直接调用:
document.writeln(“http://lotusroots.bokee.com>冲出宇宙”);
Rhino并不提供Document对象
根据Html的标准,存在很多很多的Host对象,这些都需要我们自己来支持。
2)ECMA和当前实际的JS标准存在冲突。
这类型的冲突有很多,一个比较典型的例子是,在ECMA里面float是一个绝对的关键词,而实际的CSS规范里面会包含了float属性,所以,你可能使用如下的代码:
style.float=”left”
这行代码在Rhino里面是无法编译的(Rhino是先'编译'然后再执行的)。
3)Rhino文档的严重缺乏
大家都知道,一个开源项目的最主要的问题是文档的极度缺乏。没有任何文档告诉你核心的构架和所有的接口的使用方法。Rhino也一样,能找到的只有简单的几个示例文件。而如果你要了解更加深入的信息的话,你只能一行一行的去看代码和代码的注释。
五、Host对象有哪些?
Html标准(Dom标准)只是定义了绝大部分浏览器必须支持的对象(这些对象Rhino都没有提供支持),比如,HtmlDocument、HtmlTable等。其中,Dom1标准是目前使用最多的,Dom2标准的某些部分也会在某些页面上使用,Dom3标准几乎未见使用过的页面。
除此以外,还有很多没有在这些标准里面提供,但是却是十分常用的对象。比如,支持Ajax的XMLHttpRequest对象。
综合起来,为了尽量完整的支持一般浏览器的JS功能,我们建议您参考IE的标准。特别是IE7.0的标准,因为这个版本的IE支持了几乎全部的Dom标准和大部分公认的Mozilla使用的标准(比如XMLHttpRequest)。考虑到最常用的因素,至少需要支持如下的Host对象:
Attribute、ClientInformation、Form、FrameWindow、History、Document、Input、Location、Navigator、Option、Screen、Script、Select、Style、Table、TBody、Td、Tr、TextArea、Text、Title、Window、XMLDocument、XMLHttpRequest等。
支持了这些对象之后,根据我们的经验,90%以上的中文页面都能够满足了。
六、实践效果
实际使用的时候,需要减少文件的下载,所以,一定要缓冲js文件。这样每次只需要下载一个页面即可。下载完页面之后,运行对应的js脚本和启动事件的脚本。这样就初始化完毕了。如果想获得页面中的链接,需要处理href和onclick两个部分的代码。
我们使用构建好的浏览器模拟模块来访问和遍历深网络,这样,我们仅仅需要配置一个搜索器(普通的搜索器也可以自动构建,但是,国内的搜索器很少有普通的。google和百度页面上的搜索器就是普通的),其他部分都是自动完成的。
实际测试的过程中,我们发现JS脚本的运行花费的额外时间不到100ms。每秒可以处理好几个页面。
简单的说,模拟IE浏览器模块的构建是为了减少人工,当遍历的网站很多的时候,这个是必须的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值