MetaSeeker速成手册从《卓越网翻页抓取不了怎么办》开始连续多章讲解采集AJAX网站的技巧。AJAX网站内容使用Javascript编程语言动态显示,给普通网络爬虫造成很大障碍,而网站采集器MetaSeeker嵌入了一个完整的web浏览器,理论上说,网页上能够看到的内容都能够采集下来。但是,Javascript是一个强大的编程语言,AJAX网页内容显示技巧千变万化,在不定制的情况下,几乎不可能存在一个能够应对所有AJAX情形的网站采集器。这也是MetaSeeker快速升级的原因:将最新出现的AJAX开发模式纳入其中。2010年5月,MetaSeeker再次为提升AJAX网站采集能力进行了升级,主要目的是采集淘宝宝贝的用户评论信息,中国人民大学某研究室的科研项目期望从淘宝宝贝的普通商品信息和用户评论信息中挖掘出某些关联规则。本文将详细解释淘宝宝贝的评论信息的采集规则的定义方法。
对采集目标的描述:
注释1:目标网站的网页结构可能会改变,一些重大改变将影响信息结构的可用性,如果加载本文提到的信息结构时发现某些信息属性(用于存储采集到的数据的字段)定位失败,请参照《修改失效的采集规则》调整信息属性的映射关系。
注释2:本文非入门教程,所以,不会将操作步骤一步步分解开并用屏幕截图显示出来,如果需要入门知识,请顺序阅读《MetaSeeker速成手册》。
在淘宝宝贝网页上,用户评论显示在“评价详情”标签(Tab)下,点击这个标签时,网页使用Javascript从淘宝服务器上将评价信息下载并显示出来。下面我们做个实验。

图1
图1有如下步骤:
此时,选择MetaStudio的菜单“文件”-〉“刷新DOM”,再点击网页上的用户评论,成功定位到DOM节点。这说明一开始加载的网页上没有用户评论,用户评论是后来通过Javascript程序异步加载上来的。这是判断是否用AJAX显示网页内容的重要准则。
为了采集用户评论信息,DataScraper必须模拟用户点击“评价详情”标签,所以,需要定义两个信息结构:第一个从样本页面上采集普通信息并模拟用户点击;第二个从用户评论列表中采集信息。这跟层级导航采集的原理一样,但是,普通的层级采集是导航到其它网页,而本例没有导航到其它网页,仅仅局部修改网页内容。

图2
图2有如下步骤:

图3
图3显示了很多步骤,并不是采集淘宝宝贝信息所特有的,而是我们期望通过这个案例讲解更多使用技巧。步骤如下:
点击MetaStudio工具条的schema按钮,将信息结构和MetaStudio自动生成的采集规则上载到服务器上,以便DataScraper随时随地采集网络内容。
首先选择MetaStudio的菜单项“文件”-〉“创建工作台”清空工作台。

图4
清空工作台后,参照图4进行如下步骤:

图5
图5显示如下步骤:

图6
图6显示怎样设置AJAX采集模式,即勾选菜单项“延长模式”和“积极模式”,详细参见《卓越网翻页抓取不了怎么办》

图7
图7显示如下步骤:

图8
MetaSeeker采用的FreeFormat技术能够提高采集规则的适应性,所以,即使没有显式作FreeFormat映射,MetaStudio缺省情况下计算采集规则时也会自动选择FreeFormat标志,在网页上存在很多@class和@id属性,它们都有可能被自动选用,但是,有时候自动选用的不太合适,需要手工调整,一般遵从就近原则。手工调整方法是设置节点定位首选项。图8显示设置步骤:
注释:如果不采用就近原则,而是采用缺省设置,MetaStudio会自动选择@id='reviews',实测发现有时候翻页不成功,很有可能网页的动态修改部分的结构有变化,如果不就近选择的话,可能在节点@id='reviews'和@class='show-rate-table'之间动态插入了其它HTML DOM节点,造成定位失败。如果采用就近原则,动态插入其它DOM节点的几率大大降低。
至此,两个信息结构都定义完了,上载后可供DataScraper使用。
如果手工执行批量采集任务,在DataScraper的主题列表中只对主题名demo_TB_detail执行采集操作即可,DataScraper会自动从第一个主题导航到第二个主题。参看《批量采集当当网价格》介绍的操作方法。自动周期性批量采集方法一样,只需为第一个主题指定周期性采集指令即可。
如果想修改以前定义的信息结构,例如,目标网页结构变了需要修改采集规则,需要先将其加载到MetaStudio的工作台上。第一个信息结构是普通的网页采集信息结构,加载方法没有什么不同。第二个信息结构用于采集AJAX显示的内容,需要执行“后续分析”操作。

图9
图9显示demo_TB_comment的加载过程:
注意:MetaStudio有个缺陷:如果两个信息结构使用相同的样本页面,而且第一个信息结构已经加载到工作台上了,然后加载第二个,则MetaStudio的加载过程会一直等待。本例这两个信息结构就符合这个条件,如果demo_TB_detail已经加载到工作台了,现在需要看demo_TB_comment,加载会一直处于等待状态。从内部实现原理角度进行分析,MetaStudio是在等待第二个样本页面加载到浏览器上,事实上第二个样本页面与第一个相同从而已经在浏览器上了,MetaStudio却不知道,所以,一直等下去。该bug将在以后版本修改。当前,需要避开这个bug,可以重新运行MetaStudio再加载第二个信息结构。
下面是相关的更多阅读材料。