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日

相关文章

  • 分析Python的Django框架的运行方式及处理流程

    分析Python的Django框架的运行方式及处理流程 Django是一个基于MVC架构的Web框架,使用Python作为开发语言,通过强大的ORM系统实现了与多种数据库的连接,以及一些强大的缓存和模板系统。下面是Python的Django框架的运行方式及处理流程的完整攻略: 安装Django 首先,我们需要安装Python的Django框架。在安装之前,确…

    人工智能概论 2023年5月25日
    00
  • TensorFlow基本的常量、变量和运算操作详解

    TensorFlow基本的常量、变量和运算操作详解 本文将详细介绍TensorFlow中的常量、变量和运算操作。TensorFlow是一个非常强大和灵活的机器学习框架,可以实现许多不同的机器学习算法和模型。了解TensorFlow的基本知识对于使用该框架非常重要。 标量常量 在TensorFlow中,标量常量是一个只有一个值的张量,可以使用tf.consta…

    人工智能概论 2023年5月24日
    00
  • python和ruby,我选谁?

    Python和Ruby,我选谁? Python和Ruby都是著名的脚本语言,在功能和框架方面有很多相似之处,然而它们之间仍然存在一些不同之处。那么,当你需要选择其中一种语言时,该如何决策呢?下面为你提供一些攻略: 1. 适用场景 Python和Ruby都可以用于数据处理、Web编程和自动化脚本编写等任务。然而,它们在不同领域中有着各自的特点。 Python适…

    人工智能概览 2023年5月25日
    00
  • Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本)

    Python淘宝或京东等秒杀抢购脚本实现,通常需要模拟用户在网站上手动选购商品,提交订单等操作。一般而言,实现秒杀脚本的流程可以分为以下几个步骤: 步骤一:分析目标网站 首先需要了解目标网站的网络通信协议,以及目标页面的HTML结构、JS代码等。通常可以使用浏览器的开发者工具查看页面元素、请求信息、响应数据等,并使用Python的requests、Beaut…

    人工智能概览 2023年5月25日
    00
  • PowerShell与Python的异同介绍

    PowerShell与Python的异同介绍 异同点 相关背景 PowerShell和Python都是流行的编程语言,其中PowerShell主要用于Windows系统上的任务自动化和系统管理,而Python则具有广泛的应用范围,包括Web开发、数据分析、机器学习等方向。虽然两种语言在某些方面非常相似,但是它们同样存在着许多不同点。 不同的语法 PowerS…

    人工智能概览 2023年5月25日
    00
  • 详解Django中的ifequal和ifnotequal标签使用

    当我们在开发Django网站时,经常需要进行判断操作,例如需要判断变量是否与比较值相同,而Django提供了ifequal和ifnotequal标签来进行这样的操作。下面将详细讲解Django中的ifequal和ifnotequal标签使用的完整攻略。 1. ifequal和ifnotequal标签语法 Django中的ifequal和ifnotequal标…

    人工智能概览 2023年5月25日
    00
  • 在Nginx服务器中启用SSL的配置方法

    启用SSL的配置方法可以分为以下几个步骤: 1. 申请SSL证书 SSL证书需要向SSL证书颁发机构(CA)申请,下面以Let’s Encrypt为例讲解如何申请。 首先,需要使用如下命令安装Let’s Encrypt的客户端: sudo apt-get install certbot python-certbot-nginx 安装完成后,可以使用如下命令申…

    人工智能概览 2023年5月25日
    00
  • 浅析Tencent Analytics腾讯网站分析系统的架构

    浅析Tencent Analytics腾讯网站分析系统的架构 简介 Tencent Analytics腾讯网站分析系统是一种专门用于收集、分析网站数据的系统,它可以帮助网站管理员进行数据分析、优化和改进,提升网站访问量和用户体验。 该系统的架构包括数据采集、数据存储、数据分析和数据呈现四个部分。下面我们将对这四个部分进行详细分析。 数据采集 Tencent …

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