目录
一、思路
使用selenium先get到页面,截取登陆界面(包括验证码)。代码处理+ocr识别,自从输出验证码,再使用selenium定位到登陆元素,点击登陆即可。
二、代码
from selenium import webdriver
import cv2
from paddleocr import PaddleOCR
import re
from PIL import Image
import requests
import sys
import scipy
if __name__ == '__main__':
driver = webdriver.Chrome()
driver.implicitly_wait(3) # 设置隐士等待
driver.get('url') # 要爬取的url
# 屏幕截图----进入到验证码界面再截图
driver.save_screenshot('code.png')
# 找到验证码 验证码页面元素标签
photo = driver.find_element_by_tag_name('img')
x = photo.location['x']
y = photo.location['y']
width = photo.size['width']
height = photo.size['height']
# 保存验证码
im = Image.open('code.png')
im = im.crop((x, y, x + width, y + height))
im.save('new_code.png')
raw = cv2.imread('new_code.png',0)
# 二值化图片
binary = cv2.adaptiveThreshold(~raw, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
cv2.imshow('binary_picture', binary)
if cv2.waitKey(0):
cv2.destroyWindow('binary_picture')
# 调用paddleOCR识别
ocr = PaddleOCR(use_angle_cls=True ,use_gpu=False)
img_info = ocr.ocr(binary, cls=False)
print(img_info)
# 最终结果
img_result = ""
for line in img_info:
# 得到图片中文字 循环加总,(多行的情况)
img_result += line[-1][0]
img_result += ' '
# 去除特殊字符
text1 = re.findall(r'[^\*"/:?\\|<>″′‖ 〈\n]', img_result, re.S)
text1 = "".join(text1)
print('验证码图片信息:' + text1)
三、注意事项
除上述之外还需做一个其他事情,就是假设验证码里包含x等形似数学运算符的,需要做一个判断来保持识别的准确率。
列如:
# 注意这里的×为乘号
if '×' in text:
text.replace('×','X')