python爬蟲20 | 小帥b教你如何使用python識別圖片驗證碼


 

當你在爬取某些網站的時候

 

對於你的一些頻繁請求

 

對方會阻礙你

 

常見的方式就是使用驗證碼

 

驗證碼的主要功能

 

就是區分你是人還是鬼(機器人)

 

 

想法設法的搞一些手段來對付技術

 

 

技術又能對付人們的想法

 

一來一去

 

就有了各種各樣的變態驗證碼

 

也有了各種各樣的應對方式

 

常見的驗證碼有這么幾種

 

 

圖像驗證

語音驗證

短信驗證

極驗驗證

點擊驗證

 

今天

 

小帥b想跟你先說說如何識別圖像驗證碼

 

 

那么

 

接下來就是

 

學習 python 的正確姿勢

 

 

 

我們來看看這些圖片驗證碼

 

(此圖來源網絡)

 

可以發現

 

這些驗證碼大多是數字和字母組成

 

然后在此之上再添加一些像毛一樣的線

 

或者搞一些噪點

 

或者把這些字符扭曲一下

 

為了增加識別難度也是辛苦人家了

 

接下來我們思考一下

 

我們要識別這類驗證碼要怎么做呢

 

 

首先要處理一下驗證碼圖片

 

什么噪點亂七八糟的

 

我們盡量把它們去掉

 

讓圖片

 

盡量黑白

 

盡量只剩下字符本身

 

然后再用 python 強大的 OCR 工具

 

Python-tesseract

 

 來識別我們優化好的圖片

 

這樣正確率就會大大的提高

 

 

哎呀

 

我真是個聰明 boy 啊

 

 

為了讓你更清楚的知道怎么識別圖像驗證碼

 

小帥b用 python 搞了幾張識別難度不同的驗證碼

 

 

第一張

 

 

難度系數: 

 

 

第二張

 

 

難度系數: 

 

 

第三張

 

 

難度系數: 

 

 

第四張

 

 

難度系數: 

 

 

第五張

 

 

難度系數 : 

 

 

先對第一張進行識別

 

這張看起來沒什么 "污染"

 

所以相對簡單

 

先安裝一下  pytesseract 

    

pip install pytesseract

 

接着安裝一下  tesseract-ocr

 

如果你是 ubuntu 系統可以直接使用如下命令安裝

 

sudo apt install tesseract-ocr

 

如果你是 win 系統自行 Google 一下安裝  tesseract-ocr 以及環境變量配置

 

完了之后就導入相關模塊到我們的代碼文件中

 

try: from PIL import Imageexcept ImportError: import Imageimport pytesseract

 

接着我們就打開第一張圖片

 

使用 pytesseract 識別

 

打印一下

 

captcha = Image.open("captcha1.png")result = pytesseract.image_to_string(captcha)print(result)

 

打印結果

 

 

ok,么有問題

 

 

接着我們來識別第 2 張

 

 

captcha = Image.open("claptcha2.png")result = pytesseract.image_to_string(captcha)print(result)

 

結果打印出來是

 

 

1924??

 

這就說明

 

pytesseract 是沒辦法識別太多噪點的圖片的

 

如果這個圖片再加上一點彩色背景

 

 

那么對 pytesseract 來說更是有點吃力的

 

所以我們先對這張圖片灰度處理一下

 

 

captcha = Image.open("captcha2.png")result = captcha.convert('L')result.show()

 

圖片就變成灰了

 

 

雖然灰了

 

但是還不夠

 

我們除了處理灰度還需要對其 二值化

 

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

 

調用一下

 

convert_img(captcha,150)

 

這時候圖片就變成這樣了

 

 

是不是一下子就清晰很多了呢

 

這時候我們對這張圖片識別一下

 

# 識別一下result = pytesseract.image_to_string(result)print(result)

 

成功識別

 

 

 

接下來我們再來看看有毛有噪的圖片

 

 

這時候直接去識別是識別不出來的

 

所以還是老辦法

 

先處理灰度

 

再 二值化

 

這次我們再降一下噪

 

data = img.getdata() w,h = img.size count = 0 for x in range(1,h-1): for y in range(1, h - 1): # 找出各個像素方向 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)

 

圖片變成這樣了

 

 

再識別一下

 

 

 

 

 

不過

 

pytesseract 不是萬能的

 

對於稍微復雜一點的就識別不出來了

 

至於這張

 

 

你能看出它是 1l1l0oO0 么?

 

如果你能

 

算你牛逼

 

 

反正小帥b不能

 

所以 pytesseract 也不能

 

對於一些簡單的驗證碼

 

使用 pytesseract 還是可以的

 

如果你想提高 pytesseract 識別率

 

還可以去搞些圖片去訓練一下 tesseract-ocr

 

 

ok

 

以上

 

主要讓你了解一下圖片識別庫的使用

 

以及對一些圖片的常用降噪操作

 

那么下次你爬到一些需要圖像的簡單驗證碼

 

應該不在話下了

 

 

下回見

 

聽說你要 我啊!?

 

peace

 

 

 

      點個在看啊~~(破音)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM