當你在爬取某些網站的時候
對於你的一些頻繁請求
對方會阻礙你
常見的方式就是使用驗證碼
驗證碼的主要功能
就是區分你是人還是鬼(機器人)
人
想法設法的搞一些手段來對付技術
而
技術又能對付人們的想法
一來一去
就有了各種各樣的變態驗證碼
也有了各種各樣的應對方式
常見的驗證碼有這么幾種
圖像驗證
語音驗證
短信驗證
極驗驗證
點擊驗證
今天
小帥b想跟你先說說如何識別圖像驗證碼
那么
接下來就是
我們來看看這些圖片驗證碼
(此圖來源網絡)
可以發現
這些驗證碼大多是數字和字母組成
然后在此之上再添加一些像毛一樣的線
或者搞一些噪點
或者把這些字符扭曲一下
為了增加識別難度也是辛苦人家了
接下來我們思考一下
我們要識別這類驗證碼要怎么做呢
首先要處理一下驗證碼圖片
什么噪點亂七八糟的
我們盡量把它們去掉
讓圖片
盡量黑白
盡量只剩下字符本身
然后再用 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 Image
except ImportError:
import Image
import 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()
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:
y), 0)
圖片變成這樣了
再識別一下
不過
pytesseract 不是萬能的
對於稍微復雜一點的就識別不出來了
至於這張
你能看出它是 1l1l0oO0 么?
如果你能
算你牛逼
反正小帥b不能
所以 pytesseract 也不能
對於一些簡單的驗證碼
使用 pytesseract 還是可以的
如果你想提高 pytesseract 識別率
還可以去搞些圖片去訓練一下 tesseract-ocr
ok
以上
主要讓你了解一下圖片識別庫的使用
以及對一些圖片的常用降噪操作
那么下次你爬到一些需要圖像的簡單驗證碼
應該不在話下了
完
下回見
聽說你要 約 我啊!?
peace
點個在看啊~~(破音)