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

news/2024/5/10 0:45:04/文章来源:https://blog.csdn.net/Xw_Classmate/article/details/112550930

AI派在读学生小姐姐Beyonce

Java实战项目练习群

长按识别下方二维码,按需求添加

扫码添加Beyonce小姐姐

扫码关注

进Java学习大礼包

来源:Python数据之道

作者:叶庭云

整理:Lemon


巧用 selenium 解决验证码,

模拟登陆某流行网

一、前言

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 = usernamepassword = password.encode('utf-8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.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,ysize = 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.6y = 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 站。

作者:叶庭云 

CSDN:https://yetingyun.blog.csdn.net/

文末福利

各位猿们,还在为记不住API发愁吗,哈哈哈,最近发现了国外大师整理了一份Python代码速查表和Pycharm快捷键sheet,火爆国外,这里分享给大家。

这个是一份Python代码速查表

下面的宝藏图片是2张(windows && Mac)高清的PyCharm快捷键一览图

怎样获取呢?可以添加我们的AI派团队的Beyonce小姐姐

一定要备注【高清图】

????????????????????

➕我们的Beyonce小姐姐微信要记得备注【高清图】

来都来了,喜欢的话就请分享点赞在看三连再走吧~~~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_747446.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SEO学习

一、什么是SEO SEO是由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”!SEO是指通过对网站进行站内优化(网站结构调整、网站内容建设、网站代码优化等)和站外优化,从而提高网站的网站关键词排名以及公司产品的曝光度。 …

建立个人网站——申请空间、域名、数据库

建站动机虽然以前学过一段时间的网站编程,用的是APS.NET,但是那时候都是在本地主机上运行,没有真正的发布到互联网上。这次想搭建一个个人小网站,用来存放一些同学的相片啥的,供大家时常怀念下,虽然QQ空间、…

乐推微网站评测

随着自媒体的兴起,自媒体也越来越大众化,但是依靠自媒体盈利的却少之又少,很多人也是因为无法一直支撑下去而被迫放弃。其实有很多广告主,希望能够找到精准客户,他们或许不会在意粉丝量的多少,更注重的是精…

七个鲜为人知的搜索网站_4个鲜为人知但功能强大的熊猫行动

七个鲜为人知的搜索网站Pandas being the most widely used data analysis and manipulation library provides numerous functions and methods to work with data. Some of them are used more frequently than others because of the tasks they perform.熊猫是使用最广泛的…

Windows Azure 创建虚拟机并发布测试网站

很多人刚开始使用Windows Azure,希望可以测试最基本的功能:使用虚拟机发布一个测试网站。Azure虚拟机的大部分功能与本地类似,某些设置需要用户在管理门户上做特殊操作。接下来,我们共同完成从创建Win Server 2012R2虚拟机到使用该…

【干货】常用的14个获取数据的网站。

转自:菜J学Python 来源:知乎大家好,数据分析时,除了自家的数据库,免不了要找一些外部的数据来论证某些问题,这里给大家分享14个权威、常用的网站,以备不时之需。1.中华人民共和国统计局国家统计…

大型网站系统特点

2019独角兽企业重金招聘Python工程师标准>>> 一、大型网站系统特点 (1)高并发、大流量:PV量巨大 (2)高可用:7*24小时不间断服务 (3)海量数据:文件数目分分…

PS网页设计教程IV——如何在Photoshop中创建一个专业博客网站布局

向Talk-Mania网站致敬。一年前,在该网站上看过许多不错的网页设计教程。一年后,再回头想看看有没有什么新的教程的时候,蓦然发现该网站已经打不开了。也许是关闭了,也许是改了网站名了。幸好,去年本人还是下载保存了几…

方配网站服务器(FPWebServer) V1.6.22.2

方配网站服务器(FPWebServer)是一款免费轻量级独立安装版的IIS服务器。支持ASP、ASP.NET和其他IIS所支持的文件类型与扩展。支持远程请求,无连接限制,可以用于本地调试使用。简便的安装方式与人性化的管理界面,使用户简单而快速地部署和管理站…

Windows 服务器配置、运行、图文流程(新手必备!) - IIS建站配置一条龙

Window 2008 服务器的配置教程本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!助力快…

25个精美的个人作品集网站,激发灵感

我的大多数朋友都是网页设计师或开发人员,其中大部分人都已经创建了自己的个人作品集网站来展现技能并链接到他们以前的作品。有一个在线的作品组合,并保持它的更新对于专业人士是至关重要的,它绝不是仅限于那些从事 Web 设计和开发工作的人。…

好家伙,被我发现了个数据结构与算法可视化网站!

‍‍大家早上好呀!之前看到了小林这篇讲数据结构算法可视化网站的文章,觉得很不错,一直想分享给大家,今天总算记得了。正文如下:网上有很多这类数据结构与算法可视化的网站,能够自己输入数据,然…

5个适合新手练习的Python刷题网站

知乎上有人问,有没有适合新手练习 Python 的做题类网站?根据我刷题找资料的经验,推荐以下5个Python练习网站,都很良心1、Github这不是一个专门的刷题网站,而是代码托管平台,里面有数百万个Python项目&#…

10分钟轻松设置出 A+ 评分的 HTTP/2 网站

前言 其实 HTTP/2 应该是 2015 年的老话题了(2015 年 5 月 14 日 HTTP/2 协议正式版的发布),但是 2018 年都到了很多网站依旧没有使用,作为新一代互联网协议,HTTP/2 不仅速度比目前常见的 HTTP/1.1 更快,而…

PublicCMS 网站漏洞 任意文件写入并可提权服务器权限

2019独角兽企业重金招聘Python工程师标准>>> PublicCMS是目前网站系统中第一个采用JAVA架构 TOMCATApccheMysql数据库架构的CMS网站,开源,数据承载量大,可以承载到上千万的数据量,以及用户的网站并发可达到上千万的PV&…

十大抢手的网站压力测试工具

十大抢手的网站压力测试工具 2010-07-21 23:10:52| 分类: 营销推广 |举报 |字号 订阅 两天,jnj在本站发布了《如何在低速率网络中测试 Web 应用》,那是测试网络不好的情况。而下面是十个免费的可以用来进行Web的负载/压力测试的工具&…

使用iis部署一个网站

1、在服务器上找到一个目录,存放网站文件,在这里假设为放到D盘根目录下文件夹webSite里,打开服务器的方式:win7里是,在“开始”菜单里找到“附件”,在附件里找到“远程桌面连接”,输入服务器ip&…

为何大量网站不能抓取?爬虫突破封禁的6种常见方法

在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长。今天大众好像更倾向于用“网络数据采集”,有时会把网络数据采集程序称为网络机器人(bots)。最常用的方法是写一个自动化程序向网络服务器请求…

再聊聊我常用的15个数据源网站

前面介绍过实用的效率小工具,真的帮了我很多忙,这次给小伙伴们再种草一些数据源网站。现在有很多免费的数据可以供使用分析,不过很少有人能找的到,或者没能力找,这就是所谓的信息差吧。其实数据获取分为两方面&#xf…