selenium來識別數字驗證碼


用python寫一爬蟲,需要模擬登陸,並且有數字驗證碼。通過selenium+pytesseract+PIL可以實現驗證碼識別並登陸。三大步:

  1. 用selenium截屏,此時截取的是整個頁面的
  2. 用PIL庫中的Image庫,從剛才頁面截屏中,通過crop()方法截取 出來驗證碼圖片,然后進行灰度和二值化處理
  3. 用pytesseract庫中的image_to_srting()方法,將圖片轉化為字符串。切割之后,轉為數字。

具體實現的代碼如下,需要先安裝一下相應的庫哦。

# coding=utf-8
from selenium import webdriver
import time
from selenium.webdriver.firefox.options import Options as FOptions
import datetime
import pymysql
import json
import numpy as np
from PIL import Image, ImageEnhance
import pytesseract

options = FOptions()
obj = webdriver.Firefox(executable_path="geckodriver.exe", firefox_options=options)
obj.get('https://qcar.apiins.com/qcar/reLogin.do')
time.sleep(1)
obj.switch_to.alert.accept()
obj.find_element_by_name('usercode').send_keys('***********')
obj.find_element_by_name('passwd').send_keys('********')
"""
用selenium截圖,先截整個頁面,然后定位驗證碼圖片,截取出來驗證碼圖片
"""
obj.save_screenshot('hebao_login.png')
codeEelement = obj.find_element_by_id('VerifCode')
print('驗證碼圖片',codeEelement,type(codeEelement))
imgSize = codeEelement.size  # 獲取驗證碼圖片的大小
print('圖片大小',imgSize,type(imgSize))
imgLocation = codeEelement.location  # 獲取驗證碼元素坐標
print('圖片位置',imgLocation,type(imgLocation))
rangle = (int(imgLocation['x']), int(imgLocation['y']), int(imgLocation['x'] + imgSize['width']),int(imgLocation['y'] + imgSize['height']))  # 計算驗證碼整體坐標
print(rangle)
login = Image.open('hebao_login.png').convert('RGB')
"""
截取下來驗證碼圖片,並且進行灰度轉化,二值化處理
"""
loginImg = login.crop(rangle)  # 截取驗證碼圖片
loginImg.show()
loginImg = loginImg.convert("L")#convert()方法傳入參數L,將圖片轉化為灰度圖像
loginImg.show()
loginImg = np.asarray(loginImg)
loginImg = (loginImg > 100) * 255
loginImg = Image.fromarray(loginImg).convert('RGB')
sharpness = ImageEnhance.Contrast(loginImg)
loginImg = sharpness.enhance(3.0)
loginImg = loginImg.resize((300, 100))
loginImg.show()
"""
將圖片轉化為文本字符串,切割之后,轉化為數字進行計算
"""
text = pytesseract.image_to_string(loginImg, lang='ytbx').strip().replace(' ', '')
print(text)
num = int(text.split('+?=')[1]) - int(text.split('+?=')[0])
print(num)
obj.find_element_by_name('checkCode').send_keys(str(num))
obj.find_element_by_xpath('/html/body/form/div[2]/div/ul/li[5]/input').click()
time.sleep(1)

  


免責聲明!

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



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