如何获取京东商品价格和商品评分
2012年12月15日 22:50
由于课程作业的需求,我们要抓取京东商品的信息。在抓取商品的价格、评论人数以及评分的时候遇到一些麻烦。下面提供我的解决方案。
1. 商品价格:
京东上面的商品价格都是用图片显示的,不过庆幸的时,所有数字的字体、大小、颜色都是一样的。简单起见,直接把二维图片变成灰度图,取个反,影射成一维结构后进行切割和匹配。用了一个简单的匹配评估函数,只是对于数字不变的情况总是能得到正确的结果,如果字体、颜色、大小等变了,估计就得不到正确结果了。具体代码如下
#!/usr/bin/python
# coding=utf-8
import Image, sys
class PriceReco:
img_data = []
size_x, size_y = 0, 0
def __init__(self, filename): #加载变换图片
try:
img = Image.open(filename)
except:
print filename, "load error"
return
self.size_x, self.size_y = img.size
self.img_data = list(img.convert('L').getdata())
for i in range(0, len(self.img_data)):
self.img_data[i] = 255 - self.img_data[i]
#print filename, "load success, image size is", self.size_x, self.size_y
#print self.img_data
def getone(self, single): #识别单个数字
table_value = [
[189, 378, 945, 1512, 2079, 1701, 1701, 1134, 945, 378, 189], #¥
[567, 567], # .
[1323, 1701, 756, 378, 378, 378, 756, 1701, 1323], # 0
[378, 378, 2079, 2079, 189, 189], # 1
[567, 945, 756, 756, 756, 756, 945, 945, 567], # 2
[756, 1134, 378, 567, 567, 567, 1323, 1512, 756], # 3
[378, 378, 378, 378, 378, 378, 2079, 2079, 189, 189], # 4
[378, 1512, 1134, 567, 567, 567, 945, 1134, 756], # 5
[1134, 1512, 945, 756, 567, 567, 945, 1134, 567], # 6
[189, 189, 378, 756, 945, 945, 945, 756, 378], # 7
[756, 1512, 1323, 567, 567, 567, 1323, 1512, 756], # 8
[567, 1134, 945, 567, 567, 756, 945, 1512, 1134], # 9
]
table_key = ['¥', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
key_id, min_value = 0, 100000
#print single
for k in range(0, len(table_key)):
#print len(table_value[k]), len(single)
value = 10 * (len(table_value[k]) - len(single)) ** 2
#print value
for i in range(0, min(len(table_value[k]), len(single))):
value += (table_value[k][i] - single[i]) ** 2
#print value
if value < min_value:
key_id, min_value = k, value
#print "updata: ", key_id, min_value
#print min_value
if min_value > 100:
return 'N'
else:
return table_key[key_id]
def recognita(self): #切分和识别图片
cnt = [0] * self.size_x
for x in range(0, self.size_x):
for y in range(0, self.size_y):
index = y * self.size_x + x
cnt[x] += self.img_data[index]
#print cnt
x = 0
number = ""
while x < self.size_x:
if cnt[x]:
single = []
while x < self.size_x and cnt[x]:
single.append(cnt[x])
x += 1
number += self.getone(single)
x += 1
return number
if __name__ == '__main__':
if len(sys.argv) != 2:
print "Usage: price_reco image"
price = PriceReco(sys.argv[1])
print price.recognita()
2. 评论人数以及商品评分
这个问题就简单多了,虽然京东304(重定向)了n次,稍加分析就可以知道,直接访问如下url就可以得到评论人数和商品评分了
http://club.360buy.com/ProductPageService.aspx?method=GetCommentSummaryBySkuId&referenceId=$id&callback=GetCommentSummaryBySkuId
其中 $id是商品的id,这个得到很简单。
于是就成功攻破京东,o(∩∩)o...哈哈!