精确提取新蛋网商品价格信息

本文是建立商品比价系统方案的续文,前面我们已经详细讲述了怎样提取当当网京东商城卓越网等,这一次我们用提取新蛋网商品价格信息为例讲解怎样用MetaSeeker精确提取网站数据。

MetaSeeker提取网站信息时,将网页分割成多个信息块,在浏览器上看到的就是一些可视块,所以有人将这种方法称为“基于可视块分割的网站信息提取方法”。GooSeeker开发团队(MetaSeeker发布者)给这些信息块起了另一个名字:语义信息块。MetaSeeker用户只要将语义信息块中的需要提取的内容映射给整理箱,信息提取规则的生成由MetaStudio自动完成,因此,MetaSeeker的易用性相当高。

本文不打算一步步讲解怎样操作MetaStudio和DataScraper,读者可以将《提取当当网百货价格》作为入门教程。本文重点讲解怎样利用语义信息块提高网站信息提取精度。

注意:连续加载两个使用相同样本页面的信息结构会失败,观察MetaStudio底端的状态条,能够看到MetaStudio加载过程停顿了,状态条上没有显示“完成”字样。这是MetaStudio的bug,要避免,或者重启MetaStudio后再加载同一个信息结构。



语义信息块分割的重要性

我们回过头来研究一下《提取京东商场商品价格》教程定义的信息结构(用以自动生成提取规则的语义数据结构)。


图1

按照《MetaStudio用户手册》说明的方法加载信息结构demo_JD_list_1,如图1,弹出这个对话框的意思是说整理箱中顺序号是3的信息属性(被提取的字段)无法被定位到。这个错误提示不一定影响到信息提取规则的有效性,因为DataScraper执行信息提取任务和MetaStudio编辑信息结构任务所采用的网页数据定位方法不太一样。即便如此,存在这个错误提示并不好,导致MetaStudio无法编辑和维护这个信息结构。下面我们分析一下原因。



图2

点击图1确认按钮,即便部分失败也要加载完这个信息结构,图2显示Bucket Editor工作台上的数据映射和FreeFormat映射的情况。得出以下结论:

  1. MetaStudio自动选择的样例商品不合适,它从热卖推荐栏目选择了第一个商品,而不是从商品列表中选择第一个商品
  2. 绝大多数的数据映射和FreeFormat映射都能够在样例商品上正确定位
  3. 信息属性市场价格在样例商品上找不到对应的信息字段

如果能够给MetaStudio划定一个语义信息块范围,将避免出现这个错误。下面我们以新蛋网商品价格信息的提取规则为例讲解怎样定义这种信息结构。因为本文并不是一个入门教程,所以,不会一步步讲解整理箱创建和映射步骤,需要者请参看《提取当当网百货价格》



提取新蛋网价格信息的规则

为了提取新蛋网价格信息需要定义的信息结构

  • 样本页面:http://www.newegg.com.cn/Category/536.htm
  • 主题名demo_NE_list_1
  • 提取目标
    • 在商品列表网页提取如下商品信息
      • 商品名:商品名称
      • 商品网页:显示商品详细信息的网页地址,这个地址有很多用处,例如,用做导航,以便执行多级采集
      • 市场价格:新蛋给出的市面价格
      • 新蛋价格:新蛋的优惠价。
    • 翻页提取


图3

如图3,需要做如下数据映射和FreeFormat映射,以便MetaStudio自动生成数据提取规则:

  1. 在网页的商品列表可视块中选择第一个商品作为样例商品
  2. 在DOM树上找到样例的语义信息块以及整个商品列表的语义信息块。使用反向选择功能可以快速定位DOM节点,详细操作过程参见《提取当当网百货价格》
  3. 针对样例商品进行数据映射和FreeFormat映射
  4. 为了提取列表中所有商品信息,采用FreeFormat映射方式提取多实例,详细映射过程参见《提取京东商城商品价格》;而采用样例复制品提取多实例的步骤参见《提取当当网百货价格》
  5. 为了从网页上精确分割出语义信息块(即网页上的商品列表),将UL[@id='productList']的FreeFormat标志映射给顶层容器节点product_list
  6. 上一步我们选用@id作为FreeFormat标志,因为@id一般是唯一的,而商品列表在网页上也只有一个,所以选它作FreeFormat标志比较适合。对于这个网页来说,选择@class='listShowGrid'作为FreeFormat标志也未尝不可。


图4

在前述第6步,缺省情况下,MetaStudio自动优先选择@id,如果需要改变,双击该信息属性,在弹出的特性编辑窗口中修改成@class,如图4所示。

怎样定义翻页提取规则以及怎样上载信息结构不再赘述,请参阅前面几个教程。



其它应用案例


修正京东商城的信息结构

加载主题名是demo_JD_list_1的信息结构后,修改整理箱结构,重新进行数据映射和FreeFormat映射,并将主题名更改为demo_JD_list_2,然后上载新信息结构及其规则。


图5

如图5所示,在容器节点商品之上再定义一层顶层容器节点product_list,专门用于分割网页的语义信息块,数据映射和FreeFormat映射步骤如下:

  1. 选择第一个商品作为样例商品
  2. 针对样例商品进行数据映射和FreeFormat映射
  3. 为了提取列表中所有商品信息,采用FreeFormat映射方式提取多实例。
  4. 为了从网页上精确分割出语义信息块(即网页上的商品列表),将UL[@class='list-h']的FreeFormat标志映射给顶层容器节点product_list

提取卓越网价格的信息结构

《提取卓越网价格信息》一文已经用到了这个技巧:为了精确提取商品类别信息,增加了一层看似多余的顶层容器节点category