Python爬虫 PIL库实践——识别验证码

Python爬虫(十七)

学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。

—— PIL库实践 识别验证码 ——

我们用下面两张图来作为主要例子:
PIL库实践——识别验证码
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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值