巧用 selenium 解决验证码,模拟登陆某网站

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情


来源:Python数据之道

作者:叶庭云

整理:Lemon

一、前言

1. 介绍

验证码多种多样,有图形文字的、有模拟点选的、有拖动滑动的,但其实归根结底都需要人来对某种情形做一些判断,然后把结果返回并提交。

如果此时提交的验证码结果是正确的,并且通过了一些验证码的检测,就能成功突破这个验证码了。既然验证码就是让人来识别的,那么机器怎么办呢?

如果我们也不会什么算法,怎么去解这些验证码呢?此时我们需要利用可以帮助我们来识别验证码的工具或平台就,让工具或平台把验证码识别的结果返回给我们,我们拿着结果提交,那不就好了吗?

有专门的打码平台帮助我们来识别各种各样的验证码,平台内部对算法和人力做了集成,可以 7x24 小时来识别各种验证码,包括识别图形、坐标点、缺口等各种验证码,返回对应的结果或坐标,正好可以解决我们的问题,比如超级鹰

B站最新登录验证为点选验证码,以模拟登录 B 站来熟悉 selenium 库的使用和打码平台的使用方法。

这个验证码上面显示了几个汉字,同时在图中也显示了几个汉字,我们需要按照顺序依次点击汉字在图中的位置,点击完成之后确认提交,即可完成验证。这种验证码如果我们没有任何图像识别算法基础的话,是很难去识别的,所以这里我们可以借助打码平台来帮助我们识别汉字的位置。

2. 准备工作

本文用到的 Python 库是 Selenium,使用的浏览器为 Chrome,确保已经正确安装好 Selenium 库、Chrome 浏览器,并配置好 ChromeDriver,

使用的打码平台是超级鹰,链接为:https://www.chaojiying.com/,在使用之前请读者自行注册账号并获取一些题分供测试,另外还可以了解平台可识别的验证码的类别。

打码平台能提供的服务种类一般都非常广泛,可识别的验证码类型也非常多,其中就包括点触验证码。

超级鹰平台同样支持简单的图形验证码识别,超级鹰平台提供了如下一些服务:

  • 英文数字:提供最多 20 位英文数字的混合识别;

  • 中文汉字:提供最多 7 个汉字的识别;

  • 纯英文:提供最多 12 位的英文识别;

  • 纯数字:提供最多 11 位的数字识别;

  • 任意特殊字符:提供不定长汉字英文数字、拼音首字母、计算题、成语混合、集装箱号等字符的识别;

  • 坐标选择识别:如复杂计算题、选择题四选一、问答题、点击相同的字、物品、动物等返回多个坐标的识别;

本例需要处理的就是坐标多选识别的情况。我们先将验证码图片提交给平台,平台会返回识别结果在图片中的坐标位置,然后我们再解析坐标模拟点击,下面我们就用程序来实现。

二、实现思路

三、Python代码实现

1. 获取API

通过官方网站下载对应的 Python API,链接为:https://www.chaojiying.com/api-14.html。API 是 Python 2 版本的,用 requests 库来实现的。我们可以简单更改几个地方,即可将其修改为 Python 3 版本。

修改之后的 API 如下所示:

# -*- coding: UTF-8 -*-
# Chaojiying_Client类  用于提交要识别的图片  返回json结果
class Chaojiying_Client(object):
    def __init__(self, username, password, soft_id):
        self.username = username
        password = password.encode('utf-8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
                          headers=self.headers)
        logging.info(r.json())
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        logging.info(r.json())
        return r.json()

  • 这里定义了一个 Chaojiying 类,其构造函数接收三个参数,分别是超级鹰的用户名、密码以及软件 ID,保存以备使用。

  • 最重要的一个方法叫作 post_pic,它需要传入图片对象和验证码类型的代号。该方法会将图片对象和相关信息发给超级鹰的后台进行识别,然后将识别成功的 json 返回。

  • 另一个方法叫作 report_error,它是发生错误时的回调。如果验证码识别错误,调用此方法会返回相应的题分。

2. 分析B站登录界面

进入登陆界面,定位用户名和密码对应的标签,模拟输入我们的账号和密码,点击登录,此时页面会弹出验证码。

对进行验证码的获取,然后提交给「超级鹰」进行识别,接收到汉字的坐标后,处理数据,然后用动作链进行模拟点击操作,最后定位点击确认,实现成功登录 B 站。

3. 具体实现

导入用的库

from selenium import webdriver
from time import sleep
from PIL import Image
from selenium.webdriver import ActionChains
import random
import requests
from hashlib import md5
import logging

日志输出和 webdriver.Chrome() 配置

# 日志输出配置
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
# 初始化一个webdriver.Chrome()对象
chrome_driver = r'D:\python\pycharm2020\chromedriver.exe'
options = webdriver.ChromeOptions()
# 关闭左上方 Chrome 正受到自动测试软件的控制的提示
options.add_experimental_option('useAutomationExtension', False)
options.add_experimental_option("excludeSwitches", ['enable-automation'])
browser = webdriver.Chrome(options=options, executable_path=chrome_driver)

用 selenium 打开登录页面,进行模拟登录

# 登录函数   访问页面->输出账号、密码->点击登录
def login():
    browser.get('https://passport.bilibili.com/login')
    browser.maximize_window()
    # ID定位用户名,密码输入框
    username = browser.find_element_by_id('login-username')
    password = browser.find_element_by_id('login-passwd')
    username.send_keys('your username')
    password.send_keys('your password')
    # Xpath定位登录按钮并点击
    browser.find_element_by_xpath('//*[@id="geetest-wrap"]/div/div[5]/a[1]').click()
    sleep(random.random()*3)

将当前页面进行截图并保存下来,裁剪出验证码区域

def save_img():
    # save_screenshot:将当前页面进行截图并保存下来
    browser.save_screenshot('page.png')
    # Xpath定位验证码图片的位置
    code_img_ele = browser.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div')
    location = code_img_ele.location  # 验证码左上角的坐标x,y
    size = code_img_ele.size  # 验证码图片对应的长和宽

    # 得到左上角和右下角的坐标
    rangle = (
        int(location['x'] * 1.25), int(location['y'] * 1.25), int((location['x'] + size['width']) * 1.25),
        int((location['y'] + size['height']) * 1.25)
    )
    image1 = Image.open('./page.png')
    # code_img_name = './code.png'
    # crop根据rangle元组内的坐标进行裁剪 裁剪出验证码区域
    frame = image1.crop(rangle)
    frame.save('./code.png')
    return code_img_ele

将点击登录后的页面进行截图,然后定位到验证码的位置,通过location()方法获取验证码左上角的坐标, size() 获取验证码的宽和高,左上角坐标加上宽和高就是验证码右下角的坐标。获取坐标后就可以用 crop() 方法来进行裁剪,然后将裁剪到的验证码图片保存。

缩小图片

def narrow_img():
    # 缩小图片
    code = Image.open('./code.png')
    small_img = code.resize((169, 216))
    small_img.save('./small_img.png')
    print(code.size, small_img.size)

此时虽然获取了验证码图片,但是还不能直接提交给超级鹰。因为超级鹰识别的验证码图片的宽和高有限制,最好不超过460px*310px。但是截取到的验证码图片宽高为338px*432px,这时就要先将图片缩小一倍再提交即可,等到收到坐标数据再将坐标乘2。

将验证码提交给超级鹰进行识别

def submit_img():
    # 将验证码提交给超级鹰进行识别
    # 用户中心->软件ID 生成你的软件ID->替换掉96001  绑定微信可以得到1000积分 免费使用
    chaojiying = Chaojiying_Client('你的用户名', '密码', '生成的软件ID')
    with open('./small_img.png', 'rb') as f:
        im = f.read()
    # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    result = chaojiying.PostPic(im, 9004)['pic_str']
    logging.info(result)
    return result

调用已获取的API,传入参数:'你的用户名', '密码','生成的软件ID'

解析返回的汉字的坐标点的结果

def parse_data(result):
    node_list = []  # 存储即将被点击的点的坐标  [[x1,y1],[x2,y2]]
    print(result)
    if '|' in result:
        nums = result.split('|')
        for i in range(len(nums)):
            x = int(nums[i].split(',')[0])
            y = int(nums[i].split(',')[1])
            xy_list = [x, y]
            node_list.append(xy_list)
    else:
        print(result.split(',')[0])
        print(result.split(',')[1])
        x = int(result.split(',')[0])
        y = int(result.split(',')[1])
        xy_list = [x,y]
        node_list.append(xy_list)
    return node_list

超级鹰识别返回的结果的数据格式为:98,136|87,77 我们可以将数据以' | '进行分割,保存到列表中,再以逗号分割将x,y的坐标保存,得到[ [123,12],[234,21] ]这一格式,然后遍历这一列表,使用动作链对每一个列表元素对应的x,y指定的位置进行模拟点击操作,最后定位并点击确认,可成功实现登录 B 站。

按顺序模拟点击每个坐标点

def click_codeImg(all_list, code_img_ele):
    # 遍历列表,使用动作链对每一个列表元素对应的x,y指定的位置进行点击操作
    for item in all_list:
        x = item[0] * 1.6
        y = item[1] * 1.6
        # move_to_element_with_offset移动到距某个元素(左上角坐标)多少距离的位置
        ActionChains(browser).move_to_element_with_offset(code_img_ele, x, y).click().perform()
        sleep(random.random())
        logging.info('点击成功!')

    sleep(random.random()*2)
    # 完成动作链点击操作后,定位确认按钮并点击
    browser.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[3]/a').click()

主函数调用

# -*- coding: UTF-8 -*-
def main():
    # 进入登录界面,输入账号密码
    login()
    # 保存页面截图,并根据坐标裁剪获取验证码图片
    code_img_ele = save_img()
    # 缩小图片
    narrow_img()
    # 将图片提交给超级鹰,获取返回的识别结果
    result = submit_img()
    # 解析返回结果,将数据格式化
    all_list = parse_data(result)
    # 在页面验证码上完成点击操作并登录
    click_codeImg(all_list, code_img_ele)

main()

运行效果如下:

鼠标是放在左边的,没有动过,不是人工悄悄点的哦,这样我们就成功实现了 selenium 模拟登录 B 站。

可以从一份超市数据集中分析出啥?

10大Python数据可视化库!

后台回复“入群”即可加入小z数据干货交流群
Python实现点验证码识别, 模拟登陆小破站并自动发弹幕 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 阅读详情

相关推荐

【在线可测】通用中文点验证码识别

通用中文点验证码识别,点验证码,极验,易盾,携程,百度等等全支持,在线测试。

kerlomz的博客 8344

处理点验证码 手把手教你用selenium模拟登录B站

处理点验证码 ,教你用selenium模拟登录B站。

叶庭云 成为自己的光 3599

Python3爬虫实战【点触验证码】 — 模拟登陆bilibili

Python3爬虫实战【点触验证码】 — 模拟登陆bilibili 爬虫时间:2020-08-30 请求链接:https://passport.bilibili.com/login 实现目标:模拟登陆哔哩哔哩 涉及知识:点触验证码的攻克、自动化测试工具 Selenium 的使用,超级鹰打码平台的使用 完整代码:https://github.com/dateolive/python-/tree/master/bilibili 学习过程中的爬虫GitHub库:https://github.com/dateol

梦独吟 5081

selenium模拟登陆豆瓣网

前言 随着网站安全做的越来越好,不少网站,直接去爬取数据是无法爬出来的,必须要验证登陆,即登陆之后才能做后面的操作,因此需要解决的第一步就是登陆 登陆的常用方式: 1、使用request库,模拟post请求 2、使用框架自己集成的,比如在使用scrapy的时候,可以直接模拟登陆 3、使用selenium模拟浏览器登陆 前两种之前有大概的分享,下面使用selenium的方式模拟登陆 selenium...

congge 6601

前端页面登录验证(滑动验证、点验证)

最近用到了了一款很好用的前端登录验证,滑动验证和点验证,兼容性也很好,在此记录一下 先放上地址 首先在官网github下载资源包,放入到自己的项目中,包的结构就是下边这样子 在需要使用的页面 1.引入css文件verify.css 2.按顺序引入js文件下js文件 jquery.min.js, crypto-js.js, ase.js, verify.js 这里放上在线文档 然后在你的页面需要使用的地方放入以下的标签 <div id="content"></div> <

DR1sxy的博客 5624

Pythonselenium,使用webdriver模拟登录网站(含验证码

前言 这段时间做了一个小项目,其中有一段需要自动获取网站后台的数据,但是这个网站没有任何提供给开发者的API,所以只能靠自己去探索。 起初想着用发送请求的方式去模拟登陆,获取cookies,从而再获取网站后台数据,但是因为自己太菜了一些原因,放弃了这个方法。 后来想到使用webdriver调用浏览器来模拟登陆,发现操作起来简单很多,而且可以达到同样的效果,于是便有了这篇文章。 准备工作 这里直接丢一篇selenium简介过来,里面有详细的操作方法,也有selenium库的一些基本介绍和用例。 当然也可以去官

阿杆的博客 1万+

巧用 selenium 解决验证码模拟登陆某流行网站

来源:Python数据之道作者:叶庭云整理:Lemon巧用 selenium 解决验证码模拟登陆某流行网站一、前言1. 介绍验证码多种多样,有图形文字的、有模拟的、有拖动滑动的,但...

Python数据之道 1924

Python爬虫实战 | (15) 破解bilibili登陆滑动验证码

在本篇博客中,我们将使用selenium模拟登录bilibili网站,破解其登陆时的滑动验证码。 首先回顾一下,滑动验证码相关知识: 简介 滑动图形验证码,主要由两个图片组成:抠块和带有抠块阴影的原图。 这里有两个重要特性保证被暴力破解的难度: (1)抠块的形状随机 (2)抠块所在原图的位置随机 生成滑动验证码 1)后端随机生成抠图和带有抠图阴影的背景图片,后台保存随机抠图位置坐标...

sdu_hao的博客 6984

Python3 爬虫实战 — 模拟登陆哔哩哔哩【滑动验证码对抗】

登陆时间:2019-10-19 实现难度:★★★☆☆☆ 请求链接:https://passport.bilibili.com/login 实现目标:模拟登陆哔哩哔哩,破解滑动验证码 涉及知识:滑动验证码的破解、自动化测试工具 Selenium 的使用 完整代码:https://github.com/TRHX/Python3-Spider-Practice/tree/master/bilibil...

BOB'S BLOG 5021

Python爬虫之selenium,有验证码模拟登录

在学习Selenium之前,通过request.get()或者.post(),很难获取网站所加载的动态数据,通过Selenium强大的自动化功能、多浏览器支持、跨平台支持等优点,让我轻松获取一些之前很难获取的数据,这次的案例也是结合之前的所学知识完成二.感兴趣的话还可以尝试以下其他的网站进行模拟自动登录,以后可以方便的进行各个软件的登录啦,Selenium真是一个强大的测试工具。

Tudective的博客 3733

selenium+opencv实现模拟登陆(滑块验证码

很多网站登录登陆时都要用到滑块验证码,在某些场景例如使用爬虫爬取信息时常常受到阻碍,想着用opencv的模板匹配试试能不能实现模拟登陆

qq_46145027的博客 3490

python-selenium模拟登陆(滑动验证码)

python-selenium模拟登陆(滑动验证码) 普通滑动验证码验证 只需要我们将滑块拖动指定位置,处理起来比较简单。拖动之前需要先将滚动条滚动到指定元素位置,但是需要注意目标网站selenium的反爬,如window.navigator.webdriver识别;滑块移动速度识别等; 带缺口(拼图)滑动验证码 这一类验证码可以使用两种方式识别: ①在目标网站带有完整背景图时,可以获取完整背景图与带缺口的图片进行比较,获取缺口的位置,计算距离,拖动滑块移动至缺口即可; ②尝试先用cv2的边缘检测识别出

qq_41871957的博客 3307

java使用Selenium模拟登陆58(验证码登陆&密码登陆)若快平台识别文字点击验证码

文章目录写在前面配置环境Selenium入门使用Selenium登陆58若快平台识别文字点击验证码附:By对象中的 xpath & cssSelector获取方式**不打开浏览器在后台进行操作自动登陆+识别gif 写在前面 Selenium原本是一套网页自动化测试工具,模拟用户真实浏览操作进行测试。 如今我们可以使用Selenium进行模拟登陆,不需要像以前一样去写网络框架模拟登陆 注意:...

Ronny_xie的博客 3245

使用selenium模拟登陆,手机验证码

大众点评 from time import sleep from selenium import webdriver import random def process_request(self,request,spider): phone = '电话号码' driver = webdriver.Chrome() dr...

Moken9527的博客 1912

Selenium实战滑块验证码登陆网站

问题背景 很久以前有个网站上数据交互自动化,需要登录后才能进行,就临时学了selenium,现在也用不上了,就总结一下。 整个交互流程:先是输入密码,然后鼠标拖动验证码滑块完成人机验证,登录完成后通过cookie或者session授权进行数据交互。 问题分析 这个问题难点在于: 1、如何驱动网页的鼠标键盘交互,拿到网页中的重要信息; 2、滑块验证码正确滑动以及人手的轨迹模拟; 第一个问题中键鼠交互其实有很多方案可以实现,不论是使用第三方库还是通过系统API等方案,但是后需要拿cookie的

XiaoY 3283
上一篇: Python数据可视化,完整版实操指南 !
下一篇: “删库跑不了路”:怒删公司9TB数据,被判刑7年!
数据不吹牛
博客等级 码龄10年 1505粉丝 67原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值