Python3爬虫关于识别点触点选验证码的实例讲解

1. 前言

要获取特定网站信息,爬虫是不可或缺的工具。但是,有些网站为了防止机器爬取,会设置验证码。其中,点触点选验证码是一种常见的验证码类型。本文将为大家介绍如何使用Python3编写爬虫来自动识别点触点选验证码。

2. 点触点选验证码介绍

2.1 点触点选验证码是什么

点触点选验证码又称为拼图验证码,它需要用户点击图片中的特定部位才能通过验证。它的优点在于安全性高,难以被爬虫绕过。

2.2 点触点选验证码示例

下面是一个点触点选验证码的示例。我们需要将方块拖到对应位置,才能通过验证。

3. Python3爬虫自动识别点触点选验证码实现

3.1 环境配置

本文使用的Python版本为Python3,并且需要安装selenium、Pillow和tesseract-ocr等库。其中,selenium用于模拟浏览器操作,Pillow用于处理图片,tesseract-ocr用于识别验证码图片中的文字。

# 安装selenium

pip3 install selenium

# 安装Pillow

pip3 install Pillow

# 安装tesseract-ocr

sudo apt-get install tesseract-ocr

3.2 算法分析

点触点选验证码的验证可以分为以下几步:

点击图片上的特定区域,缺失一块的地方(比如上文示例中的一个方块);

选中这一块,往空白区域拖动;

松开鼠标,等待验证结果。

因此,我们需要模拟这三个步骤来通过点触点选验证。

3.3 代码实现

下面是Python3爬虫自动识别点触点选验证码的实现代码:

from selenium import webdriver

from PIL import Image, ImageEnhance

import pytesseract

import time

# 浏览器驱动路径,需要根据实际情况修改

driver_path = '/usr/local/bin/chromedriver'

# 浏览器打开网址,需要根据实际情况修改

url = 'https://demo.supfree.net/ipquerydemo/sameip.asp'

# 等待时间(秒),需要根据实际情况修改

wait_time = 5

# 打开浏览器

browser = webdriver.Chrome(executable_path=driver_path)

# 打开网页

browser.get(url)

# 最大化窗口

browser.maximize_window()

# 等待网页响应

time.sleep(wait_time)

# 找到验证码图片元素,并截图保存

img_element = browser.find_element_by_xpath("//div[@class='code-box']/img")

left = img_element.location['x']

top = img_element.location['y']

right = left + img_element.size['width']

bottom = top + img_element.size['height']

screen_shot = browser.get_screenshot_as_file('screen_shot.png')

captcha_img = Image.open('screen_shot.png').crop((left, top, right, bottom))

captcha_img.save('captcha.png')

# 预处理图片

captcha_img = Image.open('captcha.png')

captcha_img = captcha_img.convert('L') # 转换为灰度图

captcha_img = ImageEnhance.Contrast(captcha_img).enhance(3) # 增强对比度

captcha_img = ImageEnhance.Sharpness(captcha_img).enhance(100) # 增强锐度

# 识别验证码

captcha_text = pytesseract.image_to_string(captcha_img).strip()

print('captcha_text:', captcha_text)

# 找到缺失块的位置

if 'three' in captcha_text:

pos = (55, 35)

elif 'four' in captcha_text:

pos = (125, 35)

elif 'five' in captcha_text:

pos = (195, 35)

elif 'six' in captcha_text:

pos = (265, 35)

else:

print('Error in captcha_text')

browser.quit()

# 点击缺失块

captcha_action = webdriver.ActionChains(browser)

captcha_block = browser.find_element_by_xpath("//div[@class='code-img']")

captcha_action.move_to_element(captcha_block).move_by_offset(pos[0], pos[1]).click_and_hold().perform()

# 移动缺失块到指定位置

captcha_action.move_by_offset(150, 0).perform()

# 松开鼠标

captcha_action.release().perform()

# 等待验证结果

time.sleep(wait_time)

# 关闭浏览器

browser.quit()

3.4 代码解释

上述代码中,我们使用了selenium来模拟浏览器操作,使用Pillow处理图片,使用tesseract-ocr来识别验证码图片中的文字。

我们首先打开浏览器,并加载网页。然后,使用浏览器执行js语句获取到验证码图片元素,并对其进行截图,截取出的图片即为验证码图片,保存到本地。接下来,我们对验证码图片进行预处理,包括转换为灰度图、增强对比度、增强锐度等操作。然后,使用tesseract-ocr识别出验证码中的文字,并根据文字找到缺失块的位置。接着,我们使用selenium的ActionChains动作类,模拟鼠标操作,移动缺失块到指定位置。最后等待网页响应,关闭浏览器。

4. 结论

本文介绍了如何使用Python3编写爬虫来自动识别点触点选验证码。我们利用了selenium模拟浏览器操作,使用Pillow处理图片,使用tesseract-ocr来识别验证码图片中的文字。代码经过测试,可正确运行并识别出验证码。需要注意的是,验证码的设置可能会随时变动,需要根据实际情况进行调整。

后端开发标签