支持AJAX的网络爬虫设计与实现

2013-04-29 15:06:15陆亮李东
智能计算机与应用 2013年6期
关键词:爬虫脚本引擎

陆亮 李东

摘要:分析了Web2.0网络的网络爬虫面临的新挑战,对目前学术界出现的多种实现方案和策略进行了全面的综述,提出了AJAX爬虫的设计并加以实现,最后进行了实验验证,验证了这种AJAX Crawler能够很好地获取AJAX的动态页面,并与普通的爬虫在下载速度方面进行了对比。

关键词:动态网页; AJAX; Web2.0; 网络爬虫

中图分类号:TP393 文献标识码:A文章编号:2095-2163(2013)06-0057-04

0引言

Web2.0是相对Web1.0的新一代互联网应用的统一名称。Web1.0的重要特征是用户通过使用浏览器获取静态的网络信息。Web2.0则侧重于用户与用户之间的交流和沟通,用户不仅作为网页内容的查看者,同时也是网页内容的创造者。所说的网页内容的创造者是指互联网上的所有用户不再只是互联网内容的读者,同时也成为了互联网内容的作者;不再仅是冲浪于互联网海洋之中,同时也是海洋波浪的制造者;在模式上由纯粹的“只读”变为“读写”进而发展成为“共同建设”;由简单被动地接收互联网信息转变为主动创造互联网信息,从而增加了互动,更加符合用户的使用习惯。

近年来,随着Web2.0的兴起,在Web开发中运用AJAX技术的网站越来越多,这些技术的应用带来了更好的用户体验、很多新概念和WebUI设计,同时,由于AJAX技术可以动态改变页面内容,改造了传统Web页面的结构,导致单纯抓取静态Web页面的网络爬虫抓取的内容少于页面呈现的内容,这些动态内容给网络爬虫的设计带来极大挑战,使得爬虫不能获取到网页页面所呈现的全部文本。

本文研究能够支持AJAX的网络爬虫的原理,实现一个支持AJAX且能够进行定制任务的网络爬虫,高效率地对网页信息进行采集。第1节介绍国内外对AJAX页面的抓取研究情况,第2节介绍支持AJAX的爬虫的设计及具体实现,第3节通过实验验证了支持AJAX的爬虫的可行性。

1相关工作

现阶段,主流的搜索引擎,例如:Yahoo!和Google等,都无法对AJAX动态网页建立索引,也就是说不能利用现有的搜索引擎来查询动态网页的内容。而能够支持AJAX的搜索引擎还处于研究阶段,罗兵使用基于协议的动态页面抓取方法,获取AJAX网页内包含的JavaScript代码片段,通过设计脚本语言解释器直接分析脚本代码,仿照浏览器功能顺序执行脚本文件,用来模拟页面的状态转换[1],肖卓磊在之后的研究中也采用了类似的处理方法[2];曾伟辉、李淼利用切片算法构造了程序层次模型,解决了有序执行JavaScript脚本的问题[3];Frey[4]和Matter[5]改进了开源的JavaScript解释器Rhino[6],用来实现状态转换和脚本执行。实现全部功能的脚本解释器较为困难,即便是已开发多年的Rhino项目,依旧有很多的脚本代码不能正常执行,于是,更多的研究人员将研究重点落定于嵌入式浏览器组件,运用组件来模拟AJAX页面的渲染并实现脚本的执行,以达到自动转换状态的目的;在国内,采用类似方法研究的是王映[7]和金晓鸥[8],研究对使用网络爬虫分析脚本语言的技术进行了一些研究,前者使用的是开源的JavaScript引擎SpiderMonkey,而后者利用的是Rhino。因其均解析了包含JavaScript脚本代码的动态页面,从页面中抓取了JavaScript代码,由此获得了网页上的URL,并实现了内容爬取。Frey和Matter扩展了Cobra工具集[9],完成了动态解析和加载HTML代码,然后在内部形成DOM结构树,并通过DOM树获取状态包含的内容。类似于状态转换问题,为了最大限度地利用现有的技术,多数的状态内容获得方式是采用嵌入浏览器组件作为运行AJAX容器,并使用浏览器的外部接口实现和DOM树的数据交互,由此而获得完整的内容[10-13]。

在控制转换方面,较为常用的方式是采用事件过滤机制,对已经过滤后的事件逐一进行触发。为了提高执行效率,Xia[12]和Duda[14]均提出让用户能够自定义过滤规则,也就是加入拒绝规则和接收规则,如此即使得只有在符合规则的集合里才能进行状态转换;Mesbah等采用面向领域的手工配置、HTML元素注解和全自动扫描三种方式来对状态转换进行控制[10];Matter则提出了一种启发式的爬行策略,尽量避免从不同路径进入相同的页面状态[5]。

2AJAXCrawler爬虫设计方案及实现

由于Web 2.0的流行,使用AJAX技术的网站越来越多,本文采用了Rhino引擎对AJAX进行了支持。

2.1 JavaScript引擎Rhino

Rhino采用Java语言实现的JavaScript脚本引擎。Rhino用在Java程序中,为最终用户提供脚本化能力。Rhino包含JavaScript编译器、JavaScript解析器、JavaScript调试等模块。下面即对脚本编译模块和脚本解释模块进行全面分析。

2.1.1脚本编译模块

编译器的输入是JavaScript代码,输出是JavaScript数据对象。JavaScript结构中包含了字节码、注释、string池、数据以及标识符。JavaScript中还包含Objects,函数等。其中,函数也是一段嵌套的JavaScript代码。编译器由以下三部分组成:随机逻辑(randomlogic)的词法扫描器,用来创建AST的递归下降分析器,tree‐walking代码生成器。编译过程是由函数Main.processSource()来完成的,将输入的字符串或者JavaScript代码转化成流文件进行编译。在编译过程中,所有的变量,符号以及命令等都由词法分析器进行解析,再利用内部特定的符号标识,放入对应的数据栈中,最后将得到的数据用树形结构返回,便于Rhino引擎编译。在少分号或者是可赋值表达式等情况下,用语义和词法的反馈(feedback)机制来消除歧义。编译器没有错误校正,因此,只要遇到错误,就立即停止。另外,编译器还在编译完成的script结构中加入sourcenotes信息,以便用户调用toSource()函数进行反编译时使用。

2.1.2脚本解释模块

类似大多数的JavaScript引擎,Rhino的interpreter是一个单线程的大型循环函数,该函数每次解释bytecode的一个指令。在这个大型函数中,采用的是switch语句,即根据所要执行的bytecode的不同,跳转到不同的执行代码段中。大多数情况下,如果一段JavaScript代码调用另一段JavaScript代码,则引擎只会使用JavaScript的栈空间,interpreter也是顺序执行的。但如果JavaScript代码调用了java代码,再由java代码调用JavaScript代码,就会引起interpreter的重入问题。需要一提的是,这个大型函数是可重入的。对于interpreter所需要的各种状态都是通过参数的形式在interpreter函数进入时完成传递的。绝大多数的状态都保存在数据结构Context中。因此,在Rhino里,所有的公共API接口以及大部分的函数接口中,第一位参数均是一个Context的指针。

2.2 AJAX爬虫架构设计

爬虫系统分为两部分,第一部分是预处理阶段,这个阶段实现URL净化,并去除不必要抓取的URL,类似于过滤器的功能。第二部分是网页真正抓取的部分,由于网页下载比较耗时,为了充分利用资源,此处采用了多线程。抓取阶段获得网页,析出网页内部的链接,而后进行预处理。并不是每个网页内部的链接都是需要抓取的,网页内部的链接可能包含以前抓取过的重复URL,Robots协议禁止抓取的URl等。CleanURLs是经过净化后的URL库,里面存放的都是需要抓取的URL。爬虫的架构如图1所示。

2.3AJAX引擎设计

AJAX引擎提供对网页中AJAX的支持,能够对网页中的js代码进行解析、执行,由此得到网页动态内容。AJAX引擎架构如图2所示。

由图2中可见,AJAX引擎主要有三个组成部分。对AJAX页面的解析按照下面的顺序进行。

(1)Crawler通过HTTP请求,获取需要抓取的页面。此时的页面是一个含有AJAX代码的页面,其中没有真正的内容;

(2)DOMBuilder对页面进行分析,建立DOM树,提取出其中的JS代码,触发相应的事件;

(3)将AJAX代码送入JavaScript引擎执行,在执行的过程中,同时根据JS对象与HTML对象映射修改HTML对象;

(4)将执行结果重新组合生成新的页面内容,返回给Crawler。

3实验数据结果

实验基于Java平台,开发环境采用Eclipse,Java虚拟机版本为JDK1.6.0,Rhino版本为1.7R2,实现AJAXCrawler。本文主要对AJAXCrawler进行了吞吐量的测试,并与普通的爬虫进行下载速度的对比。

3.1吞吐量实验

吞吐量实验是测试AJAXCrawler数量以及每个AJAXCrawler启动线程数与下载速度的关系。若启动的AJAXCrawler或者每个AJAXCrawler中的线程数太少,则系统不能完全利用计算机的资源,反之则会因为带宽、数据竞争等而降低效率。测试机器为一台普通PC机,硬件配置以及软件配置如表1所示。

表1服务器配置表

Tab.1 Server configuration listCPU2 * AMD Athlon(tm)ⅡX2 215 Processor 2.70GHz网卡100Mbps内存2.00GB操作系统Windows 7JAVA环境JRE 1.6.0_24

AJAXCrawler测试任务为天涯博客,通过改变AJAXCrawler以及每个AJAXCrawler内线程的数目,测得的数据如表2所示,绘制成折线图,如图3所示(单位:页面数/10分钟)。

由表2和图3可以看出,在当前的计算环境和网络环境下,当选取任务数为3,每个任务内有3个线程的时候,系统运行效率达到较优,平均每10分钟能够下载网页1 679页。

3.2AJAXCrawler与普通爬虫比较实验

此实验以网易的评论为测试对象,分析AJAXCrawler的效率。由于普通爬虫无法抓取到动态内容,此处的量化指标不再以页面数/10分钟作为单位,而是选择Kb/second作为单位。测试结果如表3所示,绘制成折线图如图4所示。

由表3和图4可以看到,AJAXCrawler无论是几个任务并发执行,都相应地比普通的WebCrawler下载速度慢。除去实验环境偶然因素外,最主要的影响因素应该是AJAXCrawler对AJAX脚本的解析和DOM树的更新操作。因为AJAXCrawler在关闭掉动态页面支持时,速度跟普通WebCrawler相差不大。图4中的两条线几近平行,表明两种爬虫此时的加速比也相差不多。而AJAXCrawler的加速上升趋势已开始走缓,这就说明AJAXCrawler需要更多的资源。另外,若对比下载的页面数,两者相差了十余倍,而下载速度却相对不是很大,进一步说明了动态网页包含的内容丰富。

4结束语

本文设计的能够抓取支持AJAX动态网页的网络爬虫,在抓取动态网页方面,取得了良好的结果。与普通爬虫相比,AJAXCrawler的下载速度稍慢,主要是对AJAX脚本的解析和DOM树的更新会相对浪费时间。不过,下载的页面数与普通爬虫相比,数量却多出了十余倍,抓取的内容会比普通爬虫的内容要丰富很多。

参考文献:

[1]罗兵.支持AJAX的互联网搜索引擎爬虫设计与实现[D].杭州:浙江大学,2007.

[2]肖卓磊.基于AJAX技术的搜索引擎研究[D].武汉:武汉理工大学,2009.

[3]曾伟辉,李淼.基于JavaScript切片的AJAX框架网络爬虫技术研究[J].北京:计算机系统应用,2009,18(7):169-171.

[4]FREYG.Indexing AJAX Web Applications. Zurich:Swiss Federal Institute of Technology Zurich,2007.

[5]MATTERR.AJAXCrawl:Making AJAX Applications Searchable. Zurich:Swiss Federal Institute of Technology Zurich,2008.

[6]MOZILLA.Rhino:JavaScript for Java.[2009-03-22].

[7]http://www.mozilla.org/rhino/.

[8]王映,于满泉,李盛韬.JavaScript引擎在动态网页采集技术中的应用[J].计算机应用,2004,24(2):33-36.

[9]金晓鸥,钟宝燕,李翔.基于Rhino的JavaScript动态页面解析研究与实现[J].计算机技术与发展,2008,18(2).

[10]COBRA.JavaHTMLRenderer&Parser.[2009-01-19].

[11]http://lobobrowser.org/cobra.jsp.

[12]MESBAHA,BOZDAGE,VANDEURSENA.Crawling AJAX by inferring user interface state changes[C]//Proceedings of the 8th International Conferenceon Web Engineering, YorktownHeights,NJ.Washington,DC,USA:IEEE Computer Society,2008:122-134.

[13]郭浩,陆余良,刘金红.一种基于状态转换图的AJAX爬行算法[J].计算机应用研究,2009,26(11):4266-4269.

[14]XIAT. Extracting structured data from AJAX site[C]//Proceedings of 2009 International IEEE Work shop on Database Technology and Applications, Wuhan, China.2009:259-262.

猜你喜欢
爬虫脚本引擎
酒驾
利用网络爬虫技术验证房地产灰犀牛之说
基于Python的网络爬虫和反爬虫技术研究
安奇奇与小cool 龙(第二回)
数据库系统shell脚本应用
电子测试(2018年14期)2018-09-26 06:04:24
利用爬虫技术的Geo-Gnutel la VANET流量采集
电子测试(2018年1期)2018-04-18 11:53:04
蓝谷: “涉蓝”新引擎
商周刊(2017年22期)2017-11-09 05:08:31
快乐假期
中学生(2017年19期)2017-09-03 10:39:07
大数据环境下基于python的网络爬虫技术
电子制作(2017年9期)2017-04-17 03:00:46
无形的引擎
河南电力(2015年5期)2015-06-08 06:01:46