采集京东商城网站的产品信息的技巧

假设需要采集京东商城网站上的所有手机产品的信息,包括:商品名、价格、商品图片(MetaSeeker只采集图片网址)等信息。例如,样本网页:http://www.360buy.com/products/652-653-655-0-0-0-0-0-0-0-1-1-1.html。

使用网站信息采集规则生成工具MetaStudio很容易定义采集规则,数据映射和FreeFormat映射确保精确定位和采集网页上的内容。但是,我们会发现从这个网页上只能采集到前两行产品的信息,后面的竟然采集不到。但是,如果不采集商品图片的网址就不会有这个问题。原因在于该网站使用了一些Javascript技巧,后面的商品图片的HTML元素IMG用src2属性包含图片的网址,只有当用户滚动浏览器的垂直卷滚条并显示到该产品的时候,才将src2替换成src,才开始加载产品图片。所以,在用MetaStudio做数据映射时,如果使用IMG的src属性做映射,后面的产品信息无法采集到,因为IMG中没有src属性。

下面介绍两种应对这种情况的技巧。



设置block特性

网站采集主题test_mobile360。请在MetaStudio的Schema List工作台搜索该主题,加载该信息结构,对照本文进行研究。为信息结构中的信息属性image(在Bucket Editor工作台上看)做了FreeFormat映射,然后选中该信息属性的block特性,会弹出一个对话框,选定“特定过滤器”-〉“图片”,就能够把网页上的指定位置的HTML IMG文档片段整个存下来,例如,采集到的其中一个产品的IMG如下:

   <img xmlns="http://www.w3.org/1999/xhtml" width="160" height="160" 
   alt="诺基亚(NOKIA)5530 XpressMusic GSM手机(黑红色)非移动定制机" 
   src="http://img10.360buyimg.com/n2/362/454e7173-8d6b-4503-a3af-07b775f99150.jpg" 
   onerror="this.src='http://www.360buy.com/images/none/none_150.gif'" />

本来只需要采集:http://img10.360buyimg.com/n2/362/454e7173-8d6b-4503-a3af-07b775f99150.jpg,现在将整个IMG元素的内容都采集了下来,这就需要用自己开发的程序进一步过滤采集结果,将图片网址过滤出来。



自定义XPath采集规则

请加载主题test_mobile360_custom的信息结构,与上一节的信息结构对比,可以看到也设置了block特性,但是,没有采用“特定过滤器”,而是选定了“XPath过滤器”-〉“文本内容”,并且分别编写了自定义的内容提取表达式:

   *//*[@class='p-img']/a/img/attribute::*[local-name()='src' or local-name()='src2']

和节点定位表达式:

   *//*[@class='p-img']/a/img

当然定位表达式可以与内容提取表达式相同,此例没有用相同的,只是为了演示两者可以用不同的表达式,而且定位规则相对宽松一点。用这个技巧,无论IMG含有src属性还是src2属性,都能够采集其内容。而且直接获得图片的网址。