抓取京东商城商品价格

《抓取当当网商品价格》一文讲解了怎样使用MetaStudio的基本功能,GooSeeker拥有多项发明专利,其中一项有关怎样提高网站抓取规则的适应性,也就是说当网站的网页结构变化了,对抓取规则的影响尽量降到最低。GooSeeker称其为FreeFormat技术。本文讲解怎样使用这个技术。



1 MetaSeeker运行

MetaSeeker工具包中的MetaStudio和DataScraper的运行方法不再赘述,如果不知道如何启动,请参看



2 定义京东商品价格数据抓取规则

本节讲解的过程基本上与《抓取当当网商品价格》相同,但是增加了FreeFormat映射,以提高数据抓取的精度和适应度。

  • 样本网页:http://www.360buy.com/products/737-794-870-0-0-0-0-0-0-0-1-1-1.html
  • 主题名:demo_JD_list_1(请注意下面的注释)
  • 抓取目标
    • 在商品列表网页抓取如下商品信息
      • 商品名:商品名称
      • 商品网页:显示商品详细信息的网页地址,这个地址有很多用处,例如,用做导航,以便执行多级采集
      • 市场价格:京东给出的市面价格
      • 京东价格:京东的优惠价。注意:我们只抓取价格图片的URL地址,需要另外的程序下载价格图片,并进行识别,例如,网络上共享的一个软件
    • 翻页抓取

注释:有时候用MetaStudio再次加载信息结构demo_JD_list_1不成功,原因分析参见《抓取新蛋网商品价格》,那篇文章讲解怎样精确定位网页的语义信息块以避免这个问题,并且另外定义了一个主题名是demo_JD_list_2的信息结构。,另外,设置了AJAX抓取选项,设置原因参看2013-7-30的评论


2.1 命名抓取主题


图1

如图1,进行如下步骤:

  1. 输入样本网页地址,并且回车,然后等待,观察下面的2-5步,直到他们都自动完成,再进行第6步
  2. 观察网页加载到内嵌浏览器
  3. DOM树视窗中看到DOM树被生成了
  4. 在MetaStudio底部的状态条上看到“完成”字样
  5. Theme Editor工作台上,网页地址被自动填入页面地址输入框中。
  6. 在工作台的主题名输入框中输入:demo_JD_list_1
  7. 点击Bucket Editor标签进行2.2节的步骤

2.2 定义商品数据抓取规则

下面分成多个小节讲解怎样定义商品价格数据的抓取规则,除FreeFormat映射外文字内容不多,因为与前一个教程基本一样,如果不熟悉这些名词和术语,可以先阅读前一个教程。


2.2.1 创建整理箱


图2

如图2,进行如下步骤:

  1. 点击newBckt按钮,创建整理箱
  2. 在弹出窗口中输入整理箱名字

2.2.2 丰富整理箱的内容


图3

如图3,给整理箱创建很多字段,我们称其为信息属性,有如下步骤:

  1. 整理箱编辑区选中刚才创建的整理箱demo_JD_list_1
  2. 在整理箱编辑区点击鼠标右键,弹出整理箱编辑菜单
  3. 选中菜单项包容,表示在整理箱内部创建一个字段。


图4

执行到图3的最后一步时,会弹出一个对话框,如图4,您需要编辑信息属性的特性,有如下步骤:

  1. 给信息属性起名:商品名
  2. 为这个信息属性设定key特性

小技巧:网站抓取器DataScraper运行模式有多种组合,最常用的是区分成普通模式和非普通模式(在GooSeeker网站上搜索“AJAX”可以看到讲解其它模式的文章),后者可以大大加快京东价格信息的抓取速度,为了使用后者,一定要给至少一个信息属性设定key特性,详细参见《编辑整理箱结构》。如果您使用的是企业版DataScraper,还能够进一步加快抓取速度,尤其对那些含有大量图片和视频的网页最有效,参看《怎样提高采集京东商城商品价格的速度》

重复进行上述步骤,创建所有信息属性,弹出菜单中有如下菜单项:

  1. 包容
  2. 其前
  3. 其后

分别表示新建立的信息属性与被选中的信息属性的相对关系。如果为一个信息属性创建包容的信息属性,就产生了一个嵌套结构,这样可以抓取更复杂的数据结构,而不局限于二维表格,这是MetaSeeker相对于其它网站抓取软件的技术优势。


2.2.3 指定将哪些数据抓取到整理箱中

为了能够顺序抓取所有商品而不遗漏,需要将第一个商品作为样例,下面的映射操作都是在这个商品上进行的。所谓映射,就是告诉MetaStudio将网页上的什么数据抓取到整理箱的什么信息属性中,MetaStudio据此自动计算出数据抓取规则。


图5

如图5,有如下步骤:

  1. 打开反向选择开关,打开后只要在内嵌浏览器上点击看到的内容,就能自动在DOM树上找到对应节点
  2. 点击第一个商品的描述信息
  3. 看到一个弹出框,显示定位到的DOM节点的顺序号
  4. DOM树被自动展开,而且被选中的节点的背景是蓝色或者灰色(当窗口焦点不在DOM树上时)

注意:DOM树展开后可能没有自动滚动到被选中的那个节点,需要根据节点号手工拖动DOM树视窗上的卷滚条,找到那个节点。


图6

如图6,如下步骤:

  1. 点击第一个商品的商品名
  2. MetaStudio在DOM树视窗上自动定位到一个A节点
  3. 展开A节点,找到text节点并选中
  4. 可以看到该text节点的内容与内嵌浏览器上显示的内容一致,说明选择对了
  5. 在DOM树视窗上点击鼠标右键,弹出菜单
  6. 选中菜单项“商品名”,完成text节点到信息属性的映射


图7

图7显示执行完图6的步骤后信息属性映射结果:将节点号6257的text节点映射给“商品名”。还可以看到怎样将@href节点映射给“商品网页”,用以抓取URL地址。


图8

如图8,验证抓取规则是否正确,有如下步骤:

  1. 点击MAP按钮,让MetaStudio自动生成抓取规则,即MAP文件
  2. 在MetaStudio下部的MAP文件窗口可以看到生成的抓取规则,实际上是一个XSLT程序。
  3. 点击TestThis按钮,验证本整理箱的抓取规则的有效性。相反,如果点击TestAll,而且在工作台上创建了多个整理箱,则验证所有整理箱的抓取规则。
  4. 抓取结果显示在输出信息窗口中。

《抓取当当网价格数据》教程不同,到这一步只抓取了一个商品实例,而没有将商品列表完全抓取下来,必须要手工指定多实例抓取规则。可以采取两种方案:1,用样例复制品;2,用FreeFormat。《抓取当当网价格数据》教程使用了样例复制品,抓取京东商品同样可以使用样例复制品,但是,为了说明FreeFormat的用法,本教程使用FreeFormat抓取多实例。


2.3 FreeFormat映射

FreeFormat技术主要为了提高抓取网页的精度和适应度。例如,用SliceProfile部署企业竞争情报分析系统时,一定要很精确地抓取需要的数据,例如,抓取帖子评论数、发布时间等等,抓取不准确会干扰分析结果。提高了适应度可以延长抓取规则的寿命,因为受到目标网页结构变化的影响变小了,维护抓取规则的频度和工作量也随之减少。


2.3.1 信息属性的FreeFormat映射


图9

京东商城的网页上有很合适的FreeFormat标志,如图9所示,进行如下步骤:

  1. 第一个商品样例的DOM块中有个DIV节点,它的@class 值 p-name 作为FreeFormat标志
  2. 在DOM树视窗中点击鼠标右键,弹出菜单
  3. 执行FreeFormat映射,将p-name映射给信息属性商品名


图10

图10显示所有的信息属性都进行了FreeFormat映射,需要说明的是:

  • 没有必要为每个信息属性都做FreeFormat映射,而是有合适的FreeFormat标志才使用
  • FreeFormat标志一定要位于商品样例DOM块内部,而不应该将其它商品DOM块内的标志映射给样例商品
  • 同一个FreeFormat标志可以映射给多个信息属性,例如,为商品名商品网页抓取的数据都位于DOM节点DIV[@class='p-name']下,而且不存在其它的能够区别两者的不同的FreeFormat标志,则共享同一个FreeFormat标志

经过FreeFormat映射后,生成的抓取规则只有稍许改变,而且点击TestThis按钮看到的抓取结果没有改变:只抓取了样本商品。


2.3.2 多实例的FreeFormat映射


图11

观察DOM树,每个商品都放在HTML LI块中,相互之间结构相同,内部具有相同的FreeFormat标志,如图11,还是使用第一个样例商品,将代表商品名的DIV节点的@class值p-name作为FreeFormat标志,映射给整理箱中的容器节点(最顶层节点)“商品”,再看抓取规则,已经改变了,点击TestThis按钮,看到将所有商品抓取了下来。

为什么能用FreeFormat标志抓取多实例?因为HTML网页上所有商品都有这个@class属性。所以,有下面的结论:

  • 只能用@class抓取多实例,而不能用@id,因为@id一般是唯一的
  • 按照某种规则(参看下面注释)选择商品信息DOM块中的某一个@class作为FreeFormat标志,而且所有商品都应该有这个@class
  • 并不是商品信息块中的任何一个@class都行(参看下面注释),映射后需要按TestThis测试一下。如图11,p-img就不行

小技巧:定义多实例抓取规则时,通常FreeFormat映射优选,而样例复制品映射次选。

注释:哪些@class可以作为抓取多实例的FreeFormat标志?选择时有诸多限制,不是MetaStudio想设计成这样,而是因为自动生成抓取规则的算法过于复杂,里面的bug限制了FreeFormat标志选择的自由度,通常用于抓取多实例的FreeFormat应该符合这些规则:

  • FreeFormat标志最好位于代表样例商品的DOM块的上部,DOM块是指DOM树的一个分支,越往上,分支越汇聚在一起,如果在最顶部,那么它能够代表这个块。
  • 本文的例子选用了第一个信息属性商品名的FreeFormat标志作为抓取多实例的标志,如图11,不能选用p-img,也不能选用不是第一个信息属性的FreeFormat标志。
  • 由于有这些限制,需要在上载信息结构时点击TestThis按钮测试规则是否正确


3 定义翻页抓取规则

京东商城上的商品很多,分成多个网页,翻页抓取可以从头到尾将所有商品价格抓取下来。为了达到这个目的,我们创建了一个marker类型的线索,而且该线索的类型是线内线索。关于这些概念的详细说明参见《翻页抓取当当网价格》。下面用图例说明怎样定义翻页抓取规则。


3.1 创建线索


图12

如图12,采用以下步骤创建翻页抓取线索:

  1. 转到Clue Editor工作台
  2. 点击newClue按钮,创建一条线索,线索自动编号为clue 0
  3. 设定该线索的类型:记号线索。在内嵌浏览器的网页上,可以看到“下一页”超链接,这就是记号。
  4. 指定为线内线索,用于翻页的线索一般都是线内线索,详细说明参见《翻页抓取当当网价格》
  5. 由于指定为线内线索,目标主题名和当前主题名相同,自动填入该输入框。

3.2 线索映射


图13

图13显示如下步骤:

  1. 打开反向选择,以便快速定位DOM节点
  2. 在内嵌浏览器上点击翻页区
  3. MetaStudio自动定位到翻页区的DOM节点。注意:并不一定自动定位到包含整个翻页区的那个DOM节点,很有可能定位到内部某个节点,需要人工向上层找到它。
  4. 进行线索映射,将代表翻页区的DOM节点映射给线索clue 0
  5. 可以看到映射结果。


图14

以“下一页”作为记号定义翻页抓取规则,如图14,有以下步骤:

  1. 在DOM树上选中作为记号的节点,即网页上“下一页”对应的text节点
  2. 在DOM树视窗上点击鼠标右键,选中弹出菜单项记号映射
  3. 能够看到作为记号的节点号和节点值分别填入到工作台上
  4. 点击viewSCE按钮,查看MetaStudio自动生成的线索抓取规则

至此,所有操作都已经做完,接下来需要将定义好的信息结构及其规则上载到服务器,以便随时随地使用它抓取京东商城的商品价格。



4 保存信息结构


图15

图15显示怎样保存信息结构及其抓取规则,有如下步骤:

  1. 点击工具条上的schema按钮,启动上载过程
  2. 在MetaStudio的下部的工作流文件窗口能够看到生成的工作流指令文件


5 执行抓取操作

上面只是讲解定义抓取规则过程,大批量和自动化抓取操作由DataScraper执行,《翻页抓取当当网价格数据》一文有详细讲述,不再赘述。



6 下一步做什么

京东商城上的商品很多,被分成很多商品类,上述章节只讲述了一个商品类中的价格数据抓取,如果要将所有类别抓取下来,需要分成两级进行抓取:

  • 第一级:抓取各类别的商品列表网页的URL地址
  • 第二级:在特定类别的商品列表网页抓取所有商品信息,也就是本章讲解的过程。

我们将在《分级抓取》教程中讲解分级抓取方法和套用模板方法。

Comments

京东抓取规则的调整

由于京东网页改版,上述使用说明文字需要调整:
1,网页上有些内容不位于显示窗口中时并没有加载上来,所以,为了将内容抓全,需要滚屏抓取,DataScraper要打开滚屏选项,这样,自动滚动网页,让所有内容都有显示机会。而自动滚屏抓取只有设置了AJAX抓取模式才有效,所以,信息结构修改了,增加了AJAX抓取选项,读者要加载察看这个信息结构时,需要执行后续分析操作。
2,网页上没有市场价格了,所以,将这个信息属性删除了。