Python3爬虫关于识别检验滑动验证码的实例

yizhihongxing

Python3爬虫关于识别检验滑动验证码的实例

在进行爬虫过程中,我们经常会遇到验证码的问题,其中包括识别检验滑动验证码,这在爬虫中非常常见。接下来,将详细讲解如何通过Python3实现识别检验滑动验证码。

什么是滑动验证码

滑动验证码是一种常见的验证码形式,通过滑动滚动条或者滑动图片的方式完成验证过程。在网站防止机器人爬取信息的时候常常会使用滑动验证码。

如何识别检验滑动验证码

首先,需要通过Selenium模拟浏览器行为,获取验证码图片并保存到本地。其次,通过图像处理库Pillow进行验证码图片的预处理,包括去除干扰线、二值化、降噪等操作。最后,通过图像识别库Tesseract进行验证码文字识别。

以下代码为爬取知网网站论文下载页面滑动验证码的实现示例:

import time
from io import BytesIO

from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()


def get_identifying_code(driver, element):
    """
    获取验证码图片并返回Image对象
    """
    # 获取背景图片
    bg_img_url = element.get_attribute('src')
    bg_img_data = driver.execute_script(
        "return fetch(\"%s\", {mode: 'no-cors'}).then((response) => response.blob());" % bg_img_url)
    bg_image = Image.open(BytesIO(bg_img_data.content))

    # 获取滑块图片
    slider = driver.find_element_by_css_selector('.gt_slider_knob')
    slider_img_url = driver.execute_script("return arguments[0].toDataURL(\"image/png\");", slider)
    slider_img_data = driver.execute_script(
        "return fetch(\"%s\", {mode: 'no-cors'}).then((response) => response.blob());" % slider_img_url)
    slider_image = Image.open(BytesIO(slider_img_data.content))

    return bg_image, slider_image


def get_diff_location(bg_image, slider_image):
    """
    获取滑块移动距离
    """
    threshold = 30
    bg_image = bg_image.convert('L')  # 转灰度图
    slider_image = slider_image.convert('L')  # 转灰度图

    left = 0
    for i in range(20, bg_image.size[0]):
        for j in range(bg_image.size[1]):
            pixel = bg_image.getpixel((i, j))
            if abs(pixel - slider_image.getpixel((j, 0))) > threshold:
                left = i
                break

    return left


def slide_to_gap(driver, slider, track):
    """
    拖动滑块到目标位置
    """
    ActionChains(driver).click_and_hold(slider).perform()
    for x in track:
        ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
    time.sleep(0.5)
    ActionChains(driver).release().perform()


def main():
    driver.get('https://kns.cnki.net/kns/brief/default_result.aspx')

    # 选择要爬取的网页元素,并获取滑块验证码Image对象
    element = driver.find_element_by_css_selector('.gt_cut_fullbg.gt_show')
    bg_image, slider_image = get_identifying_code(driver, element)

    # 获取滑块移动距离
    distance = get_diff_location(bg_image, slider_image)

    # 获取滑动轨迹
    track = get_tracks(distance)

    # 拖动滑块到目标位置
    slider = driver.find_element_by_css_selector('.gt_slider_knob')
    slide_to_gap(driver, slider, track)

    # 完成上面的操作后,即可进行其他爬取操作
    ...

在上述代码中,get_identifying_code()函数用于获取验证码图片,get_diff_location()函数用于计算滑块移动距离,slide_to_gap()函数用于拖动滑块到目标位置。

另外,需要注意的是在实现过程中需要对验证码图片进行预处理,以确保图像识别的准确度。

示例说明

下面以实现QQ音乐的滑动验证码识别为例进行说明。

首先需要进行登录流程,在打开QQ音乐登录页面后,输入账号密码,点击"登录"按钮:

driver.get("http://y.qq.com/")
driver.find_element_by_css_selector('a[data-stat="account.flash"] > i').click()

time.sleep(2)

driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').send_keys(qq_number)
driver.find_element_by_id('p').send_keys(qq_password)

driver.find_element_by_id('login_button').click()

time.sleep(2)

然后,在打开QQ音乐会员下载页面后,获取验证码图片并进行预处理和识别:

driver.get("https://y.qq.com/m/client/download.html")
time.sleep(2)

# 获取验证码图片
img_element = driver.find_element_by_css_selector('.captcha-img-wrap img')
captcha_image = get_image(img_element)
captcha_image.save('captcha.png')

# 预处理验证码图片
captcha_image = Image.open('captcha.png')
captcha_image = filter_noise(captcha_image)

# 识别验证码文字
captcha_text = recognize_text(captcha_image)

其中,get_image()函数用于获取验证码图片,filter_noise()函数用于对验证码图片进行预处理,识别验证码文字使用Tesseract实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3爬虫关于识别检验滑动验证码的实例 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • Spring Cloud Alibaba之Sentinel实现熔断限流功能

    针对Spring Cloud Alibaba之Sentinel实现熔断限流功能,我会提供以下完整攻略: 1. 简介 Sentinel是一个开源的应用程序防护组件,主要用于服务熔断、限流等功能。Spring Cloud Alibaba则是阿里巴巴基于Spring Cloud开发的微服务解决方案,支持集成Sentinel。 本攻略主要介绍如何在Spring Cl…

    人工智能概览 2023年5月25日
    00
  • 图片文字识别软件哪个好?六款好用的OCR文字识别软件推荐

    图片文字识别软件哪个好?六款好用的OCR文字识别软件推荐 什么是OCR文字识别软件 OCR文字识别软件指的是使用计算机技术将图像中的文字转化为可编辑、可搜索的文字的一种应用程序。OCR技术可以大大提高文字识别的效率和准确率,特别是对于批量转化图片中的文字非常实用。 六款OCR文字识别软件推荐 ABBYY FineReaderABBYY FineReader功…

    人工智能概览 2023年5月25日
    00
  • django formset实现数据表的批量操作的示例代码

    我来详细讲解一下“django formset实现数据表的批量操作”的完整攻略,以下是具体步骤: 1. 安装django formset的依赖包 Django Formset是一个强大的工具,用于处理与表单相关的重复数据集。首先需要安装django和django-formset-bootstrap4包。 可以通过以下命令在命令行中安装: pip instal…

    人工智能概论 2023年5月25日
    00
  • Python中图像算术运算的示例详解

    Python中图像算术运算的示例详解 在Python中,图像算术运算被用于对两幅图像进行加、减、乘和除的操作。这些运算可以被用于图像增强,图像融合和图像处理等方面。 图像加法示例 图像加法是将两幅图像进行像素级别的加法运算,可以用于图像融合或者亮度调整等任务。 在Python中,图像加法可以通过cv2.add函数实现: import cv2 import n…

    人工智能概览 2023年5月25日
    00
  • 用Python给二维码图片添加提示文字

    添加提示文字的思路: 要给二维码添加提示文字,需要先生成二维码图像,然后在图像上添加文字。Python中有很多库可以生成二维码图像,例如qrcode、pyqrcode等,这里以qrcode为例讲解。 qrcode库中的QRCode类可以生成二维码的矩阵数据,然后将矩阵转换成图片,最后使用Pillow库中的ImageDraw类向图片中添加文字。 示例1:生成一…

    人工智能概览 2023年5月25日
    00
  • MongoToFile怎么用?MongoDB导出工具MongoToFile安装及使用图文教程

    MongoToFile是一种操作MongoDB数据库的导出工具,支持将MongoDB数据库中的数据导出为JSON、CSV、TSV等格式的文件。以下是MongoToFile的安装和使用攻略: 安装MongoToFile 下载MongoToFile安装包,可以从官方网站或Github上下载。 解压MongoToFile压缩包,在解压后的目录下可以找到MongoT…

    人工智能概览 2023年5月25日
    00
  • Django Admin设置应用程序及模型顺序方法详解

    下面我将为您详细讲解“Django Admin设置应用程序及模型顺序方法详解”。 1. 什么是Django Admin Django Admin 是 Django 框架内置的后台管理系统,可以方便地创建、编辑、删除应用程序及模型,管理网站的日常运维工作。 2. 设置应用程序及模型顺序方法 Django Admin 默认按应用程序的字母顺序排列,但是我们希望能…

    人工智能概览 2023年5月25日
    00
  • Java使用Tess4J实现图像识别方式

    下面是“Java使用Tess4J实现图像识别方式”的完整攻略: 什么是Tess4J Tess4J是一个基于Tesseract OCR引擎的Java包。它提供了使用Java编程语言的接口,能够很方便的对印刷体字符的使用进行识别和操作。Tess4J基于apache许可证2.0发布,实现OCR工具时是非常好用,并且可以方便的实现跨平台。 安装Tess4J 安装Te…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部