《怎样分级抓取》一文使用卓越网作为例子,但是,那篇文章定义的信息结构(主题名是demo_JY_mobile_list)并没有实现翻页抓取,而是只抓取当前页。最近,网购行业的竞争处于白热化状态,主要的在线购物网站在最近一段时间频繁改版,卓越网采用了大量javascript/js代码,做几个小实验就能发现一些有趣现象,例如:
- 假设要抓取所有手机,样本页面是
http://www.amazon.com.cn/gp/search/ref=sr_nr_n_0?rh=n%3A664978051%2Cn%3A665002051&bbn=664978051&ie=UTF8&qid=1289961576&rnid=664978051
,现在翻到第2页,第3页,第N页,再去看页面的源代码(用Firefox浏览器菜单“查看”-〉“页面源代码”),发现都是一样的,都是第一页。这样用
普通的网络爬虫抓取网页源代码并从中提取价格等数据是行不通的。
- 每次翻页时,第一行三个商品先显示,后面其它行的显示有些滞后。
- 使用一些开发工具进行观察,鼠标在网页上移动时,频繁激发各种浏览器事件并伴随着DOM的修改。
因为MetaSeeker有强大的AJAX网页抓取能力,而且对是否采用AJAX是透明的,我们可以不去管卓越网页上Javascript是怎样实现的,还是像前面讲述的案例一样,进行数据映射和FreeFormat映射,由MetaStudio自动生成抓取规则。但是,我们还需要多设置一些选项,才能将AJAX显示出来的内容有效地抓取下来。所以,《怎样分级抓取》一文并没有讲解翻页抓取,因为如果不设置AJAX选项,翻页后无法抓到数据。
本文的抓取目标:
- 样本页面:http://www.amazon.com.cn/gp/search
/ref=sr_nr_n_0?rh=n%3A664978051%2Cn%3A665002051&bbn=664978051&ie=UTF8&qid=1289961576&rnid=664978051
- 主题名:demo_JY_list_1(请注意下面的注释)
- 要实现的抓取目标
- 在商品列表网页抓取如下商品信息
- 商品名:商品名称
- 商品网页:显示商品详细信息的网页地址,这个地址有很多用处,例如,用做导航,以便执行多级采集。
- 市场价格:卓越给出的市面价格
- 卓越价格:卓越的优惠价。
- 翻页抓取
注释1:如果设置了AJAX抓取选项,那么信息结构的加载过程稍有区别,请阅读本文的相关章节
注释2:目标网站的网页结构可能会改变,一些重大改变将影响信息结构的可用性,如果发现某些信息属性定位失败,请参照《修改失效的抓取规则》调整信息属性的映射关系。
本文并不是入门教程,如果您不熟悉MetaStudio和DataScraper的操作方法,请按顺序阅读《MetaSeeker速成手册》。
1 抓取卓越网数据的规则

图1
抓取规则由MetaStudio自动生成,用户只需要在MetaStudio的Bucket Editor工作台上进行数据映射和FreeFormat映射即可。如图1,有下面的步骤:
- 选择产品列表中第一个商品作为样例
- 为所有四个信息属性进行数据映射和FreeFormat映射,详细参看《抓取当当百货价格》和《抓取京东商城商品价格》
- 卓越网商品列表网页被组织成多个块,例如,第一行三个商品属于一个块,中间多行商品属于另一个块,最后一行三个商品属于第三块,如果察看HTML DOM结构,就能清楚地看到这一点。本步做的FreeFormat映射是为了抓取第一块的多实例。
- 本步所作的FreeFormat映射有两个目的:1,为了精确定位,详细参见《抓取新蛋网商品价格》;2,为了定位多个信息块(见第上步)
注释:第4和第3步作的FreeFormat映射分别从“块”的角度和从“商品”的角度分别抓取多实例,从中可以看出MetaSeeker抓取多维数据的端倪,这是MetaSeeker区别于其它网站抓取软件的显著优势,MetaSeeker以树状整理箱存储结构化抓取结果,可以存储无限维度的数据。

图2
图2显示抓取多维数据的情景,在Yahoo财经网站上抓取多只股票的对比信息,有下面三个维度:
- 不同股票代码
- 每只股票的特征数据
- 抓取能够导航到指定股票的不同主题的网页的超链接
关于怎样抓取多维数据将在专门的教程中讲解。
2 翻页抓取卓越网的规则

图3
图3显示超链接抓取规则的定义过程,即线索映射,详细说明请参见《批量抓取当当网价格数据》,下面只简单罗列各步骤:
- 选择翻页标志“下一页”
- 创建记号线索,记号,即标志,此例指“下一页”
- 将这个线索设置成线内线索,只用于翻页,而不存储超链接。
- 线索映射,指明在网页的什么范围抓取含有上述记号的线索
- 记号映射,是一种快捷操作,让MetaStudio自动填写记号值和记号节点。
至此,信息结构基本上定义完了,可以按照《抓取当当百货价格》介绍的方法保存信息结构。但是,这个信息结构生成的抓取规则还不能抓取卓越网,因为卓越网用AJAX显示商品信息,需要做一些额外的配置。
3 配置AJAX抓取模式

图4
图4显示配置AJAX模式的菜单,可以设置两种模式的某一个或者同时设置。下面简单讲解一下两种模式的含义,如果想详细了解AJAX抓取原理,请在GooSeeker网站上搜索“AJAX”,可以看到大量文章。
- 延长模式:选择该模式后,DataScraper判断“网页内容是否加载完了”的标准就改变了,能够明显感受到DataScraper等
待的时间延长了。延长模式没有必要总是设置,但是对某些网站是必须的,例如,新浪微博上显示的评论数和转载数是在网页加载完后才使用AJAX方法显示出
来,我们将在新浪微博抓取案例中详细讲解。
- 积极模式:选择该模式后,DataScraper不再等待“网页内容是否加载完了”才开始抓取,而是积极地去尝试,只要网页上有了需要
的数据就启动抓取过程,但是,DataScraper有一套机制确保抓取多实例时不发生遗漏。积极模式也不一定总设置,但是在某些网站上,用户点击超链接
或者按钮,浏览器并没有加载一个新网页,而是局部修改网页的DOM,此时,网站抓取器找不到判断“网页内容是否加载完了”的标准,只有积极地去测试。
虽然延长模式和积极模式看起来对DataScraper的速度有相反方向的影响,但是实测结果是DataScraper总体速度变慢了,因为网页要
用Javascript/JS来来回回发送很多HTTPRequest消息,这要花很多时间。另外,如果感觉难于准确选择延长模式和积极模式,不妨同时设
置,牺牲一点速度,换来简单性。
4 怎样加载AJAX信息结构
如果想使用MetaStudio编辑以前定义的信息结构,需要加载它。设置了AJAX抓取模式后,加载过程有稍许变化。

图5
图5有如下步骤:
- 转到MetaStudio的Schema List工作台
- 输入查询条件并回车,可以含有通配符
- 选中信息结构,点击鼠标右键,弹出菜单,选择菜单项“加载”
- 看到一个弹出框,提醒用户该信息结构还没有加载完成,只有选择了菜单“文件”-〉“后续分析”才算完成
- 在执行后续分析之前,可以看到工具条上没有显示主题名和整理箱名
- 不要急于执行后续分析,要等到浏览器上显示了被抓取的信息才执行,否则会加载失败。
注意:连续加载两个使用相同样本页面的信息结构会失败,观察MetaStudio底端的状态条,能够看到MetaStudio加载过程停顿了,状态条上没有显示“完成”字样。这是MetaStudio的bug,要避免,或者重启MetaStudio后再加载同一个信息结构。
5 对抓取过程的影响
基本上不影响DataScraper的执行,详细操作过程说明参见《批量抓取当当网价格数据》,如果使用周期性自动化批量抓取模式,在指令文件中有几个选项与AJAX有关,可以做适当的调整,但不是必须的,详细参见《周期性抓取调度文件》
|