怎样抓取AJAX网站的内容?这是一个热门的问题,也是一个棘手的问题。以Javascript为技术基础的AJAX网站的出现改变了原有的互联网内容的展现方式,以前,在浏览器看来,要展现的网站内容都是HTML页面文档,无论是静态网页还是服务器动态网页(例如,PHP、JSP、ASP等),下载到浏览器后都是HTML文档,搜索引擎或者网站内容抓取器的网络爬虫只需要处理文本内容即可(HTML文档是一个文本文档),所以,正则表达式在以前的网站内容抓取器中广泛使用,但是,正则表达式几乎对AJAX网站内容一筹莫展,这跟AJAX网站内容展现原理有关。
在AJAX网站页面上除了有普通的HTML文档内容外,还有Javascript代码或者能够下载Javascript代码库的地址,在HTML文档加载过程中或者完成后(一般以load事件为界限)调用Javascript函数或者代码段,这些代码段修改HTML文档的DOM结构,而DOM结构是HTML文档在浏览器窗口中显示的基础,通过这种方式动态地生成页面内容。这些内容可以是计算出来的,也可以是异步从服务器上获得,例如,使用XMLHttpRequest对象从远程服务器获取需要显示的内容。
网站内容抓取软件工具包MetaSeeker通过直接分析DOM结构,采用XPath表达式定位被抓取的内容,并使用XSLT转换抓取结果,所以,从本质上说,能够比较容易地解决AJAX网站内容的抓取问题。但是,Javascript是功能强大的编程语言,业务逻辑实现能力远远高于HTML语言,动态生成网站内容的方式千变万化,所以,MetaSeeker只能分阶段逐步支持AJAX网站内容的抓取,在每个版本都会增加新功能,解决此前新发现的AJAX实现模式带来的抓取问题。
从V1.0版本开始,MetaSeeker就能够抓取AJAX在加载HTML网页过程中生成的动态内容,例如,抓取Google Adsence广告或者搜索结果用于商业情报分析。本版本增强了AJAX网站内容的抓取能力,如果这些动态内容是加载完HTML网页后才生成的,必须采用本节讲解的方法才能抓取,此方法也适用于抓取使用Javascript函数(例如,setTimeout或者setInterval)周期性刷新网页内容的页面。
MetaStudio左栏DOM树是在HTML文档加载完自动生成的,如果HTML文档中的Javascript代码在HTML加载完又修改了DOM内容,很有可能在MetaStudio的DOM树中没有体现出来,此时,如果使用反向选择功能定位页面内容,就会弹出提示框:Cannot find the node。这就需要手工刷新DOM树,将最新改变体现出来。点击菜单项文件->刷新DOM达到该目的。
无论数据抓取规则还是超链接抓取规则,与普通网页的定义方法一致,参见前面章节。但是,在上载信息结构和抓取规则之前,需要点击菜单项配置->自动套用,这是一个check类菜单,不要勾选,表示该信息结构是为AJAX网页定义的,而且网页内容是在加载完HTML文档后才修改和展现,所以,不能采用普通的操作方式:“加载信息结构即刻套用信息结构分析网页内容”。操作的变化体现在加载信息结构进行编辑的时候。
如果需要编辑以前定义的信息结构,那么需要在Schema List工作台上执行加载操作。如果遇到上节讲述的信息结构,网站内容抓取规则定义工具MetaStudio会弹出一个对话框:信息结构加载和分析延后执行,请手工选择菜单项“后续分析”进行加载和分析,提示用户:信息结构虽然已经下载下来了,但是还没有用它来分析目标页面,需要手动点击菜单项文件->后续分析,这是为了让MetaStudio等待Javascript修改DOM,操作员观察MetaStudio内嵌的浏览器,直到需要的内容都看到了,才点击该菜单,完成DOM刷新和信息结构套用分析。
DataScraper的操作没有任何变化,实际上,DataScraper工作流使用了专用的处理器LoadDelayedPage抓取这类内容。另外,由于抓取这类网站内容时不能根据load事件判断是否可以开始或者终止抓取过程,所以,需要持续地探测信息结构是否符合目标网页结构,直到超时为止,因此,
服务器上有个主题demo_qun.qq.com_fuller,可以使用MetaStudio加载该信息结构,体验AJAX网站内容的抓取。该案例的详细说明参见某论坛讨论。
缺省情况下,网站内容抓取规则生成工具MetaStudio左栏的DOM结构是自动刷新的,每当目标样本页面的内容发生改变,MetaStudio的DOM结构也自动跟着刷新,如果正在为这个样本页面定义信息结构,自动刷新将影响定义操作,所以,遇到这种情况需要关闭DOM自动刷新,点击菜单项配置->自动刷新DOM,这是一个check菜单,不打勾就关闭了自动刷新。