使用selenium进行数据爬取时,遇到了登录验证码,如下所示:
这里使用ddddocr将验证码图片中的文字识别;对于ddddocr的介绍可查看官网地址:GitHub - sml2h3/ddddocr: 带带弟弟 通用验证码识别OCR pypi版
这里介绍下思路:
1、将登录页保存为图片;
2、查找到验证码图片元素,获取到元素的location和size信息,基于上一步的图片裁剪出验证码图片;
3、调用ddddocr进行识别;
其中,第1步和第2步,按理说页可以通过find_element方法查找到验证码图片,再获取src属性并保存的方式处理。
废话不多说,直接上代码:
# pip install ddddocr
import ddddocr
# pip install pillow
from PIL import Image
def login(browser):
login_url = "https://***"
browser.get(login_url)
time.sleep(2)
browser.save_screenshot("currentpage1.png")
# '//*[@id="randimg"]' 为验证码图片的xpath定位
yzm = htmlimg2txt(browser, '//*[@id="randimg"]')
def img2txt(image_path):
ocr = ddddocr.DdddOcr()
image = open(image_path, "rb").read()
result = ocr.classification(image)
return result
def htmlimg2txt(browser, image_path):
## 1、将当前登录页保存为图片
browser.save_screenshot("shot.png")
element = browser.find_element("xpath", image_path)
# 获取设备像素比(DPR)(此处如果不处理dpr,换一台电脑裁剪的验证码图片可能就不准确了)
dpr = browser.execute_script("return window.devicePixelRatio")
location = element.location
size = element.size
x = location['x'] * dpr
y = location['y'] * dpr
w = size['width'] * dpr
h = size['height'] * dpr
width = x + w
height = y + h
im = Image.open('shot.png')
## 2、裁剪并保存验证码图片
im = im.crop((int(x), int(y), int(width), int(height)))
im.save('image.png')
return img2txt('image.png')