字符型驗(yàn)證碼反爬蟲的原理和破解方法(附有字符驗(yàn)證碼制作代碼~)
回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
大家好,我是志斌~
我們寫的爬蟲它實(shí)際是一種讓計(jì)算機(jī)自動(dòng)運(yùn)行的程序,它并不具備主觀的意識(shí),無法根據(jù)網(wǎng)站驗(yàn)證碼的要求來執(zhí)行相關(guān)操作,從而被限制爬取。
所以,志斌今天來跟大家分享一下如何解決驗(yàn)證碼反爬蟲中的字符驗(yàn)證碼反爬蟲。
01
原理
字符驗(yàn)證碼的反爬蟲原理很簡單,它利用數(shù)字、字母、漢字和標(biāo)點(diǎn)符號(hào)等字符做成一張圖片,用人類和計(jì)算機(jī)對這張圖片視覺上的差異作為區(qū)分用戶身份的依據(jù)。
隨著當(dāng)前社會(huì)識(shí)別技術(shù)的發(fā)展,字符驗(yàn)證碼也也在不斷的改進(jìn),它通過添加干擾線、添加噪點(diǎn)以及增加字符的黏連程度和旋轉(zhuǎn)角度來增加機(jī)器識(shí)別的難度。
02
破解
志斌以下面這張驗(yàn)證碼為例給大家講一下如何用用圖像識(shí)別的方式破解字符驗(yàn)證碼。它

它有在線和離線兩種方式,我們下面來分別進(jìn)行介紹。
01
離線破解
我們離線破解驗(yàn)證碼主要是使用的PIL庫和Pytesseract庫,在使用Pytesseract庫時(shí),需要先安裝Tesseract-OCR。
驗(yàn)證碼識(shí)別一共分為這四步:
1. 灰度化
2. 二值化
3. 識(shí)別
首先使用PIL庫將彩色圖像轉(zhuǎn)化成灰色的圖像,代碼如下:
from PIL import Image
im= Image.open('5.jpg')
imgry = im.convert('L')
imgry.save('gray-'+'5.jpg')
灰度化圖像:

緊跟著二值化處理,讓字符顏色跟背景顏色反差更為明顯,代碼如下:
threshold = 200
Table = []
for j in range(256):
if j < threshold:
Table.append(0)
else:
Table.append(1)
out = imgry.point(Table,'1')
out.save('123'+'5.jpg')二值化圖像:

嘗試識(shí)別一下,代碼如下:
import pytesseract
pytesseract.image_to_string(out)

02
在線識(shí)別
其實(shí)字符驗(yàn)證碼就是一張圖片,我們可以借助百度AI來進(jìn)行在線識(shí)別,之前的這篇文章已經(jīng)介紹很詳細(xì),有興趣的讀者可以讀一下這篇文章20行代碼教你如何批量提取圖片中文字,這里就不過多介紹了,直接展示代碼:
from aip import AipOcr
APP_ID = '你的APP_ID'
API_KEY = '你的API_KEY'
SECRET_KEY = '你的SECRET_KEY'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
with open('5.jpg','rb') as f:
a = f.read()
client.basicGeneral(a)
03
制作驗(yàn)證碼
在來跟大家分享一下如何用Python制作一款字符驗(yàn)證碼,這樣可以使得我們更好的學(xué)習(xí)它,代碼如下:
from PIL import Image,ImageDraw,ImageFont
import random
def getRandomColor():
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
return (r,g,b)
def getRandomStr():
num_random = str(random.randint(1,9))
random_upper_alpha = chr(random.randint(65,90))
random_char = random.choice([num_random,random_upper_alpha])
return random_char
image = Image.new('RGB',(120,40),(255,255,255))
draw = ImageDraw.Draw(image)
font = ImageFont.truetype(r'K:\msyh.ttc',size=24)
for i in range(4):
draw.text((10+i*30,10),getRandomStr(),getRandomColor(),font=font)
width = 120
height = 40
for i in range(5):
x1 = random.randint(0,width)
x2 = random.randint(0,width)
y1 = random.randint(0,height)
y2 = random.randint(0,height)
draw.line((x1,x2,y1,y2),fill=getRandomColor())
for i in range(20):
draw.point([random.randint(0,width),random.randint(0,height)],fill=getRandomColor())
x = random.randint(0,width)
y = random.randint(0,height)
draw.arc((x,y,x+5,y+5),0,90,fill=getRandomColor())
image.save('5.jpg')
04
小結(jié)
1. 本文詳細(xì)介紹了字符驗(yàn)證碼反爬蟲的原理和破解方法,并教大家如何做一款自己的字符驗(yàn)證碼。
2. 字符型驗(yàn)證碼是一種比較常規(guī)的驗(yàn)證碼反爬蟲,破解方法較為簡單,喜歡爬蟲的讀者可以一定要學(xué)會(huì)喲~
3. 本文僅供學(xué)習(xí)參考,不做它用。
------------------- End -------------------
往期精彩文章推薦:

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請?jiān)诤笈_(tái)回復(fù)【入群】
萬水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
