第一篇:速卖通产品采集系列 之 产品采集分析

      电商网站产品采集,我相信是一个很需要的功能,主要能够减轻产品编辑和上架所带来一些繁琐的事情,当然除了电商这块,其他方面数据采集也是需要的,比喻新闻类门户等,这系列我们来讲讲如何来采集速卖通产品,主要要说明一下,这里不考虑Ajax,验证码等特殊环境,我们采集速卖通如果不是采集很频繁,就当作为一个良性的采集环境,下面就不太多废话了,直接先分析采集产品信息,包含变体(有Color,Size,且价格不一样,做为多个产品采集下来)。

一.采集前技术和相关工具

1. C#正则表达式学习:(正则表达式用来干嘛的,在这里就不用我介绍。)

2. 正则表达式表工具:RegexMatchTracer 界面如下,我用了很久,这个工具匹配到的很快,很准确,且写得正则表达式和.NET兼容性很高。界面如下:

3. 请求类库:RestSharp 请求代码其实可以自己用.NET封装,我很懒,不想总是拿着一些用了800年的代码倒腾来倒腾去。ReshSharp 代码很简单,大家一看就懂,实例代码如下:

 1 var client = new RestClient("http://example.com");
 2 // client.Authenticator = new HttpBasicAuthenticator(username, password);
 3 
 4 var request = new RestRequest("resource/{id}", Method.POST);
 5 request.AddParameter("name", "value"); // adds to POST or URL querystring based on Method
 6 request.AddUrlSegment("id", "123"); // replaces matching token in request.Resource
 7 
 8 // add parameters for all properties on an object
 9 request.AddObject(object);
10 
11 // or just whitelisted properties
12 request.AddObject(object, "PersonId", "Name", ...);
13 
14 // easily add HTTP Headers
15 request.AddHeader("header", "value");
16 
17 // add files to upload (works with compatible verbs)
18 request.AddFile("file", path);
19 
20 // execute the request
21 IRestResponse response = client.Execute(request);
22 var content = response.Content; // raw content as string
23 
24 // or automatically deserialize result
25 // return content type is sniffed but can be explicitly set via RestClient.AddHandler();
26 IRestResponse<Person> response2 = client.Execute<Person>(request);
27 var name = response2.Data.Name;
28 
29 // or download and save file to disk
30 client.DownloadData(request).SaveAs(path);
31 
32 // easy async support
33 client.ExecuteAsync(request, response => {
34     Console.WriteLine(response.Content);
35 });
36 
37 // async with deserialization
38 var asyncHandle = client.ExecuteAsync<Person>(request, response => {
39     Console.WriteLine(response.Data.Name);
40 });
41 
42 // abort the request on demand
43 asyncHandle.Abort();
View Code

4. 对了还要用到Json.NET,因为这里主要用他来解析Json,大家可能会奇怪为什么采集会要解析JSON,我这里先卖个关子。用到的解析部分实例代码如下:

 1 string json = @"{
 2   CPU: 'Intel',
 3   Drives: [
 4     'DVD read/writer',
 5     '500 gigabyte hard drive'
 6   ]
 7 }";
 8 
 9 JObject o = JObject.Parse(json);
10 
11 string json = @"[
12   'Small',
13   'Medium',
14   'Large'
15 ]";
16 JArray a = JArray.Parse(json);
View Code

5. 在线JSON格式化工具,这里我用的开源中国的 http://tool.oschina.net/ 在线工具 之 Json 格式化工具 http://tool.oschina.net/codeformat/json

6. 分析HTML代码能力

二. 速卖通采集前分析

1. 采集产品一般采集信息有产品名称,产品图片,产品单价,产品币别,如果有变体 产品颜色,产品大小(S,M,L等),产品实价,产品折扣价,产品描述等。

2. 一般采集,主要通过请求HTTP URL取HTML,通过正则表达式一个一个匹配,得到所有信息。

3. 速卖通产品实例 URL : 点击查看 访问后效果如下:

4. 除了产品变体和产品图片,其他通过正则表达式都好匹配,没有什么太大疑问,那我们来说明产品变体和产品图片抓法。

5. 产品变体,我之前有说过,跟Color,Size 有关系,那么一个产品变体数目,就是Color 数量 *  Size 数量 ,所有上面实例 6种颜色和1种大小,那么它的变体数量就 6*1 = 6,因此采集该实例时,就会产生6个产品变体。

那变体怎么采集呢?按照平常 正则表达式思路,必须找HTML规律,我们先来看看产品颜色HTML代码如下:

<ul id="j-sku-list-1" class="sku-attr-list util-clearfix" data-sku-prop-id="14">
 <li class="item-sku-image"><a data-role="sku" data-sku-id="193" id="sku-1-193" title="Black" href="javascript:;" data-spm-anchor-id="2114.12010108.1000016.1"><img src="http://g02.a.alicdn.com/kf/HTB1whl0LVXXXXbiaXXXq6xXFXXXg/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg_50x50.jpg" title="Black" bigpic="http://g02.a.alicdn.com/kf/HTB1whl0LVXXXXbiaXXXq6xXFXXXg/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg"></a></li>
 <li class="item-sku-image"><a data-role="sku" data-sku-id="173" id="sku-1-173" title="Blue" href="javascript:;" data-spm-anchor-id="2114.12010108.1000016.2"><img src="http://g02.a.alicdn.com/kf/HTB1SCp4LVXXXXb5XVXXq6xXFXXXF/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg_50x50.jpg" title="Blue" bigpic="http://g02.a.alicdn.com/kf/HTB1SCp4LVXXXXb5XVXXq6xXFXXXF/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg"></a></li>
 <li class="item-sku-image"><a data-role="sku" data-sku-id="691" id="sku-1-691" title="Gray" href="javascript:;" data-spm-anchor-id="2114.12010108.1000016.3"><img src="http://g03.a.alicdn.com/kf/HTB1fxapLVXXXXXGXXXXq6xXFXXXf/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg_50x50.jpg" title="Gray" bigpic="http://g03.a.alicdn.com/kf/HTB1fxapLVXXXXXGXXXXq6xXFXXXf/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg"></a></li>
 <li class="item-sku-image"><a data-role="sku" data-sku-id="350852" id="sku-1-350852" title="Orange" href="javascript:;" data-spm-anchor-id="2114.12010108.1000016.4"><img src="http://g01.a.alicdn.com/kf/HTB1YXVZLVXXXXawaXXXq6xXFXXXR/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg_50x50.jpg" title="Orange" bigpic="http://g01.a.alicdn.com/kf/HTB1YXVZLVXXXXawaXXXq6xXFXXXR/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg"></a></li>
 <li class="item-sku-image"><a data-role="sku" data-sku-id="1052" id="sku-1-1052" title="Pink" href="javascript:;" data-spm-anchor-id="2114.12010108.1000016.5"><img src="http://g03.a.alicdn.com/kf/HTB10_ymLVXXXXb3XXXXq6xXFXXX5/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg_50x50.jpg" title="Pink" bigpic="http://g03.a.alicdn.com/kf/HTB10_ymLVXXXXb3XXXXq6xXFXXX5/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg"></a></li>
 <li class="item-sku-image"><a data-role="sku" data-sku-id="496" id="sku-1-496" title="Purple" href="javascript:;" data-spm-anchor-id="2114.12010108.1000016.6"><img src="http://g01.a.alicdn.com/kf/HTB11wt1LVXXXXbaaXXXq6xXFXXXb/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg_50x50.jpg" title="Purple" bigpic="http://g01.a.alicdn.com/kf/HTB11wt1LVXXXXbaaXXXq6xXFXXXb/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg"></a></li>
</ul>
View Code

ui->li->a 标签,就是各颜色信息,如黑色:

1 <a data-role="sku" data-sku-id="193" id="sku-1-193" title="Black" href="javascript:;" data-spm-anchor-id="2114.12010108.1000016.1"><img src="http://g02.a.alicdn.com/kf/HTB1whl0LVXXXXbiaXXXq6xXFXXXg/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg_50x50.jpg" title="Black" bigpic="http://g02.a.alicdn.com/kf/HTB1whl0LVXXXXbiaXXXq6xXFXXXg/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg"></a>
View Code

比较其他颜色,不难发现 a 标签 data-sku-id 属性值不同颜色不一样,且是数字类型,位数不一,初步推测可能是颜色的一个编码。而标签title属性就是颜色真正英文名称如Black,Blue等。

产品大小HTML代码如下:

1 <ul id="j-sku-list-2" class="sku-attr-list util-clearfix" data-sku-prop-id="5" data-sku-show-type="none" data-widget-cid="widget-17">
2 <li><a data-role="sku" data-sku-id="361386" id="sku-2-361386" href="javascript:void(0)" data-spm-anchor-id="2114.12010108.1000016.7"><span>M</span></a></li>
3  </ul>
View Code

也是ui->li->a 标签,就是各大小信息,如M:

1 <a data-role="sku" data-sku-id="361386" id="sku-2-361386" href="javascript:void(0)" data-spm-anchor-id="2114.12010108.1000016.7"><span>M</span></a>
View Code

不难发现a 标签 data-sku-id 属性值也是数字类型,虽然是一种产品大小,但是我觉得这个规律应该跟颜色一样,是各种产品大小代码,大家可能发现 id 属性的规律 “sku-2-”+代码,是产品大小信息id,其实颜色也是有id “sku-1-”+代码 ,所有发现 id sku-1 开头的是颜色,sku-2 开头的大小。那产品大小缩写名称不像颜色样放在title里面,而是a->span标签的内容。

综合上面所找的规律

1>. a 标签,

2>. data-sku-id属性数字,位数不一

3>. title是颜色英文名称

4>. a->span 标签内容是产品大小缩写名称

5>. 且标签有可能在请求完后,返回的不一定和浏览器开发工具(F12)显示一样 .

是不是很难写出一个高效,而无误的正则表达式。

那是不是还有其他方便的方法呢? 正在我想放弃的时候,就有一个想法(速卖通产品信息页面颜色应该也是通过javascript渲染出来的,那应该搜索一些颜色名称,看是不是有什么发现!),我就拿“Black” 在F12搜索了一下!

确实找到了四处,但是我看了一下,没有找到渲染颜色相关javascript代码,我又想不应该啊,后来想想不是有颜色编号? 我就赶紧拿“193” BLACK 搜索一下,果然惊喜出现了,如图

红框的部分,就是“193”搜索到信息,那我们再来搜索一下大小“361386” ,结果又惊呆了,搜索结果如下图:

是不是两个图,搜索到结果,都指向同一个代码区块。这时我确信这段代码就是速卖通渲染颜色和大小javascript,准确来说应该json格式数据。

开始研究该段代码咯

6.JSON代码分析,先用在线格式化工具,进行JSON格式化一下,否则太难看,眼睛受不了,考出var skuProducts 这个数组所有数据,格式化代码如下

  1 [
  2     {
  3         "skuAttr": "14:193;5:361386", 
  4         "skuPropIds": "193,361386", 
  5         "skuVal": {
  6             "actSkuBulkCalPrice": "6.84", 
  7             "actSkuBulkPrice": "6.84", 
  8             "actSkuCalPrice": "7.20", 
  9             "actSkuDisplayBulkPrice": "US $6.84", 
 10             "actSkuMultiCurrencyBulkPrice": "6.84", 
 11             "actSkuMultiCurrencyCalPrice": "7.2", 
 12             "actSkuMultiCurrencyDisplayPrice": "7.20", 
 13             "actSkuMultiCurrencyPrice": "US $7.20", 
 14             "actSkuPrice": "7.20", 
 15             "availQuantity": 7, 
 16             "bulkOrder": 5, 
 17             "inventory": 10, 
 18             "isActivity": true, 
 19             "skuBulkCalPrice": "15.2", 
 20             "skuBulkPrice": "15.20", 
 21             "skuCalPrice": "16.00", 
 22             "skuDisplayBulkPrice": "US $15.20", 
 23             "skuMultiCurrencyBulkPrice": "15.2", 
 24             "skuMultiCurrencyCalPrice": "16.0", 
 25             "skuMultiCurrencyDisplayPrice": "16.00", 
 26             "skuMultiCurrencyPrice": "US $16.00", 
 27             "skuPrice": "16.00"
 28         }
 29     }, 
 30     {
 31         "skuAttr": "14:173;5:361386", 
 32         "skuPropIds": "173,361386", 
 33         "skuVal": {
 34             "actSkuBulkCalPrice": "6.84", 
 35             "actSkuBulkPrice": "6.84", 
 36             "actSkuCalPrice": "7.20", 
 37             "actSkuDisplayBulkPrice": "US $6.84", 
 38             "actSkuMultiCurrencyBulkPrice": "6.84", 
 39             "actSkuMultiCurrencyCalPrice": "7.2", 
 40             "actSkuMultiCurrencyDisplayPrice": "7.20", 
 41             "actSkuMultiCurrencyPrice": "US $7.20", 
 42             "actSkuPrice": "7.20", 
 43             "availQuantity": 9, 
 44             "bulkOrder": 5, 
 45             "inventory": 10, 
 46             "isActivity": true, 
 47             "skuBulkCalPrice": "15.2", 
 48             "skuBulkPrice": "15.20", 
 49             "skuCalPrice": "16.00", 
 50             "skuDisplayBulkPrice": "US $15.20", 
 51             "skuMultiCurrencyBulkPrice": "15.2", 
 52             "skuMultiCurrencyCalPrice": "16.0", 
 53             "skuMultiCurrencyDisplayPrice": "16.00", 
 54             "skuMultiCurrencyPrice": "US $16.00", 
 55             "skuPrice": "16.00"
 56         }
 57     }, 
 58     {
 59         "skuAttr": "14:691;5:361386", 
 60         "skuPropIds": "691,361386", 
 61         "skuVal": {
 62             "actSkuBulkCalPrice": "6.84", 
 63             "actSkuBulkPrice": "6.84", 
 64             "actSkuCalPrice": "7.20", 
 65             "actSkuDisplayBulkPrice": "US $6.84", 
 66             "actSkuMultiCurrencyBulkPrice": "6.84", 
 67             "actSkuMultiCurrencyCalPrice": "7.2", 
 68             "actSkuMultiCurrencyDisplayPrice": "7.20", 
 69             "actSkuMultiCurrencyPrice": "US $7.20", 
 70             "actSkuPrice": "7.20", 
 71             "availQuantity": 10, 
 72             "bulkOrder": 5, 
 73             "inventory": 10, 
 74             "isActivity": true, 
 75             "skuBulkCalPrice": "15.2", 
 76             "skuBulkPrice": "15.20", 
 77             "skuCalPrice": "16.00", 
 78             "skuDisplayBulkPrice": "US $15.20", 
 79             "skuMultiCurrencyBulkPrice": "15.2", 
 80             "skuMultiCurrencyCalPrice": "16.0", 
 81             "skuMultiCurrencyDisplayPrice": "16.00", 
 82             "skuMultiCurrencyPrice": "US $16.00", 
 83             "skuPrice": "16.00"
 84         }
 85     }, 
 86     {
 87         "skuAttr": "14:350852;5:361386", 
 88         "skuPropIds": "350852,361386", 
 89         "skuVal": {
 90             "actSkuBulkCalPrice": "6.84", 
 91             "actSkuBulkPrice": "6.84", 
 92             "actSkuCalPrice": "7.20", 
 93             "actSkuDisplayBulkPrice": "US $6.84", 
 94             "actSkuMultiCurrencyBulkPrice": "6.84", 
 95             "actSkuMultiCurrencyCalPrice": "7.2", 
 96             "actSkuMultiCurrencyDisplayPrice": "7.20", 
 97             "actSkuMultiCurrencyPrice": "US $7.20", 
 98             "actSkuPrice": "7.20", 
 99             "availQuantity": 10, 
100             "bulkOrder": 5, 
101             "inventory": 10, 
102             "isActivity": true, 
103             "skuBulkCalPrice": "15.2", 
104             "skuBulkPrice": "15.20", 
105             "skuCalPrice": "16.00", 
106             "skuDisplayBulkPrice": "US $15.20", 
107             "skuMultiCurrencyBulkPrice": "15.2", 
108             "skuMultiCurrencyCalPrice": "16.0", 
109             "skuMultiCurrencyDisplayPrice": "16.00", 
110             "skuMultiCurrencyPrice": "US $16.00", 
111             "skuPrice": "16.00"
112         }
113     }, 
114     {
115         "skuAttr": "14:1052;5:361386", 
116         "skuPropIds": "1052,361386", 
117         "skuVal": {
118             "actSkuBulkCalPrice": "6.84", 
119             "actSkuBulkPrice": "6.84", 
120             "actSkuCalPrice": "7.20", 
121             "actSkuDisplayBulkPrice": "US $6.84", 
122             "actSkuMultiCurrencyBulkPrice": "6.84", 
123             "actSkuMultiCurrencyCalPrice": "7.2", 
124             "actSkuMultiCurrencyDisplayPrice": "7.20", 
125             "actSkuMultiCurrencyPrice": "US $7.20", 
126             "actSkuPrice": "7.20", 
127             "availQuantity": 10, 
128             "bulkOrder": 5, 
129             "inventory": 10, 
130             "isActivity": true, 
131             "skuBulkCalPrice": "15.2", 
132             "skuBulkPrice": "15.20", 
133             "skuCalPrice": "16.00", 
134             "skuDisplayBulkPrice": "US $15.20", 
135             "skuMultiCurrencyBulkPrice": "15.2", 
136             "skuMultiCurrencyCalPrice": "16.0", 
137             "skuMultiCurrencyDisplayPrice": "16.00", 
138             "skuMultiCurrencyPrice": "US $16.00", 
139             "skuPrice": "16.00"
140         }
141     }, 
142     {
143         "skuAttr": "14:496;5:361386", 
144         "skuPropIds": "496,361386", 
145         "skuVal": {
146             "actSkuBulkCalPrice": "6.84", 
147             "actSkuBulkPrice": "6.84", 
148             "actSkuCalPrice": "7.20", 
149             "actSkuDisplayBulkPrice": "US $6.84", 
150             "actSkuMultiCurrencyBulkPrice": "6.84", 
151             "actSkuMultiCurrencyCalPrice": "7.2", 
152             "actSkuMultiCurrencyDisplayPrice": "7.20", 
153             "actSkuMultiCurrencyPrice": "US $7.20", 
154             "actSkuPrice": "7.20", 
155             "availQuantity": 9, 
156             "bulkOrder": 5, 
157             "inventory": 10, 
158             "isActivity": true, 
159             "skuBulkCalPrice": "15.2", 
160             "skuBulkPrice": "15.20", 
161             "skuCalPrice": "16.00", 
162             "skuDisplayBulkPrice": "US $15.20", 
163             "skuMultiCurrencyBulkPrice": "15.2", 
164             "skuMultiCurrencyCalPrice": "16.0", 
165             "skuMultiCurrencyDisplayPrice": "16.00", 
166             "skuMultiCurrencyPrice": "US $16.00", 
167             "skuPrice": "16.00"
168         }
169     }
170 ]
View Code

 格式化后,是不是一眼发现是一个json数组,且数组长度正好是6,正好产品变体数量吻合,那就开始从这个json数组分析能够从中抓到那些产品信息。

先拿json数组中的一个json对象来分析,其他依次类推,代码如下:

 1 {
 2         "skuAttr": "14:193;5:361386", 
 3         "skuPropIds": "193,361386", 
 4         "skuVal": {
 5             "actSkuBulkCalPrice": "6.84", 
 6             "actSkuBulkPrice": "6.84", 
 7             "actSkuCalPrice": "7.20", 
 8             "actSkuDisplayBulkPrice": "US $6.84", 
 9             "actSkuMultiCurrencyBulkPrice": "6.84", 
10             "actSkuMultiCurrencyCalPrice": "7.2", 
11             "actSkuMultiCurrencyDisplayPrice": "7.20", 
12             "actSkuMultiCurrencyPrice": "US $7.20", 
13             "actSkuPrice": "7.20", 
14             "availQuantity": 7, 
15             "bulkOrder": 5, 
16             "inventory": 10, 
17             "isActivity": true, 
18             "skuBulkCalPrice": "15.2", 
19             "skuBulkPrice": "15.20", 
20             "skuCalPrice": "16.00", 
21             "skuDisplayBulkPrice": "US $15.20", 
22             "skuMultiCurrencyBulkPrice": "15.2", 
23             "skuMultiCurrencyCalPrice": "16.0", 
24             "skuMultiCurrencyDisplayPrice": "16.00", 
25             "skuMultiCurrencyPrice": "US $16.00", 
26             "skuPrice": "16.00"
27         }
28     }

我们刚刚是不是拿产品颜色编号,产品大小编写搜索到的上面javascript 代码的,那很显然,产品颜色,大小都可以从上面代码找到,那具体在哪里呢?

那Black 编号 193 ,大小编号 361386 就一眼看到上面的 第一个属性,和第一个熟悉都有,分别代码 "skuAttr": "14:193;5:361386", "skuPropIds": "193,361386"

如果抓第一个属性势必要split两次才能取到值,这样看第二个属性比较合适split一次,即可抓到值。当然这样还是抓到编号,要抓到颜色英文名称,大小英文名称,那还要结合上面颜色和大小html标签,写两个简单的正则表达式,然后放占位,通过string.format得到最终的正则表达式,就可以比较可靠的,高效的抓到颜色,大小。文章最后我再给出所有正则表达式。

继续观察json对象,看到的就是一些us $,price 字眼,可以判断基本上就是单价,币别信息,价格分实价,折扣价,如下图

上图实价是us $16.00 ,而折扣价是us $7.20 ,上面是不是发现有很多个相同的,有单独的只有一个价格,有和币别在一起的,这里就看个人喜好了,我这里就找单独单价的(发现币别还有一个地方可以取,晚点再说!),我不喜好老是split,或者字符串截取,因为这样很容易出错,而且处理繁琐。那单独的是不是也有很多个,怎么选择呢? 这里我的原则是属性名称容易看得懂的,且简单的,从上面代码可以发现"skuPrice": "16.00" 取实价,"actSkuPrice": "7.20" 取折扣价。那这样产品价格就已经搞定了。

那币别呢?我之前不是说,币别不在这个json里面取,还要split繁琐得很,而且US $ 取到的还不是国际标准币别代码(USD),那怎么办呢,还能怎么办呢再搜索一下源码吧。我们搜一下USD看看!如下图:

 搜到4处,但是最好识别的一处是上图标出的,window.runParams.currencyCode="USD"; 是不是从属性命名就觉得这个币别抓取最合适,且大家发现正好和产品变体的JSON在一块,如何获取就是简单的正则表达式就可以获取了。币别也搞定。

7. 产品图片是产品所有原始大小图片,不需要采集缩略图,不管一个产品变体有多少个,他对应的产品图片都是同一套,所有只要采集一次即可。

一般也是找图片img->src 标签,然后写正则表达式,我也不是很喜欢正则表达式。所以我还是想找找其他地方,看看有没有先产品变体一样类似的JSON。

还是F12 随便找一张大图的img->src 将内容考出来,搜索HTML源码,搜索串如下:

http://g02.a.alicdn.com/kf/HTB11XybLVXXXXbDXFXXq6xXFXXXM/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg

搜索到最中意结果如下图:

又是找到一个JSON数组,太高兴了吧,提取代码确认是否是产品图片,代码如下:


1 [
2 "http://g02.a.alicdn.com/kf/HTB11XybLVXXXXbDXFXXq6xXFXXXM/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg",
3 "http://g03.a.alicdn.com/kf/HTB1G45fLVXXXXbEXpXXq6xXFXXXi/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg",
4 "http://g02.a.alicdn.com/kf/HTB1dhCfLVXXXXb8XpXXq6xXFXXXX/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg",
5 "http://g03.a.alicdn.com/kf/HTB1Kd04LVXXXXcEXVXXq6xXFXXXL/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg",
6 "http://g02.a.alicdn.com/kf/HTB1ks1oLVXXXXbtXXXXq6xXFXXXH/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg",
7 "http://g01.a.alicdn.com/kf/HTB1jsGfLVXXXXXXXFXXq6xXFXXXm/Yoga-Tank-Tops-Shirts-Women-Yoga-Shirts-Womens-Sportswear-Gym-Woman-Running-Shirts-Sports-Woman-Gym.jpg"
8 ]

首先从数组长度等于6,说明有六张图片,与下图红框的六张吻合。

这样还不能说明是产品图片,那我们从数组把第一个图片链接拿出来,在浏览器浏览一下,请求结果如下图:

是不是都是这个穿黑衣服外国美女啊,综上所述可以肯定这个数组就是传说中的产品图片。

好了,到了这里比较难采集的多已经分析完成了,至于产品名称,产品描述基本可以用正则表达式取到,当然取json也需要正则表达式来取,那本篇文章稍后我会把所有正则表达式列出来,就基本结束了,

由于篇幅过长问题,实践的部分,我会尽快再开一篇 “速卖通产品采集系列之产品采集实践” 博文,并把源代码放出来,敬请期待。

三. 正则表达式如下(由于正则表达式个人不是很精通,写得不够通用,请笑纳):

1.产品名称:(?<=<h1 class=\"product-name\" itemprop=\"name\">).*?(?=</h1>)

2.产品图片:(?<=window.runParams.imageBigViewURL=).*?(?=;)

3.变体JSON:(?<=var skuProducts=).*?(?=;\s*var skuAttrIds=)

4.产品颜色:(?<=<a data-role=\"sku\" data-sku-id=\"{0}\" id=\"sku-1-{0}\" title=\").*?(?=\")        “{0}”不是正则表达式,是string.format 的占位

5.产品大小:(?<=<a data-role=\"sku\" data-sku-id=\"{0}\" id=\"sku-2-{0}\" href=\"javascript:void\(0\)\"\s+><span>).*?(?=</)     “{0}”不是正则表达式,是string.format 的占位

6.币别:(?<=window.runParams.currencyCode=\").*?(?=\";)

 

posted @ 2016-05-11 08:52  改變世界  阅读(6934)  评论(9编辑  收藏  举报