参考博客

参考博主不温卜火博客:爬虫入门经典(十八) | 滑动验证码识别。

在上一章中遗留了一个问题:就是在使用用户名自动化登陆百度的时候,出现了滑动验证码的验证问题,导致了“半自动化”的登录。
今天本篇文章来解决这个问题。

分析

首先是定位标签元素,找到滑块标签block = driver.find_element_by_xpath('//body/div/div/div/div[2]/div[2]/p')

然后摁下滑块ActionChains(driver).click_and_hold(block).perform()

然后移动距离ActionChains(driver).move_by_offset(165, 0).perform()165是移动的像素点,
最后释放滑块ActionChains(driver).release().perform()

源码

# author: LiuShihao
# data: 2020/12/3 9:55 下午
# youknow: 各位老铁,我的这套代码曾经有人出价三个亿我没有卖,如今拿出来和大家分享,不求别的,只求大家免费的小红心帮忙点一点,这里谢过了。
# desc:
"""
Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具。
pip3 install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple下载浏览器驱动,Selenium3.x调用浏览器必须有一个webdriver驱动文件
Chrome : https://chromedriver.storage.googleapis.com/index.html?path=2.35/
FileFox:https://github.com/mozilla/geckodriver/releasesBug : 驱动浏览器是 Chorme显示正受到自动测试软件的控制
"""
from selenium import webdriver
import time# 驱动文件路径   字母前加r表示raw string,也叫原始字符串常量。一般用在一下两个方面:# 1、正则表达式#   用于处理正则表达式时,规避反斜杠的转义# 2、系统路径#   如下面的路径,使用r就防止了\t的转义
from selenium.webdriver import ActionChainsdriverfile_path = r'/Users/LiuShihao/PycharmProjects/SpiderPython/Browser/Baidu/chromedriver'
def get_tracks(distance, rate=0.6, t=0.2, v=0):"""将distance分割成小段的距离:param distance: 总距离:param rate: 加速减速的临界比例:param a1: 加速度:param a2: 减速度:param t: 单位时间:param v: 初始速度:return: 小段的距离集合"""tracks = []# 加速减速的临界值mid = rate * distance# 当前位移s = 0# 循环while s < distance:# 初始速度v0 = vif s < mid:a = 20else:a = -3# 计算当前t时间段走的距离s0 = v0 * t + 0.5 * a * t * t# 计算当前速度v = v0 + a * t# 四舍五入距离,因为像素没有小数tracks.append(round(s0))# 计算当前距离s += s0return tracks# 通过用户名登陆
def loginByUsernameAndPwd():driver.get("https://www.baidu.com/")# content = driver.page_source# print("网页内容:", content)# 使用//a[@name="tj_login"]这种写法虽然在页面可以找到但是 却不可交互 不知道为什么  换下面的写法# tj_login=driver.find_element_by_xpath('//a[@name="tj_login"]')tj_login=driver.find_element_by_xpath('//body/div/div/div[@id="u1"]/a')print("点击登陆按钮")tj_login.click()time.sleep(2)"""大概意思是程序无法定位到“用户名登录”,我们可以确定我们写的xpath路径是正确的,那是为什么呢?原因是程序执行的很快,在浏览器没加载出“用户名登录”的时候我们程序就开始点击了,那么我们可以在点击前暂停程序2秒钟等待加载完页面,"""usernameLogin=driver.find_element_by_xpath('//div/p[@title="用户名登录"]')# 获得用户名登陆# usernameLogin=driver.find_element_by_xpath('//body/div/div[2]/div[2]/div/div/div/div/div/div[3]/p[2]')usernameLogin.click()# 获得用户名输入框driver.find_element_by_xpath('//form/p/input[@name="userName"]').send_keys('用户名')# 获得密码输入框driver.find_element_by_xpath('//form/p/input[@name="password"]').send_keys('密码')# 获得登陆按钮login = driver.find_element_by_xpath('//form/p/input[@type="submit"]')# 登录 滑动login.click()#time.sleep(2)# driver.switch_to.frame(1)# time.sleep(2)block = driver.find_element_by_xpath('//body/div/div/div/div[2]/div[2]/p')while True:# 摁下滑块ActionChains(driver).click_and_hold(block).perform()# 移动# ActionChains(driver).move_by_offset(212*0.71, 0).perform()ActionChains(driver).move_by_offset(165, 0).perform()# # 获取位移# tracks = get_tracks(212*0.71)# for track in tracks:#     # 移动#     ActionChains(driver).move_by_offset(track, 0).perform()# 释放ActionChains(driver).release().perform()time.sleep(2)def loginByQQ():# 获取不到元素有可能是因为页面还未加载完成,需要将程序睡眠两秒。driver.get("https://www.baidu.com/") # //a[@name="tj_login"] 百度页面 登陆按钮# 获取网页内容Elements# content = driver.page_source# print("网页内容:",content)login = driver.find_element_by_xpath('//div[@id="u1"]/a')# 点击登陆按钮login.click()time.sleep(2)# 定位 qq登陆按钮qq = driver.find_element_by_xpath('//div/ul/li[@class="bd-acc-qzone"]/a')# 点击qq登陆qq.click()time.sleep(2)# 此行代码用来新窗口windows = driver.window_handlesdriver.switch_to.window(windows[1])# //a[@id="switcher_plogin"]driver.find_element_by_id('ptlogin_iframe').click()driver.maximize_window()# 切换至账户密码框 irrame框架标签driver.switch_to.frame('ptlogin_iframe')# 选择账号密码登陆driver.find_element_by_id('switcher_plogin').click()#qq用户driver.find_element_by_id('u').send_keys('qq账号')# qq密码driver.find_element_by_id('p').send_keys('qq密码')# 登陆driver.find_element_by_id('login_button').click()if __name__ == '__main__':# 不再让Chorme浏览器显示'正受到自动测试软件的控制'option = webdriver.ChromeOptions()option.add_experimental_option('useAutomationExtension', False)option.add_experimental_option('excludeSwitches', ['enable-automation'])# 启动浏览器driver = webdriver.Chrome(executable_path=driverfile_path,options=option)# 最大化driver.maximize_window()loginByUsernameAndPwd()# loginByQQ()

Bug 滑动的距离

这个百度滑动验证码的方式是如果当前失败了会换下一幅图片,拖动的距离每次都不一样,所以很难控制距离。目前代码中将滑动的距离写"死"了,所以只能死循环来碰运气。如果有什么更好的方法,欢迎写在评论区中评论。

Python爬虫学习(六)selenium自动化测试登陆百度账号_滑动验证码问题相关推荐

  1. 【python爬虫学习】cookie模拟登陆

    近期学校要求登陆一个网站学习,要计算在线时长,长时间不对这个页面进行操作的话就会停止计时.就想着能不能写个程序模拟登陆并进行一些操作. 模拟登陆的话有很多方法,因为有验证码比较麻烦,所以我是自己先登陆 ...

  2. 从入门到入土:Python爬虫学习|实例练手|爬取百度翻译|Selenium出击|绕过反爬机制|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  3. 从入门到入土:Python爬虫学习|Selenium自动化模块学习|简单入门|轻松上手|自动操作浏览器进行处理|chrome|PART01

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  4. python爬虫学习之页面登陆

    爬虫学习的一点心得 登陆主要有3种方法:使用selenium,cookies,模拟表单登陆 个人对于一般情况使用cookies登陆 可以实现一次手动,长期自动,可以绕过登陆(登陆的相关信息密码,账号等 ...

  5. 从入门到入土:Python爬虫学习|实例练手|爬取百度产品列表|Xpath定位标签爬取|代码注释详解

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  6. Python爬虫学习手册

    like:128-Python 爬取落网音乐 like:127-[图文详解]python爬虫实战--5分钟做个图片自动下载器 like:97-用Python写一个简单的微博爬虫 like:87-爬虫抓 ...

  7. Python爬虫学习系列教程

    大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫 ...

  8. Python爬虫学习系列教程-----------爬虫系列 你值的收藏

    静觅 » Python爬虫学习系列教程:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把 ...

  9. Python 爬虫学习 系列教程

    Python爬虫 --- 中高级爬虫学习路线 :https://www.cnblogs.com/Eeyhan/p/14148832.html 看不清图时,可以把图片保存到本地在打开查看... Pyth ...

  10. Python爬虫十六式 - 第三式:Requests的用法

    Requests: 让 HTTP 服务人类 学习一时爽,一直学习一直爽   Hello,大家好,我是Connor,一个从无到有的技术小白.今天我们继续来说我们的 Python 爬虫,上一次我们说到了 ...

最新文章

  1. SQL Injection(SQL注入)介绍及SQL Injection攻击检测工具
  2. Jmeter内置函数功能(五)
  3. 【入门】WebRTC知识点概览 | 内有技术干货免费下载
  4. python android自动化基于java_Appium+Python自动化 1 环境搭建(适用windows系统-Android移动端自动化)...
  5. Parcel是个好玩意儿
  6. Android开发之设置Edittext小数点后两位以及限制位数同时使用
  7. StarUML使用说明-指导手册
  8. mysql订单表上亿怎么分表_[转]单表上亿的数据量如何分表
  9. 在Win7旗舰版安装并运行LoadRunner11
  10. 2 ELK收集nginx的json格式日志
  11. 小网站服务器空间,小型网站空间服务器
  12. bzoj4009: [HNOI2015]接水果
  13. 记我朋友的一次前端面试
  14. 转载一篇适合初学者“区分自由浮动时间和总浮动时间”的文章
  15. 关于C2100间接寻址的问题
  16. 程序员被老板要求两个月做个app, 要不比京东差,网友:辞职吧
  17. android跳转QQ陌生人聊天或者加入QQ群
  18. 区块链交易性能、隐私保护、监管问题
  19. Android音频系统之四AudioPolicy
  20. SkeyeVSS实现RTSP、Onvif监控摄像头网页无插件化直播监控解决方案

热门文章

  1. Y2K问题和2038问题
  2. PTA习题【python】 6-8 jmu-python-发牌
  3. 全网最细海龟 (turtle) 画图讲解 (三):设置画笔样式
  4. 懒惰删除JAVA,Redis的新特性懒惰删除Lazy Free详解
  5. 【论文泛读】Leveraging Distribution Alignment via Stein Path for Cross-Domain Cold-Start Recommendation
  6. 透彻理解神经网络剪枝算法
  7. 电脑怎么自动锁定计算机,如何设置电脑,人一走开就可以自动上锁?
  8. tenacity重试机制
  9. greenplum segment down 实例
  10. 扫码点餐小程序项目后端开发之“01.搭建服务器基础设施”