python selenium 验证码识别_Python网络爬虫之如何用代码识别图片验证码
驗(yàn)證碼
當(dāng)我們?cè)谂廊∧承┚W(wǎng)站的時(shí)候,對(duì)于一些頻繁請(qǐng)求,網(wǎng)站會(huì)識(shí)別你是機(jī)器還是人。如果是機(jī)器,直接不允許你訪問這個(gè)網(wǎng)站了,直接返回404或者禁止訪問。
最常見的方式就是驗(yàn)證碼。驗(yàn)證碼的主要功能就是區(qū)分當(dāng)前訪問網(wǎng)站的是人還是代碼。越難識(shí)別或者越模糊的驗(yàn)證碼區(qū)分能力卻強(qiáng)。網(wǎng)站想方設(shè)法的搞一些手段來對(duì)付技術(shù),就是想讓服務(wù)器不用承受代碼大量訪問的壓力,這樣就能夠?yàn)檎S脩籼峁┝鲿车姆?wù)了。
但是,技術(shù)又能對(duì)付人們的想法。一來一去,就有了各種各樣的變態(tài)驗(yàn)證碼,也有了各種各樣的應(yīng)對(duì)方式。
常見的驗(yàn)證碼有這么幾種:
- 圖像驗(yàn)證
- 語音驗(yàn)證
- 短信驗(yàn)證
- 極驗(yàn)驗(yàn)證
- 點(diǎn)擊驗(yàn)證
如何識(shí)別圖像驗(yàn)證碼
來看看這些圖片驗(yàn)證碼:
這些驗(yàn)證碼大多是數(shù)字和字母組成,然后在此之上再添加一些模糊的噪點(diǎn)或者橫線豎線,或者把這些字符扭曲一下,增加識(shí)別難度。
接下來我們思考一下,我們要識(shí)別這類驗(yàn)證碼要怎么做呢?
首先要處理一下驗(yàn)證碼圖片,什么亂七八糟的噪點(diǎn)都盡量把它們?nèi)サ?#xff0c;讓圖片盡量黑白,盡量只剩下字符本身,然后再用 python 強(qiáng)大的 OCR 工具:
Python-tesseract來識(shí)別我們優(yōu)化好的圖片,這樣正確率就會(huì)大大的提高。
我們用 python 搞幾張識(shí)別難度不同的驗(yàn)證碼:
第一張
難度系數(shù): ★,一顆星
第二張
難度系數(shù): ★★,兩顆星
第三張
難度系數(shù): ★★★,三顆星
第四張
難度系數(shù): ★★★★,四顆星
第五張
難度系數(shù) : ★★★★★,五顆星
先對(duì)第一張進(jìn)行識(shí)別。第一張看起來比較清晰,識(shí)別起來沒有難度。
先安裝一下 pytesseract :
pip?install?pytesseract接著安裝一下 tesseract-ocr:
如果是 ubuntu 系統(tǒng)可以直接使用如下命令安裝:
sudo?apt?install?tesseract-ocr如果是 win 系統(tǒng)自行百度一下安裝 tesseract-ocr 以及環(huán)境變量配置。
完了之后就導(dǎo)入相關(guān)模塊到代碼文件中:
try: from PIL import Imageexcept ImportError: import Imageimport pytesseract接著打開第一張圖片,使用 pytesseract 識(shí)別,打印出結(jié)果:
captcha = Image.open("captcha1.png")result = pytesseract.image_to_string(captcha)print(result)結(jié)果:
識(shí)別成功!
接著來識(shí)別第 2 張:
captcha = Image.open("claptcha2.png")result = pytesseract.image_to_string(captcha)print(result)結(jié)果是
1924,結(jié)果有誤!pytesseract 準(zhǔn)確率沒那么高,沒辦法識(shí)別太多噪點(diǎn)的圖片。如果這個(gè)圖片再加上一點(diǎn)彩色背景如下圖:
對(duì) pytesseract 來說更有難度。
所以我們先對(duì)這張圖片灰度處理一下:
captcha = Image.open("captcha2.png")result = captcha.convert('L')result.show()圖片就變成灰了:
雖然灰了,但是還不夠。除了處理灰度還需要對(duì)其進(jìn)行“二值化”:
def convert_img(img,threshold): img = img.convert("L") # 處理灰度 pixels = img.load() for x in range(img.width): for y in range(img.height): if pixels[x, y] > threshold: pixels[x, y] = 255 else: pixels[x, y] = 0 return img調(diào)用一下:
convert_img(captcha,150)圖片就變成了:
非常清晰!
這時(shí)候?qū)@張圖片識(shí)別一下:
# 識(shí)別一下result = pytesseract.image_to_string(result)print(result)成功識(shí)別!
接下來再來看看有毛有噪的圖片:
這時(shí)候直接去識(shí)別是識(shí)別不出來的。所以還是老辦法,先處理灰度,再進(jìn)行“二值化”。這次再降一下噪:
data = img.getdata() w,h = img.size count = 0 for x in range(1,h-1): for y in range(1, h - 1): # 找出各個(gè)像素方向 mid_pixel = data[w * y + x] if mid_pixel == 0: top_pixel = data[w * (y - 1) + x] left_pixel = data[w * y + (x - 1)] down_pixel = data[w * (y + 1) + x] right_pixel = data[w * y + (x + 1)] if top_pixel == 0: count += 1 if left_pixel == 0: count += 1 if down_pixel == 0: count += 1 if right_pixel == 0: count += 1 if count > 4: img.putpixel((x, y), 0)圖片變成這樣了:
再識(shí)別一下:
不過,pytesseract 不是萬能的,對(duì)于稍微復(fù)雜一點(diǎn)的就識(shí)別不出來了。至于這張:
我們?nèi)庋鄱己茈y看出它是 1l1l0oO0,更不要說用代碼去識(shí)別了,所以 pytesseract 也識(shí)別不了。
對(duì)于一些簡(jiǎn)單的驗(yàn)證碼,使用 pytesseract 還是可以的。如果我們想提高 pytesseract 識(shí)別率,還可以去搞些圖片去訓(xùn)練一下 tesseract-ocr。這樣,當(dāng)我們遇到一些登錄需要驗(yàn)證碼的網(wǎng)站時(shí),直接引入本文識(shí)別驗(yàn)證碼的方法就可以繼續(xù)爬數(shù)據(jù)了。
總結(jié)
以上是生活随笔為你收集整理的python selenium 验证码识别_Python网络爬虫之如何用代码识别图片验证码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 普中stm32开发板tftlcd显示图片
- 下一篇: python备份发包脚本_Python备