菜鸟学R语言:用R抓取价格数据,当红单反性价比排行出炉

May 17, 2013

Tags:菜鸟学R语言

上次写了如何用R分析哪款相机性价比最高的文章,由于抓取的相机性能评分网站Dxomark.com上的价格数据不是实时更新的。所以,我又找了些方法学习如何抓取电商上的价格数据。

选哪个电商网站的商品价格

国内就全国而言比较良心的综合类电商就属“京东商城”和“亚马逊中国”了,像苏宁易购、一号店等的价格优势都各有偏重,价格更新不如京东和亚马逊能够及时反映数码产品快速变化的市场走势。然后,由于京东对网页抓取价格的行为进行了限制,对商品网页中的价格进行了图片加密,虽然页面显示是可以直接拷贝文本,但html源代码中只有图片链接。估计,用python的一些图片识别库是可以抓的,因为有网站做得挺好,比如“西贴(www.xitie.com/360buy/)”。

所以,我选择了对价格战敏感度较低的亚马逊中国的商品进行价格抓取。此法同样适用于亚马逊其他网站,因为其网页源代码是类似的。

人工获取商品代码

由于要对特定商品进行价格抓取,而不是一劳永逸的提供用户搜索,让用户选择商品。所以,必须预先获取商品的链接。幸好单反相机的商品品类不多,全靠我一个个复制粘贴而来。我没有选择全选搜索而来的链接,只选了商品代码,比如,

http://www.amazon.cn/gp/product/B00C93NHHY/ref=s9_simh_gw_p421_d0_i1?pf_rd_m=A1AJ19PSB66TGU&pf_rd_s=center-3&pf_rd_r=10TJ5625EJ46C17SN3ZN&pf_rd_t=101&pf_rd_p=58223152&pf_rd_i=899254051

链接中粗体部分就是我需要的代码,后面都是返利或者浏览行为追踪的代码。

就这样,我选取了亚马逊有货的67款相机来进行抓取和分析,包括佳能、尼康、索尼、富士、松下、奥林巴斯,这六个品牌的入门单反、半专业单反、普通便携、高端便携、微型单反,这五种分类分别进行比较。

首先,把商品链接存入一个数据框中,如下图:

camera1

然后就可以用XML包里的htmlParse函数对网页进行解析,然后用火狐或Chrome开源代码,找到包裹价格和商品名的html代码(我不知道具体应该怎么叫这个),为了这个还专门看了xpath相关的背景知识,啃了半天。其实也可以用正则表达式,这玩意看起来语法更麻烦,反正我的需求很小,就不学了。如图,选中价格,右键选择“查看选中部分源代码”,即可。

camera2

为了核对商品名和价格,并和之前的数据库进行合并,所以商品名也要抓取。同理。

价格抓取的函数如下:

pricefinder< -function(url){
  name_text<-""
  price_text<-""
  i<-1
  for(i_url in url){
    i_url2<-htmlParse(i_url,encoding="UTF-8")  ##对html网页进行解析
    name<- getNodeSet(i_url2,"//span[@id='btAsinTitle']")  ##根据xpath路径,定位要抓取的数据
    name_text_tmp<-xmlValue(name[[1]]) ##用xmlValue读取节点数据并暂存
    price<-getNodeSet(i_url2,"//b[@class='priceLarge']")
    if(price[1] == 'NULL'){  ##判断商品是否无货,即没有价格标签
      price_text_tmp = "out of stock"
    }else{
      price_text_tmp <- xmlValue(price[[1]]) 
    }
    name_text[i]<-name_text_tmp
    price_text[i]<-price_text_tmp
    i<-i+1
  }
  data.frame(name=name_text,price=price_text)
}

然后,执行该函数,获得的数据框如下,

camera3

看出里面有乱码,无所谓,去掉就好了,反正就算是汉字也是要去掉的。然后进行一下合并处理。

r1[,2] = sub('^..','',r1[,2])
r1[,2] = gsub(',','',r1[,2])

这样抓取过程就差不多了。下面就要考虑如何处理这些数据了。由于本人逃过很多数理统计课去打篮球了,为了避免不同相机的性能评分差异和价格差异不同,需要更多数据对其进行标准化后,才能得出可信的性价比。所以,干脆对其进行排序,得出排名作为其分数,这里使用的是R中的rank函数,很简单,代码就不放了。此外,为了针对不同用户,并对每一款相机负责的态度,我们先不进行全部排名,而是分类排名。

普通便携相机

Model Type pricermb ppratio
Canon PowerShot S100 Compact 1794.1 3
Fujifilm FinePix F600EXR Compact 1250 2
Canon Powershot S110 Compact 2288 1.5
Fujifilm XF1 Compact 2549 1.4
Panasonic Lumix DMC LX7 Compact 2699 1.285714
Fujifilm FinePix X10 Compact 2788 1.125
Canon Powershot G12 Compact 2688 0.75
Fujifilm FinePix F550EXR Compact 1613.6 0.5
Canon PowerShot SX50 HS Compact 3059 0.5
Canon Powershot G15 Compact 3099 0.3

可见,佳能的S100胜出,富士F600exr(国内型号F665exr)和佳能S110分列二三位。

canons100

高端便携相机

Model Type pricermb ppratio
Sony Cyber-shot DSC-RX100 High-end compact 3772.9 1.666667
Canon PowerShot S95 High-end compact 2199 1
Sony Cyber-shot DSC-RX1 High-end compact 18988 1
Fujifilm FinePix X100 High-end compact 6819 1
Canon PowerShot G1X High-end compact 3939 1
Panasonic Lumix DMC LX5 High-end compact 2198 1
Nikon 1 V2 High-end compact 5499 0.6

果然是高端机,大家差距都不大,或者可以说是一分钱一分货,没啥好比的。索尼的黑卡相机RX100勇夺冠军,其他五款并列亚军,尼康V2位列最后并获得珍贵的季军。

rx100

半专业单反

Model Type pricermb ppratio
Nikon D7000 Semi-Pro DSLR 6188 2.5
Nikon D7100 Semi-Pro DSLR 8199 2
Canon EOS 60D Semi-Pro DSLR 5399 1.5
Nikon D600 Semi-Pro DSLR 11111 1.428571
Canon EOS 6D Semi-Pro DSLR 10900 1.166667
Nikon D800E Semi-Pro DSLR 18199 1.142857
Nikon D800 Semi-Pro DSLR 18199 1.047619
Sony SLT Alpha 99 Semi-Pro DSLR 17800 1
Sony SLT Alpha 77 Semi-Pro DSLR 7474.9 1
Canon EOS 5D Mark II Semi-Pro DSLR 12590 0.5
Canon EOS 5D Mark III Semi-Pro DSLR 19488 0.5
Canon EOS 7D Semi-Pro DSLR 8499 0.3

Dxomark把这些都叫做半专业,我不知道这星球上啥相机是专业的了。显然,在高端单反方面,DxoLab是尼康粉,佳能的无敌兔和无敌伞位列倒数第二和第三位,与之对应的尼康D800和D800E则排在中游,中规中矩。此外,索尼在高端单反方面一直处于中下游,因此,对该结果并不意外,所以的策略显然更多在微单上了。冠亚军分别被尼康的D7000和D7100获得。

d7000

入门单反

Model Type pricermb ppratio
Nikon D3200 Entry-level DSLR 3070 11
Nikon D5100 Entry-level DSLR 3550 3.333333
Canon EOS 600D Entry-level DSLR 3399 2
Sony SLT Alpha 58 Entry-level DSLR 3605.6 1.5
Sony SLT Alpha 57 Entry-level DSLR 3999 1.285714
Nikon D5200 Entry-level DSLR 4499 1.090909
Nikon D90 Entry-level DSLR 4208 0.666667
Canon EOS 1100D Entry-level DSLR 3600 0.625
Sony SLT Alpha 65 Entry-level DSLR 4899 0.625
Canon EOS 550D Entry-level DSLR 4299 0.5
Canon EOS 650D Entry-level DSLR 3880 0.416667
Canon EOS 700D Entry-level DSLR 4081 0.125

对尼康D3200获得冠军很意外,领先第二名足足6分之多,显然在性价比方面与其他11部相机拉开了差距。但也要理性看待,因为入门单反的价格基本集中在3000至5000之间,这也是普通用户开始考虑入手单反的心理价位区间。所以,既然是入门单反,根据自己喜好买就行,差别没有这张表上的那么差异大。

d3200

微单(微型单反)

我是有意把这个排名放在最后的,因为我觉得微单是普通用户享受摄影乐趣的最终归宿。具体原因可以再写一篇文章来阐述。

Model Type pricermb ppratio
Nikon 1 J1 Hybrid 2319 11.5
Olympus PEN E-PM2 Hybrid 2999 2.75
Sony NEX-3N Hybrid 3099 2.571429
Sony NEX-5R Hybrid 3580 2.05
Olympus PEN EPM1 Hybrid 2499 2
Nikon 1 J2 Hybrid 2859 1.6
Nikon 1 S1 Hybrid 3182.3 1.4375
Olympus PEN EPL3 Hybrid 2599 1.25
Sony NEX-6 Hybrid 5076 1.138889
Sony NEX-5N Hybrid 4999 1.117647
Sony NEX-7 Hybrid 6890 1.1
Olympus PEN E-PL5 Hybrid 4199 1.03125
Panasonic Lumix DMC GF2 Hybrid 3399 0.888889
Olympus OM-D E-M5 Hybrid 6380 0.763158
Nikon 1 V1 Hybrid 3639 0.727273
Panasonic Lumix DMC GX1 Hybrid 4099 0.666667
Panasonic Lumix DMC-GH3 Hybrid 9998 0.659091
Panasonic Lumix DMC GH2 Hybrid 9400 0.619048
Panasonic Lumix DMC GF5 Hybrid 2499 0.6
Nikon 1 J3 Hybrid 3670.9 0.416667
Olympus PEN EP3 Hybrid 3899 0.230769
Panasonic Lumix DMC GF3 Hybrid 3975 0.107143

j1

好家伙,尼康又夺魁了,很意外。在日本市场,可能尼康J1很畅销,但在大陆这款相机是非常小众的。微单方面,用户群最大的就是奥林巴斯的PEN系列和索尼的Nex系列。两家的旗舰级机器,奥林巴斯OM-D E-M5和索尼Nex 7的性价比分别排在中下游和中游水平。而在入门微单方面,奥巴的E-PM2战胜了索尼Nex 3N,分列本榜亚季军,但差距不大。用户再选择的时候,就要重点考虑两家的镜头群问题了,当然,这也是买微单的时候最需要考虑的。此外,过去很长一段时间索尼家热销的Nex 5N已经退出了目前市场上最具性价比相机的竞争了,其后续机型Nex 5R已经取代了她。

便携性

如果将机身重量作为便携性标准加入到性价比中,那么排名会是什么样的呢?下次再来讨论吧,顺便讲讲我个人的一点点业余的拍摄经验。

后记:

请注意,本文中的价格数据时基于2013年5月17日的亚马逊中国的当日价格,并且基本所有相机都是机身价格,如果亚马逊中没有机身卖,那就是搭配狗头(最廉价)的套餐价格。所以,可能对结果产生影响,大家就当做娱乐看待,各家的粉丝也不要喷我。

· The end ·