一、需求来源
因为在编写爬虫程序时,经常会遇到,电话号码使用图片格式显示。程序无法直接拿到其中的电话号码。
二、解决思路
1、拿到该网站从0-9的数字的图片,并将每个图片转换成相应的向量。
2、需要使用python读取图片。
3、将读取出来的图片分割开来。
4、将分割出来的数字图片和已经转换成向量的的图片相比较。如果相等就返回该数值。
三、用到的模块
1、urllib2
2、Image
3、cStringIO
4、os
四、上代码
# -*- coding:utf-8 -*-
import os
from PIL import Image
import cStringIO
import urllib2
class Number2vector(object):
def __init__(self):
#在构造函数时就拿到{'数字':'向量'}的字典。
numdict = self.get_numberdict()
file_path = "phoneimage/phone3.png"
# 这里是将之前已经转换为向量的数字拿到一个字典里面,方便之后的比对。
def get_numberdict(self):
numdict = dict()
path = "numbertxt"
file_list = os.listdir(path)
for filex in file_list:
filex = path + '/' + filex
f = open(filex)
c = f.read()
key = filex.split('/')[1].split('.')[0].replace('m', '')
numdict[key] = c
return numdict
#将图片转换为用0和1表示的字符串
def image2text(self, im):
width = im.size[0]
height = im.size[1]
tmstr = ""
for i in range(0,width):
for j in range(0,height):
cl=im.getpixel((i,j))
if(cl==0):
#黑色
tmstr = tmstr + "1"
else:
tmstr = tmstr + "0"
tmstr = tmstr + "\n"
return tmstr
# 用来比较向量是否相等。如果相等则返回该数字
def get_number(self, im):
text = self.image2text(im)
numdict = self.get_numberdict()
keys = list()
vals = list()
for k, v in numdict.items():
keys.append(k)
vals.append(v)
if text in vals:
i = vals.index(text)
return keys[i]
else:
return None
def splitimage(self,file_path):
region_list = list()
# 判断该文件是本地文件还是web文件。
if "http://" in file_path or "https://" in file_path:
image = cStringIO.StringIO(urllib2.urlopen(file_path).read())
im = Image.open(image)
else:
im = Image.open(file_path)
width = im.size[0]
i = 0
while i < width - 9:
box = (i, 0, i+9, 25)
region = im.crop(box)
i += 9
region_list.append(region)
return region_list
def getimagefromweb(file_path):
file = cStringIO.StringIO(urllib2.urlopen(file_path).read())
def do_main(self, file_path = "phoneimage/phone3.png"):
region_list = self.splitimage(file_path)
strx = ""
for r in region_list:
tmpnum = self.get_number(r)
if tmpnum != None:
strx = strx + tmpnum
return strx
file_path = "这里填写你的图片路径"
n = Number2vector()
print n.do_main(file_path)
五、备注
在之前准备工作中,我为了拿到准确的{"数字":"向量"}的键值对。需要多次进行比较。并且要拿到该网站中从0-9所有的数字。