用python寫一爬蟲,需要模擬登陸,並且有數字驗證碼。通過selenium+pytesseract+PIL可以實現驗證碼識別並登陸。三大步:
- 用selenium截屏,此時截取的是整個頁面的
- 用PIL庫中的Image庫,從剛才頁面截屏中,通過crop()方法截取 出來驗證碼圖片,然后進行灰度和二值化處理
- 用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)