把京东的图片价格转成数字你们有什么解决方案?

15次阅读

把京东的图片价格转成数字,你们有什么解决方案?(linux 环境下)

远方的人

这个很容易啦……

京东价格图片的脆弱之处

1. 图片文字没有变形没有干扰
2. 数字是等宽字体,宽度11……只有小数点略小一些,宽度4,实际占用像素是2*3的小方块
3. 背景是纯白的很干净……

演示代码

因为很简单,识别起来很容易,基本用不着tesseract库。我花了1个小时写了一个python脚本来识别商品详情页高度为22像素的价格图片,随便写的,有很多magic number,仅供演示思路……

jdprice.py

#!/usr/bin/env python
#coding: utf8
from PIL import Image
import sys
from hashlib import md5

#最简单的特征库
dic = {
    '260e95e3844b2ef81f3ad2fa47b6d49d' : '0',
    '51c5d4ffad5f8e5891bf23f6d6709255' : '1',
    '429f85b1c5871d7e8fc98f5333b89b28' : '2',
    '345fc6453d0d7f08309812fe57a0e599' : '3',
    '201ff8418d9f1480476f7a0dc4db6db1' : '4',
    '7d6bd9160b95ab98b2b867cb33e1569b' : '5',
    '1a96218bd4f0c30e0b86850929297172' : '6',
    'e85124056a0f8c7eb77755a6f6c5296e' : '7',
    'ab4da42aa7dc51ac885e800248dd0c64' : '8',
    '658dae198ed91b24695986bc07e37ef6' : '9',
    '01eb55510763ce019186d126a8080d52' : '.',
     }

im = Image.open(sys.argv[1])
#截掉最左的人民币符号
im = im.crop((15, 0, im.size[0], im.size[1]))

#把背景从白变黑方便使用Image.getbbox
im = Image.eval(im, lambda x: x if x != 255 else 0)
ims = []
x = 0
while x < im.getbbox()[2]:
    #尝试切出小数点
    img = im.crop((x, 0, x + 4, im.size[1]))
    x0, y0, x1, y1 = img.getbbox()
    if y1 - y0 != 3 or x1 - x0 != 2:
        #红色区域太大,不是小数点
        img = im.crop((x, 0, x + 11, im.size[1]))
        x += 11
    else:
        x += 4
    ims.append(img.crop(img.getbbox()))

#调试用,输出切出来的各个字符    
#[ims[i].save('%d.png' % i) for i in range(len(ims))]

#输出结果,如果无法识别(特征库里找不到图片内容的md5值),则返回其内容的md5值
print ''.join([dic.get(md5(img.tostring()).hexdigest(), '?' + md5(img.tostring()).hexdigest() + '?') for img in ims])

用法:
1. 安装PIL库 pip install pil 或者 easy_install pil
2. 从京东抓一个图片,比如 wget http://jprice.360buyimg.com/price/gp799754-1-1-3.png, 原页面地址http://www.360buy.com/product/799754….
3. 执行 python jdprice.py gp799754-1-1-3.png,得到结果 1259.00

总结

1. 以前京东的价格图片上还有灰色的斜线,估计是容易让顾客误解,所以现在也去掉了……
2. 除去特征库和注释部分,python脚本一共写了18行……其实因为位置都很固定,完全可以不去黑边直接比对,代码还可以再短3~5行……
3. PIL 真t*d好用!!!!

Rodin

图像识别?

OpenFibers

机器学习+模式识别吧

dyzdyz010

比较好的方法就是抓取价格图片,然后用图像识别,京东的价格图片是非常容易识别的,可以参考这个开源OCR项目:

http://code.google.com/p/tesseract-oc…

qalong

你仔细找,其实还有非图片的价格。。

imhaiyang

正文完