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来识别验证码图片中的文字。代码经过测试,可正确运行并识别出验证码。需要注意的是,验证码的设置可能会随时变动,需要根据实际情况进行调整。