使用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

相关文章

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁