溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼

發(fā)布時(shí)間:2021-11-23 17:33:16 來(lái)源:億速云 閱讀:337 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼”吧!

生活中,我們?cè)诘卿浳⒉?,郵箱的時(shí)候,常常會(huì)碰到驗(yàn)證碼。在工作時(shí),如果想要爬取一些數(shù)據(jù),也會(huì)碰到驗(yàn)證碼的阻礙。本次試驗(yàn)將帶領(lǐng)大家認(rèn)識(shí)驗(yàn)證碼的一些特性,并利用 Python 中的 pillow 庫(kù)完成對(duì)驗(yàn)證碼的破解。

環(huán)境配置

  • Python 2.7

  • Pillow 模塊

有個(gè)問(wèn)題就是python2.7目前只能讓使用到2020年,現(xiàn)在再利用2.7下載好多東西都會(huì)報(bào)錯(cuò),也該是時(shí)候更新到python3.7了,本文還是依賴于2.7的環(huán)境。

python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼

識(shí)別驗(yàn)證碼的代碼下載地址:python_captcha_jb51.rar

 安裝 pillow(PIL)庫(kù)

sudo apt-get update
sudo apt-get install python-dev libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
sudo pip2 install pillow

識(shí)別過(guò)程

將驗(yàn)證碼文件python_captcha下載到運(yùn)行目錄下,解壓后,在 python_captcha 目錄新建 crack.py 文件,進(jìn)行編輯。

#-*- coding:utf8 -*-
from PIL import Image

im = Image.open("captcha.gif")
#(將圖片轉(zhuǎn)換為8位像素模式)
im.convert("P")

# 打印顏色直方圖
print im.histogram()

輸出:

python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼

顏色直方圖的每一位數(shù)字都代表了在圖片中含有對(duì)應(yīng)位的顏色的像素的數(shù)量。

每個(gè)像素點(diǎn)可表現(xiàn) 256 種顏色,你會(huì)發(fā)現(xiàn)白點(diǎn)是最多(白色序號(hào) 255 的位置,也就是最后一位,可以看到,有 625 個(gè)白色像素)。紅像素在序號(hào) 200 左右,我們可以通過(guò)排序,得到有用的顏色。

his = im.histogram()
values = {}

for i in range(256):
    values[i] = his[i]

for j,k in sorted(values.items(),key=lambda x:x[1],reverse = True)[:10]:
    print j, k

輸出:

python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼

我們得到了圖片中最多的 10 種顏色,其中 220 與 227 才是我們需要的紅色和灰色,可以通過(guò)這一訊息構(gòu)造一種黑白二值圖片。

#-*- coding:utf8 -*-
from PIL import Image

im = Image.open("captcha.gif")
im.convert("P")
im2 = Image.new("P",im.size,255)


for x in range(im.size[1]):
    for y in range(im.size[0]):
        pix = im.getpixel((y,x))
        if pix == 220 or pix == 227: # these are the numbers to get
            im2.putpixel((y,x),0)

im2.show()

輸出:

python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼

局限及遇到的問(wèn)題

#-*- coding:utf8 -*-

此行命令流在windows環(huán)境下運(yùn)行會(huì)報(bào)錯(cuò),具體原因可參考python(2)中文編碼亂碼問(wèn)題;

該命令流有很大的局限性,識(shí)別的動(dòng)態(tài)代買也只有此類:

python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼

感謝各位的閱讀,以上就是“python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)python怎么通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI