这个很容易啦……
京东价格图片的脆弱之处
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好用!!!!