采集当当百货价格以建立比价系统

当当上市、当当与京东对阵等等将当当推到媒体的风头浪尖上,所以我们不妨以当当作为演练对象,而且还有实用价值:建立在线商城的比价系统。这是任何行业参与者必须拥有的辅助系统。

本章只是一个入门教程,目标是从当当商品列表页上将下面的信息采集下来:

  • 商品名:商品名称
  • 商品网页:显示商品详细信息的网页地址,这个地址有很多用处,例如,用做导航,以便执行多级采集,参见《采集卓越亚马逊百货价格》
  • 市场价格:当当给出的市面价格
  • 当当价格:当当的优惠价

其它说明:

  • 列表页上有很多商品,GooSeeker(MetaSeeker的开发团队)用了一个专有名词“多实例”,表示从一个网页上采集多个商品。这个名词与其它网络采集软件的叫法不同,例如,“火车头”、网络神采、狂采、军犬、超级采集等等,它们一般称为循环采集。
  • 另外,GooSeeker拥有的其中一个专利就是怎样提高网络数据采集规则的适应性,如果目标网页结构变化了,采集规则受到的影响尽量降到最低,GooSeeker称其为FreeFormat技术。本章也不使用该技术,而在下章讲解
  • 网络采集系统MetaSeeker采用了云计算架构,任何时间、任何地点您都可以使用以前定义好的采集规则,本章使用的信息结构(用于生成采集规则的网页结构描述)名称是demo_DD_list,您可以加载体验或者更名后给自己存一份。

注意:目标网页结构改变后可能会影响以前定义好的信息结构,如果加载不成功,可以参照《修改失效的采集规则》一文对信息结构进行修改。



定义数据采集规则

当当网价格采集使用的规则是由MetaStudio自动生成的,您需要进行的操作实质上是对网页内容进行标注,也就是描述网页信息结构,剩下的工作由MetaStudio自动完成。您需要按顺序执行以下章节的操作。


命名采集主题

运行MetaStudio后,如图1执行下面的步骤。


图1

图1显示了如下步骤:

  1. 输入样本页面的网址,并回车(我们为了采集手机价格,输入这个地址:http://category.dangdang.com/list?ps=39&cat=4001044&highp=&lowp=&sort=5 )。样本页面既是网络爬虫的入口,也是被采集的目标,而且能够代表具有相同网页结构的所有被采集的网页,详细说明参见《加载样本页面》
  2. 在MetaStudio下部的浏览器窗口看到网页被加载了
  3. 在MetaStudio左部的DOM视窗中看到HTML网页被分析成了DOM树
  4. 在MetaStudio底部的状态条上看到“完成”字样
  5. 在MetaStudio右部的网页地址输入框中看到系统自动输入了一个地址,至此,表示网页完全被加载成功了。注意,一定要等到完全被加载成功再开始定义采集规则,不然的话,您得手工执行DOM树刷新操作,操作方法在《采集AJAX网站》一文讲解。
  6. Theme Editor工作台上的主题名输入框中输入一个名字,例如:demo_DD_list。右边两个按钮可以用来检查这个名字是否被占用了。详细说明参见《命名主题》
  7. 点击工作台的Tab标签Bucket Editor,开始下一节讲解的过程。

定义采集规则


第一步:创建整理箱

网站采集规则是MetaStudio自动生成的,所以您不需要像程序员那样思考,只需要指示MetaStudio:网页上的什么数据采集下来放在哪。放在哪?放在整理箱里面。


图2

图2显示了如下步骤:

  1. 点击newBckt按钮,创建一个整理箱
  2. 给整理箱命名:商品。中英文皆可,有些字符不允许,与主题名的命名规则基本一致,参看《命名主题》

第二步:丰富整理箱的内容

给整理箱创建很多字段,我们称其为信息属性


图3

如图3,执行以下步骤:

  1. 选中刚才创建的整理箱:商品
  2. 在整理箱编辑区点击鼠标右键,能够看到弹出菜单
  3. 选中菜单包容,意思是说在整理箱内创建一个信息属性。

注意:要避免一个bug,刚创建了整理箱而没有选择它时,在整理箱编辑区点击鼠标右键看到的弹出菜单既有包容,也有其前其后,如果没有选中整理箱名字而点击菜单,结果不可预测。


图4

如图4,紧接上一步,MetaStudio弹出一个对话框,给新建的信息属性命名,并设定特性值,执行如下步骤:

  1. 输入信息属性的名字:商品名
  2. 设定key特性,最好给至少一个信息属性设定key特性,详细解释参见《编辑整理箱结构》

顺序创建下述各字段(信息属性),创建时先选中其中一个以前创建的,相对于这个,选择菜单其前或者其后或者包容,指定两个信息属性的关系,用包容关系创建嵌套的整理箱。

  • 商品名:商品名称
  • 商品网页:显示商品详细信息的网页地址
  • 市场价格:当当给出的当前市场价格
  • 当当价格:优惠价

第三步:指定往整理箱中采集哪些数据

滚动内嵌浏览器,找到商品列表中的第一个,以它为样例定义采集规则。


图5

如图5,执行如下步骤:

  1. 选择此查检框,便于在DOM树视窗中定位被采集的数据。这个操作模式叫反向选择
  2. 点击第一个商品
  3. 由于设置了反向选择,MetaStudio自动计算出对应的节点号,而且将DOM树展开,选中的节点的背景色是蓝色,滚动DOM树视窗上的滚动条找到那个节点


图6

如果上一步不点击商品图片,而是点击商品名称“天语A7711...”,将定位到一个HTML A节点,如图6,执行如下步骤:

  1. 点击第一个商品的商品名
  2. MetaStudio在DOM视窗中自动定位到包含该商品名的HTML A节点
  3. 展开A节点,选中下属的text节点
  4. 看到显示在网页上的商品名,说明选择的text节点是对的
  5. 在DOM树视窗上点击鼠标右键,弹出菜单
  6. 选择菜单项“商品名”,将这个text节点映射给该字段


图7

图7显示执行上述步骤的结果,并显示怎样采集URL地址,即将 HTML @href节点映射给“商品网页”。其它信息属性采取相同的映射方法。


图8

如图8,可以查看自动生成的采集规则,执行如下步骤:

  1. 点击MAP按钮
  2. MAP文件窗口能够看到自动生成的采集指令
  3. 点击TestThis按钮,验证此整理箱的采集规则是否有效
  4. 采集结果显示在输出信息窗口中。

查看采集结果,发现将所有商品都采集下来了。


第四步:多实例采集规则

截至上一步,所有实例都已经采集下来了,似乎这一步没有必要了,事实并不总是这样,这个样本网页有其特殊性。


图9

图9显示MetaStudio自动生成的采集规则使用了HTML的@class=name这个属性值,所以,能够将所有具有该属性值的内容块都采集下来,这种多实例采集方法称为“采用FreeFormat标志采集多实例”。通常要人工进行FreeFormat映射,本网页是个特殊情况。本章我们讲解另外一种采集多实例的方法:用样例复制品规则采集多实例。

注:截至到第三步,如果只想采集单个商品信息,可以关掉FreeFormat,参看《设置采集定位首选项》


图10

图10显示激活样例复制品功能的步骤:

  1. 选中整理箱。注意:如果是嵌套的整理箱,也可以为整理箱内部的容器节点激活样例复制品功能
  2. 在样例复制品管理区点击鼠标右键,弹出一个菜单
  3. 选择菜单项激活第二个样例复制品

可以看到样例复制品管理区由灰色变成了黑色。


图11

接下来进行样例复制品映射,要为两个样例复制品映射两次。首先需要选中信息属性,即图10的第一步;然后,就要在DOM树视窗中找到合适的DOM节点。图11显示已经映射了第一个样例复制品,现正进行第二个样例复制品映射,在DOM树上选中第二个LI节点,点击鼠标右键弹出菜单执行第二个样例复制品映射操作。此例,两个样例复制品就是网页上紧邻的两个商品,在DOM树上就是两个紧邻的HTML LI节点。映射完成后,再如第三步那样点击MAP按钮,看到生成的采集规则有稍许变化,但是采集到的结果与第三步一样。


第四步:保存信息结构


图12

MetaSeeker是一个云计算架构,为了保证您随时随地采集当当网上的百货价格和其它信息,需要将定义好的信息结构存储到服务器上,如图12,执行下面的步骤:

  1. 点击工具条上的schema按钮,启动上载过程
  2. 如果上载成功,MetaStudio下部显示生成的网站采集工作流指令文件,底端状态条显示“完成”。



还要做什么

在MetaStudio下部的输出信息窗口已经能够得到从本网页上采集到的所有商品的信息,可以采用选择-〉拷贝-〉粘贴方式将采集结果粘贴到别的位置。这样做显然是费时费力的,下一篇文章将讲解:

  • 翻页采集更多商品价格
  • 连续运行采集过程
  • 自动周期性启动采集过程,以便做价格跟踪

Comments

在MAP文件中点击test

在MAP文件中点击test thisl的时候出现Error: The bucket is empty, which is not permitted跟The length of data extraction instruction file is zero. Skipped,是怎么回事?

在执行map时总出现这个提示。。。请问是哪里出问题了呢?

Error: Property No.3 should be mapped from either a FreeFormat mark or a data snippet

要做内容映射

要把网页DOM中的内容映射给第3号信息属性(编号从0开始),至少要做这个内容映射。FreeFormat映射是可选的,为了精确定位

怎么保存工作台

创建一个工作台后,怎么保存它呢?以便日后还能编辑修改。

解决了

看了《用信息结构列表管理网站抓取规则》一文,解决了