Python爬虫(十七)
学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。
—— PIL库实践 识别验证码 ——
我们用下面两张图来作为主要例子:
首先我们观察这两张验证码的图片,不难发现,其实这是很普通的验证码,纯数字且数字本身没有发生变形。接下来我们对这两张图片进行初步的识别。
由于图片颜色分明,所以我们先从颜色下手。通过观察我们知道如果要分离开验证码就要把噪点和各种线段识别开。
建立识别条件:
- 一个数字的高度大约为10个像素格,加上用来容错的2个像素格,我们只需要限定长度超过10或低于9的颜色就可以。
- 一个数字的宽度大约为10个像素格,加上用来容错的1个像素格,我们只需要限定长度超过11的颜色就可以。
- 为了避免有干扰项符合以上条件,我们还需要限定像素格的数量,我们选择符合以上条件像素点最多的。
from PIL import Image
from pytesseract import * #若要正常使用需要首先安装好tesseract-ocr,否则会报错
import requests
def scan(im, xx, yy):
pix = im.load()
dic = {} #{23:{'count':1, 'left':0, 'right':0, 'up':1, 'down':1}, ……}
for x in range(xx):
for y in range(yy):
if pix[x,y] in dic.keys():
dic[pix[x,y]]['count'] = dic[pix[x,y]]['count'] + 1
if x > dic[pix[x,y]]['right']:
dic[pix[x,y]]['right'] = x
if x < dic[pix[x,y]]['left']:
dic[pix[x,y]]['left'] = x
if y > dic[pix[x,y]]['up']:
dic[pix[x,y]]['up'] = y
if y < dic[pix[x,y]]['down']:
dic[pix[x,y]]['down'] = y
else:
dic[pix[x,y]] = {'count':1, 'left':x, 'right':x, 'up':y, 'down':y}
return dic
def geticode(dic):
l = []
for i in dic.keys():
if 9 < abs(dic[i]['right']-dic[i]['left']) < 61 and abs(dic[i]['up']-dic[i]['down']) < 11:
l.append(i)
tmp = 0 #验证码颜色
for i in l:
print (str(i) + '\t' + str(dic[i]))
if dic[i]['count'] > tmp:
tmp = i
print (str(tmp) + '\t' + str(dic[tmp]))
return tmp
def clean(im, xx, yy, icode):
pix = im.load()
for x in range(xx):
for y in range(yy):
if pix[x,y] != icode:
im.putpixel((x,y), 255)
return im
def main(file):
im = Image.open(file)
im = im.convert('L')
xx, yy = im.size
icode = geticode(scan(im, xx, yy))
im = clean(im, xx, yy, icode)
im.show()
test = image_to_string(im)
print (test)
if __name__ == "__main__":
file = "/home/cjt/PycharmProjects/text/1.gif"
main(file)
上面的代码具体细节就不做讲解了,对图像识别来说,这段代码有点冗长,对web渗透识别验证码,上述代码并不是效率最高的。所以大家能看懂就可以拓展一下自己试试,看不懂也无所谓,不重要。
并且上述代码涉及到tesseract-ocr的安装,如果感兴趣可以学一下,这个是一个图像识别的入门级组件,它不仅可以识别图像,还可以识别文字,要想识别的中文需要添加中文字库,需要在ubuntu 系统中找到 tessdata 文件夹把中文字库放进去;也可以在线安装中文字库:
sudo apt-get install tesseract-ocr-chi-sim