驗證碼的是反爬蟲策略之一慰丛,要如何解決驗證碼問題擎析?
簡單的驗證碼可以通過二值化的辦法
我們以?http://my.cnki.net/elibregister/commonRegister.aspx 為例
首先需要配置環(huán)境览妖,pip install pillow轧拄,pip install?pytesseract
安裝Tesseract-OCR? ? 地址:https://digi.bib.uni-mannheim.de/tesseract/ 在這里找到對應(yīng)版本安裝,將安裝好的Tesseract-OCR配置到環(huán)境變量中去讽膏,路徑也許會是?C:\Program Files (x86)\Tesseract-OCR\tessdata
準(zhǔn)備好了之后就可以開始解析驗證碼了
首先用selenium打開網(wǎng)頁檩电,并進行一個快照保存當(dāng)前頁面的png
browser = webdriver.Chrome()
url ='http://my.cnki.net/elibregister/commonRegister.aspx'
browser.get(url)
browser.save_screenshot('./images/zhiwang.png')
找到圖片驗證碼,并獲取他的四個點的坐標(biāo)府树,將驗證碼截取保存
img = browser.find_element_by_id('checkcode')
left? = img.location['x']#驗證碼圖片左上角橫坐標(biāo)
top? ? = img.location['y']#驗證碼圖片左上角縱坐標(biāo)
right? = left + img.size['width']#驗證碼圖片右下角橫坐標(biāo)
bottom = top + img.size['height']#驗證碼圖片右下角縱坐標(biāo)
im=Image.open('./images/zhiwang.png')
im_crop=im.crop((left,top,right,bottom))#這個im_crop就是從整個頁面截圖中再截出來的驗證碼的圖片
im_crop.save('./images/zrecaptchar.png')
打開驗證碼的圖片并進行灰度處理
img =Image.open('./images/zrecaptchar.png')
img.show()
#可以看出俐末,驗證碼文本一般都是黑色的,背景則會更加明亮奄侠,所以我們可以通過檢查像素是否為黑色將文本分離出來卓箫,該處理過程又被稱為閾值化。通過 Pillow 可以很容易地實現(xiàn)該處理過程垄潮。
gray = img.convert('L')#灰度化烹卒,圖片轉(zhuǎn)化成灰度圖
gray.show()
最后將圖片處理成黑白色,即二值化
#二值化,指定而二值化的閾值魂挂,默認(rèn)閾值127
threshold =135
table = []
for i in range(256):
????if i < threshold:
????????table.append(0)
????else:
????????table.append(1)
bw = gray.point(table,'1')
bw.show()
最后圖片識別
strcode = pytesseract.image_to_string(bw)
將處理好的驗證碼填入驗證碼輸入框中即可甫题,不過這種方式的處理出錯率較高,驗證的時候一定要記得多試幾次
最后附上完整代碼
from selenium import webdriver
import pytesseract
from PIL import Image
#Chrome瀏覽器
browser = webdriver.Chrome()
url ='http://my.cnki.net/elibregister/commonRegister.aspx'
browser.get(url)
checkCode = browser.find_element_by_id('txtOldCheckCode')#驗證碼輸入框
btnReg = browser.find_element_by_id('ButtonRegister')#登陸按鍵
#快照
browser.save_screenshot('./images/zhiwang.png')
#驗證碼圖片
img = browser.find_element_by_id('checkcode')
left? = img.location['x']#驗證碼圖片左上角橫坐標(biāo)
top? ? = img.location['y']#驗證碼圖片左上角縱坐標(biāo)
right? = left + img.size['width']#驗證碼圖片右下角橫坐標(biāo)
bottom = top + img.size['height']#驗證碼圖片右下角縱坐標(biāo)
im=Image.open('./images/zhiwang.png')
im_crop=im.crop((left,top,right,bottom))#這個im_crop就是從整個頁面截圖中再截出來的驗證碼的圖片
im_crop.save('./images/zrecaptchar.png')
img =Image.open('./images/zrecaptchar.png')
img.show()
#可以看出涂召,驗證碼文本一般都是黑色的坠非,背景則會更加明亮,所以我們可以通過檢查像素是否為黑色將文本分離出來果正,該處理過程又被稱為閾值化炎码。通過 Pillow 可以很容易地實現(xiàn)該處理過程。
gray = img.convert('L')#灰度化秋泳,圖片轉(zhuǎn)化成灰度圖
gray.show()
#二值化,指定而二值化的閾值潦闲,默認(rèn)閾值127
threshold =135
table = []
for i in range(256):
????if i < threshold:
????????table.append(0)
????else:
????????table.append(1)
bw = gray.point(table,'1')
bw.show()
strcode = pytesseract.image_to_string(bw)
checkCode.send_keys(strcode)
#模擬點擊按鈕
btnReg.click()
圓滿結(jié)束,如果成功率不高的話迫皱,可以適當(dāng)調(diào)整二值化閾值歉闰,不過總體成功率有待改善。