使用Selenium、Python和图鉴打码平台实现B站登录

2023-11-30 21:30

本文主要是介绍使用Selenium、Python和图鉴打码平台实现B站登录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

selenium实战之模拟登录b站

基础知识铺垫:

利用selenium进行截图:

  • driver.save_screenshot() 注意图片文件名要用png结尾.

关于移动:

  • ActionChains(bro).move_to_element_with_offset()# 对于某个图像
  • ActionChains(bro).move_by_offset()# 相对于相对位置
  • ActionChains(bro).move_to_element() # 直接滑动到另一个位置
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
path = r'D:\Downloads\xx\chromedriver-win64\chromedriver.exe'
driver = webdriver.Chrome(executable_path=path)
login_url = 'https://www.baidu.com'
driver.get(login_url)
driver.save_screenshot('./img/baidu.png')driver.quit()

在这里插入图片描述

思路:

登录接口:

https://passport.bilibili.com/login

在这里插入图片描述

  1. 首先需要点击密码登录
  2. 找到账号的输入框,输入账号
  3. 找到密码输入框,输入密码
  4. 找到登录按钮,点击登录、

其实第一步不用做,因为我们发现打开这个网页,默认是使用密码登录。

在这里插入图片描述

同样找到密码的输入框

在这里插入图片描述

找到登录按钮的位置

在这里插入图片描述

然后会弹出验证码点选择框。

在这里插入图片描述

注意,要将这个点选择框全部包括,这里的xpath只能手写,因为你发现存在iframe标签。

code_tag = bro.find_element_by_xpath('//div[@class="geetest_panel geetest_wind"]//div[@class="geetest_widget"]')

找到对应的标签后调用截图函数,保存在本地,交给第三方打码平台。

# #使用图鉴接口识别
result = tujian.getImgCodeText('./code.png',27)#获取了识别的结果

大坑:

到了最重要的时候了,根据第三方平台提供的坐标,点选验证码,下面有四种写法,只有第一种和第四种是对的.

第一种:

for pos in result_list:x = int(pos.split(',')[0])y = int(pos.split(',')[1])ActionChains(bro).move_to_element_with_offset(code_tag,x,y).click().perform()#sleep(0.5)ActionChains(bro).pause(1).perform()

第二种:

每一次创建的动作连,都是匿名函数类型,影响最小。

 for pos in result_list:x = int(pos.split(',')[0])y = int(pos.split(',')[1])# 创建一个ActionChains实例actions = ActionChains(bro)# 执行操作actions.move_to_element_with_offset(code_tag, x, y).click().perform()# 添加暂停时间actions.pause(1).perform()

​ 错误原因:每次迭代都创建了一个新的ActionChains实例,并在该实例上执行操作和添加暂停时间。这样的操作会导致每次迭代都是独立的操作,它们之间没有建立起连续的操作序列。

第三种:

demo=ActionChains(bro)
for pos in result_list:x = int(pos.split(',')[0])y = int(pos.split(',')[1])demo.move_to_element_with_offset(code_tag,x,y).click().perform()#sleep(0.5)demo.pause(1).perform()

错误原因:每个perform()方法只会执行之前添加的一系列操作,而不会执行之后添加的操作

在使用ActionChains时,通常是在添加完所有操作后调用一次perform()来执行操作序列。不需要在每个操作后都调用perform()

第四种:

demo = ActionChains(bro)for pos in result_list:x = int(pos.split(',')[0])y = int(pos.split(',')[1])demo.move_to_element_with_offset(code_tag, x, y).click()demo.pause(1)
# 执行所有操作
demo.perform()

​ 我们在循环之前创建了一个单独的ActionChains实例demo。在每次迭代中,我们使用该实例执行移动鼠标到指定位置并点击的操作,然后添加暂停时间。这样所有的操作都被添加到了同一个ActionChains实例的操作序列中。

最后,调用demo.perform()方法会执行所有的操作,实现连续的验证码点击操作。

代码:

from selenium import webdriver
from selenium.webdriver import ActionChains
from time import sleep
import tujian
path = r'D:\Downloads\xx\chromedriver-win64\chromedriver.exe'
# 1.创建浏览器对象
bro = webdriver.Chrome(executable_path=path)
# 2.发起请求
login_url = 'https://passport.bilibili.com/login'
bro.get(login_url)
sleep(1)
# 3.定位到指定标签填充用户名和密码
user_box = bro.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[3]/div[2]/div[1]/div[1]/input')
user_box.send_keys('username')
sleep(1)
pwd_box = bro.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[3]/div[2]/div[1]/div[3]/input')
pwd_box.send_keys('mima')
sleep(1)
login_btn = bro.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[3]/div[2]/div[2]/div[2]')
login_btn.click()
sleep(1)# 4.定位完整的验证码对话框
# 注意:在开发者工具中是可以定位到多个div表示验证码对话框的,因此将这几个div都定位到,以此去尝试
code_tag = bro.find_element_by_xpath('//div[@class="geetest_panel geetest_wind"]//div[@class="geetest_widget"]')
tag=bro.find_element_by_class_name('geetest_widget')sleep(1)
print(code_tag)
print(tag)#5.识别验证码(使用打码平台进行验证码识别)
code_tag.screenshot('./code.png')#将验证码对话框截图保存
sleep(1)
# #使用图鉴接口识别
result = tujian.getImgCodeText('./code.png',27)#获取了识别的结果
# 几个字几个坐标
# # result = '154,251|145,167'
print(result)
result_list = result.split('|')
print('结果列表为',result_list)
# #result_list == ['154,251','145,167']
# #6.根据识别出验证码的结果进行处理for pos in result_list:x = int(pos.split(',')[0])y = int(pos.split(',')[1])ActionChains(bro).move_to_element_with_offset(code_tag,x,y).click().perform()#sleep(0.5)ActionChains(bro).pause(1).perform()#
# demo = ActionChains(bro)
#
# for pos in result_list:
#     x = int(pos.split(',')[0])
#     y = int(pos.split(',')[1])
#     demo.move_to_element_with_offset(code_tag, x, y).click()
#     demo.pause(1)
#
# # 执行所有操作
# demo.perform()# ActionChains(bro).move_to_element_with_offset()# 对于某个图像
# ActionChains(bro).move_by_offset()# 相对于相对位置
# ActionChains(bro).move_to_element() # 直接滑动到另一个位置confirm_btn = bro.find_element_by_xpath('//div[@class="geetest_panel geetest_wind"]//div[@class="geetest_widget"]/div[@class="geetest_panel"]/a/div')
confirm_btn.click()
sleep(50)
bro.quit()

总结:

在使用ActionChains类时,通常在添加完所有操作后才调用perform()方法来执行操作序列。

这篇关于使用Selenium、Python和图鉴打码平台实现B站登录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438622

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使