python 模拟网站登录——滑块验证码的识别

下面是“python 模拟网站登录——滑块验证码的识别”的完整攻略。

简介

对于一些需要登录才能使用的网站,通常都会有验证码来防止自动化登录。其中,滑块验证码是较为常见的一种形式。本文将介绍如何使用 Python 识别并模拟拖动滑块验证码的过程,以实现自动化登录。

技术原理

滑块验证码通常由两部分构成:背景图片和前景图(即要滑动的图块)。由于前景图的位置可变,因此需要通过计算前景图的偏移量,才能模拟拖动过程。

实现的主要步骤如下:

  1. 获取验证码图片及其位置信息
  2. 下载、处理图片,得到前景图
  3. 通过找到两张图片中匹配度最高的位置,计算前景图偏移量
  4. 模拟鼠标移动及拖动,完成滑块验证码操作

实战演练

以下是两个示例,分别演示了如何识别并拖动一个普通滑块验证码和一个缺口滑块验证码。

示例1:普通滑块验证码

首先通过 Chrome 的开发者工具获取到需要模拟登录的网站的登录界面,找到验证码对应的元素及其在页面中的位置:

<div style="width: 300px; height: 160px; position: relative; overflow: hidden;">
    <img src="{验证码url}" style="position: relative; left: -115.231px; top: -40.3074px;">
    <div style="position: absolute; left: 95px; top: 20px; z-index: 999; width: 60px; height: 60px; opacity: 0.7; background: rgb(255, 255, 255); border-radius: 30px;"></div>
</div>

可见,背景图片为 "{验证码url}",距离左上角的偏移量为 left: -115.231px; top: -40.3074px;,前景图的初始位置为 left: 95px; top: 20px;

接下来,我们需要通过 Python 下载并处理背景图片及其中的前景图。这里使用 Pillow 库来处理图片。代码如下:

from PIL import Image
import requests

session = requests.Session()

# 获取背景图片及其位置信息
bg_url = "{验证码url}"
bg_left = -115.231
bg_top = -40.3074
bg = session.get(bg_url).content
with open("bg.jpg", "wb") as f:
    f.write(bg)

# 获取前景图并计算偏移量
front_url = "{前景图url}"
front = session.get(front_url).content
with open("front.png", "wb") as f:
    f.write(front)
front_img = Image.open("front.png")
bg_img = Image.open("bg.jpg")
w, h = front_img.size
# 求出前景图在背景图中的位置
real_left = bg_left + 95
real_top = bg_top + 20
# 对比背景图片和前景图中的每个像素,找到相似度最高的位置
for x in range(w):
    for y in range(h):
        if front_img.getpixel((x, y)) != (0, 0, 0, 0):
            bg_x = real_left + x
            bg_y = real_top + y
            bg_pixel = bg_img.getpixel((bg_x, bg_y))
            if abs(bg_pixel[0]-front_img.getpixel((x,y))[0])<10 and abs(bg_pixel[1]-front_img.getpixel((x,y))[1]<10) and abs(bg_pixel[2]-front_img.getpixel((x,y))[2]<10):
                move = bg_x - bg_left
                break

找到了前景图的偏移量 move 后,接下来的操作就是模拟鼠标拖动前景图。这里使用 Selenium 来完成模拟操作。代码如下:

from selenium import webdriver
from selenium.webdriver import ActionChains

# 模拟鼠标拖动前景图
driver = webdriver.Chrome()
driver.get("{登录页面url}")
slider = driver.find_element_by_css_selector("{滑块元素选择器}")
action = ActionChains(driver)
action.click_and_hold(slider).perform()
action.move_by_offset(move, 0).perform()
action.release().perform()

示例2:缺口滑块验证码

缺口滑块验证码相较于普通滑块验证码,多了一个缺口的概念。因此,需要先通过识别缺口位置,再计算前景图的偏移量。

同样可以通过 Chrome 的开发者工具获取到需要模拟登录的网站的登录界面,找到验证码对应的元素及其在页面中的位置:

<div class="gt_slider">
    <div class="gt_slider_knob gt_show" style="left: -2px;">
        <img src="{前景图url}">
    </div>
    <div class="gt_curtain gt_show" style="transform: translateX(0px);"></div>
    <div class="gt_fullbg gt_show">
        <img src="{完整背景图url}">
    </div>
    <div class="gt_bg gt_show">
        <img src="{背景图url}">
        <img src="{缺口图url}">
    </div>
</div>

可见,完整背景图片为 "{完整背景图url}",背景图片中的缺口图为 "{缺口图url}",前景图为 "{前景图url}",前景图的初始位置在滑块元素的 style="left: -2px;" 中定义。

接下来需要通过 Python 下载并处理完整背景图片及其中的缺口图和前景图。同样使用 Pillow 库来处理图片。代码如下:

from PIL import Image
import requests

session = requests.Session()

# 获取完整背景图片及其位置信息
full_bg_url = "{完整背景图url}"
full_bg = session.get(full_bg_url).content
with open("full_bg.jpg", "wb") as f:
    f.write(full_bg)

# 获取缺口图片及其位置信息
bg_url = "{缺口图url}"
bg_left = -115.231
bg_top = -40.3074
bg = session.get(bg_url).content
with open("bg.jpg", "wb") as f:
    f.write(bg)
bg_img = Image.open("bg.jpg")

# 获取前景图及其位置信息
front_url = "{前景图url}"
front = session.get(front_url).content
with open("front.png", "wb") as f:
    f.write(front)
front_img = Image.open("front.png")
_, top, _, bottom = driver.find_element(By.XPATH, "{滑块元素xpath}").get_attribute('style').split(';')
top, bottom = int(top.split(' ')[-1][:-2]), int(bottom.split(' ')[-1][:-2])
w, h = front_img.size
# 对比背景图片和前景图中的每个像素,找到相似度最高的位置
for x in range(w):
    for y in range(h):
        if front_img.getpixel((x, y)) != (0, 0, 0, 0):
            bg_x = bg_left + x
            bg_y = bg_top + y
            bg_pixel = bg_img.getpixel((bg_x, bg_y))
            if abs(bg_pixel[0]-front_img.getpixel((x,y))[0])<10 and abs(bg_pixel[1]-front_img.getpixel((x,y))[1]<10) and abs(bg_pixel[2]-front_img.getpixel((x,y))[2]<10):
                left = x
                break
# 计算偏移量
offset = left + top - 7

计算得到前景图的偏移量 offset 后,同样使用 Selenium 模拟鼠标拖动前景图即可:

from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 模拟鼠标拖动前景图
driver = webdriver.Chrome()
driver.get("{登录页面url}")
# 点击滑块元素
slider = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "{滑块元素xpath}")))
slider.click()
# 拖动滑块
action = ActionChains(driver)
# 根据缺口位置计算鼠标移动轨迹
distance = 0
x_track = [i/10 for i in range(1, 11)]
for i in x_track:
    distance += i + 2
# 按照轨迹拖动
action.click_and_hold(slider).perform()
for x in x_track[:7]:
    action.move_by_offset(x, 1).perform()
for x in x_track[7:]:
    action.move_by_offset(x, -1).perform()
action.release().perform()

总结

本文介绍了如何使用 Python 实现滑块验证码的识别和模拟操作,实现自动化登录功能。其中,普通滑块验证码只需要计算前景图的偏移量即可,而缺口滑块验证码需要先识别缺口位置,再计算偏移量。通过这种方法,我们可以大大提高登录效率和数据爬取的速度。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 模拟网站登录——滑块验证码的识别 - Python技术站

(1)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python使用Paramiko模块编写脚本进行远程服务器操作

    一、什么是Paramiko模块 Paramiko是一种Python的模块,用于通过SSH(Secure Shell协议)连接到远程服务器并执行命令或上传/下载文件。它使用PyCrypto作为加密后端,支持AES,Blowfish,3DES,RSA和DSA等加密算法来实现安全的Shell和SFTP操作。 二、Paramiko的安装 在使用Paramiko之前,…

    python 2023年6月3日
    00
  • 如何使用Python从数据库中删除一个列?

    以下是如何使用Python从数据库中删除一个列的完整使用攻略。 使用Python从数据库中删除一个列的前提条件 在使用Python从数据库中一个列之前,需要确保已经安装并启动支删除列的数据库,例如MySQL或PostgreSQL,并且需要安装Python的相应数据库驱程序,例如mysql-connector-python或psycopg2。 步骤1:导入模块…

    python 2023年5月12日
    00
  • pandas 给dataframe添加列名的两种方法

    以下是详细的实例教程,包含两种添加列名的方法和示例说明。 方法一:在生成 dataframe 时指定列名 生成 dataframe 时可以在构造器中指定列名,例如: import pandas as pd import numpy as np data = [ [1, ‘A’, 10], [2, ‘B’, 20], [3, ‘C’, 30], [4, ‘D’…

    python 2023年5月13日
    00
  • Python输入整数进行排序方式

    在Python中,可以使用多种方法对输入的整数进行排序。下面将介绍两种常用的方法。 方法一:使用sort函数 sort函数是Python内置排序函数,可以对列表进行排序。我们可以使用sort函数对输入的整进行排序。以下是一个使用sort函数对输入的整数进行排序的示例: # 使用sort函数对输入的整数进行排序 numbers = input("请输…

    python 2023年5月13日
    00
  • pandas通过字典生成dataframe的方法步骤

    生成 DataFrame 是 Pandas 中的一项常见操作。可以通过传递一些数据结构来创建 DataFrame,其中一种创建方法是通过字典生成。下面是 Pandas 通过字典生成 DataFrame 的步骤: 1. 导入 pandas 模块 在 Python 中,首先需要导入 pandas 模块才能使用 DataFrame 等相关的 API。可以使用以下代…

    python 2023年5月13日
    00
  • python列表切片和嵌套列表取值操作详解

    Python列表切片和嵌套列表取值操作详解 在Python中,列表是一种有序的可变序列,可以包含任意类型的元素。本攻略将细介绍如何使用Python列表切片和嵌套列表取值操作。 Python列表切片操作 Python列表切操作是指从列表获取一部元素的操作。以下是Python列表切片操作的语法: my_list[start:end:step] 其中,start是…

    python 2023年5月13日
    00
  • python使用urllib2实现发送带cookie的请求

    下面是 Python 使用 urllib2 实现发送带 cookie 的请求的完整攻略: 1. 引入 urllib2、cookielib 库 Python 2.x 中 urllib2 必须要手动引入 cookielib 库才能使用 cookie 功能,所以我们需要在代码中引入这两个库: import urllib2 import cookielib 2. 构…

    python 2023年6月3日
    00
  • Python算法之图的遍历

    下面是关于“Python算法之图的遍历”的完整攻略。 1. 图的遍历简介 图的遍历是指从图的某个顶点出发,按照一定的规则依访问图中的顶点,且每个点仅被访问一次的过程。图的遍历算法是图论中的基本算法一,常用于解决图论中一些问题,如最短路径、连通性等。 2 Python实现图的遍历 2.1 算法流程 图遍历算法主要有两种:深度优先遍历(DFS和广度优先遍历(BF…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部