如何获取京东商品价格和商品评分
2012年12月15日 22:50
由于课程作业的需求,我们要抓取京东商品的信息。在抓取商品的价格、评论人数以及评分的时候遇到一些麻烦。下面提供我的解决方案。
1. 商品价格:
京东上面的商品价格都是用图片显示的,不过庆幸的时,所有数字的字体、大小、颜色都是一样的。简单起见,直接把二维图片变成灰度图,取个反,影射成一维结构后进行切割和匹配。用了一个简单的匹配评估函数,只是对于数字不变的情况总是能得到正确的结果,如果字体、颜色、大小等变了,估计就得不到正确结果了。具体代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #!/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...哈哈!