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

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日

相关文章

  • django-rest-swagger对API接口注释的方法

    下面是关于django-rest-swagger对API接口注释的详细攻略: 什么是django-rest-swagger django-rest-swagger是一个用于构建RESTful API的Django工具包,它自动会根据你的代码生成API文档。它提供了一个名为Swagger的UI界面,方便了API接口的浏览和测试。 如何对API接口进行注释 dj…

    人工智能概览 2023年5月25日
    00
  • OMEN暗影精灵8 Pro值得入手吗 OMEN暗影精灵8 Pro游戏本评测

    OMEN暗影精灵8 Pro游戏本评测 概述 OMEN暗影精灵8 Pro是一款专为游戏玩家打造的高性能笔记本电脑。它搭载了英特尔酷睿i7处理器、英伟达GeForce RTX 3070显卡等顶级配置,提供了出色的游戏性能。同时,它还具有优秀的散热效果和舒适的键盘手感,是一款非常值得推荐的游戏本。 性能 OMEN暗影精灵8 Pro采用了英特尔酷睿i7处理器和英伟达…

    人工智能概览 2023年5月25日
    00
  • 使用Bootstrap框架制作查询页面的界面实例代码

    使用Bootstrap框架制作查询页面的界面实例代码通常需要经历以下步骤: 1. 引入Bootstrap CSS和JS文件 在HTML头部引入Bootstrap的CSS和JS文件: <head> <!– 引入Bootstrap的CSS文件 –> <link rel="stylesheet" href=&q…

    人工智能概论 2023年5月25日
    00
  • Ubuntu系统下的Nginx服务器软件安装时的常见错误解决

    请您参考以下攻略进行操作: Ubuntu系统下的Nginx服务器软件安装时的常见错误解决 1. 安装前的准备 在安装Nginx服务器前,请确保您的Ubuntu系统已经更新至最新版本,更新命令如下: sudo apt update sudo apt upgrade 2. 安装Nginx服务器 在Ubuntu系统中安装Nginx服务器软件的命令为: sudo a…

    人工智能概览 2023年5月25日
    00
  • tensorflow学习笔记之mnist的卷积神经网络实例

    TensorFlow学习笔记之MNIST的卷积神经网络实例 随着深度学习的普及,卷积神经网络已成为图像和视觉任务中最常用的模型之一。在这篇文章中,我们将介绍如何使用Tensorflow创建一个基本的卷积神经网络(CNN)模型来处理MNIST数据集。 1. MNIST数据集 手写数字识别数据集MNIST是一个广泛使用的数据集,它包含60,000个训练样本和10…

    人工智能概论 2023年5月25日
    00
  • Java 实现分布式服务的调用链跟踪

    Java 实现分布式服务的调用链跟踪 背景 在分布式架构下,应用系统通常由多个服务组成,这些服务之间相互调用,形成了一个复杂的调用链路。这时候,当出现故障时,如何追踪错误,定位问题就成为了一个挑战。 调用链跟踪技术能够帮助我们解决这个问题。它记录所有服务的调用过程,并将这些信息整合成一个可视化的链路图,以便于我们快速定位问题。 实现方法 常见的调用链跟踪实现…

    人工智能概览 2023年5月25日
    00
  • Python实现判断一行代码是否为注释的方法

    判断一行代码是否为注释需要根据代码中的注释符及其在代码中的位置来进行判断。下面是判断一行代码是否为注释的方法。 方法1:判断首字符是否为注释符 一行代码如果是注释行,则通常情况下其首字符都为注释符号。Python中的注释符号是井号(#)。 在Python中,如果一行代码的首字符为井号(#),则该行代码为注释。反之,如果一行代码的首字符不为#,则该行代码为非注…

    人工智能概论 2023年5月24日
    00
  • 利用Python实现网络测试的脚本分享

    下面我将详细讲解“利用Python实现网络测试的脚本分享”的完整攻略。 简介 Python是一种简单易用的编程语言,由于其优秀的网络库,使得Python成为网络测试工具的首选语言。本攻略将介绍如何使用Python编写网络测试的脚本。 环境搭建 在开始编写Python脚本之前,需要先搭建Python环境。建议使用Python3版本。 网络测试分类 网络测试一般…

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