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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章