知網注冊(傳統(tǒng)圖片驗證碼識別)
灰度化
二值化
tesseract提取圖片文字
代碼如下:
from selenium import webdriver
import pytesseract
from PIL import Image
import time
browser = webdriver.Chrome(r"D:\chromedriver.exe") #browser瀏覽器
url = 'http://my.cnki.net/elibregister/commonRegister.aspx'
browser.get(url)
html = browser.page_source
print(html)
user = browser.find_element_by_id('username')
pwd = browser.find_element_by_id('txtPassword')
email = browser.find_element_by_id('txtEmail')
checkCode = browser.find_element_by_id('txtOldCheckCode')
btnReg = browser.find_element_by_id('ButtonRegister')
user.send_keys('zzqk08_3@163.com')
time.sleep(2)
pwd.send_keys('mimamima')
time.sleep(2)
email.send_keys('guojiantao@163.com')
time.sleep(2)
browser.save_screenshot('./images/zhiwang.png')#快照
img = browser.find_element_by_id('checkcode')
left = img.location['x']#驗證碼圖片左上角橫坐標
top = img.location['y']#驗證碼圖片左上角縱坐標
right = left + img.size['width']#驗證碼圖片右下角橫坐標
bottom = top + img.size['height']#驗證碼圖片右下角縱坐標
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 可以很容易地實現該處理過程。
gray = img.convert('L') #灰度化,圖片轉化成灰度圖
# gray.show() #顯示灰度化后圖片
#二值化,指定而二值化的閾值,默認閾值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() #顯示二值化后圖片
#bw = gray.point(lambda x: 0 if x < 1 else 255,'1')
strcode = pytesseract.image_to_string(bw)
print(strcode)
checkCode.send_keys(strcode)
#模擬點擊按鈕
btnReg.click()