ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

selenium登录12306_破解滑块验证

2021-10-26 16:36:29  阅读:262  来源: 互联网

标签:xpath webdriver 滑块 selenium id 12306 find browser


1. 驱动下载

selenium模拟浏览器登录需要下载对应版本驱动

Firefox驱动:https://github.com/mozilla/geckodriver/releases/

Chrome驱动:http://chromedriver.storage.googleapis.com/index.html

下载对应版本即可, Chrome驱动32位没关系,可以正常使用的

注意:因为12306会检测webdriver,所以Firefox新版(88以后)的浏览器暂时没办法解决这个问题,只能使用Chrome

驱动下载后 可以添加到代码所在文件夹(executable_path='./chromedriver.exe')或者当前项目的环境文件夹里-python.exe所在文件夹(调用时候不需要+executable_path)

2. 代码编写

2.1避免webdriver检测

import time
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')  # 避免webdriver检测
browser = webdriver.Chrome(options=options)  # 因为我的chrome.exe在环境目录里面,所以不用写 executable_path=’、、、‘

12306会自动检测webdriver,可以在控制台输入:

window.navigator.webdriver

查看,未检出应该是False,只要检测出(True),则后面的滑块验证是无法通过的

2.2 正常获取网站,此处不多赘述

url = 'https://kyfw.12306.cn/otn/resources/login.html'
browser.get(url=url)
js = 'return window.navigator.webdriver'
print(browser.execute_script(js))   # 可以直接在终端输出webdriver检测结果 
# 从页面直接检查元素(账号登陆),然后复制xpath即可获取到当前按钮 btn = browser.find_element_by_xpath('//*[@id="toolbar_Div"]/div[2]/div[2]/ul/li[2]/a') btn.click() print(browser.execute_script(js)) time.sleep(2) # 点击后需要等待1-2秒,确保账号登录页面加载出来。若后面获取元素失败,大概率可能是时间不够动态加载出来 account = browser.find_element_by_xpath('//*[@id="J-userName"]') account.send_keys('phone number') pwd = browser.find_element_by_xpath('//*[@id="J-password"]') pwd.send_keys('password') # 输入账号密码 login = browser.find_element_by_xpath('//*[@id="J-login"]') login.click() 点击登录按钮出现滑块验证 print(browser.execute_script(js)) time.sleep(2)

 

代码里面的三个webdriver检测输出为false,说明未被检测到, OK

2.3 滑块验证

 通过查看源码,手动测试查看出滑块滑动长度为300px,若一次滑动不通过出现以下页面,则需点击刷新,重复以上步骤,所以采用while和try结合

 

 

while True:
    try:
        action = webdriver.ActionChains(browser)  # 利用行为链,持续按住并拖拽
        span = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')  # 获取滑块
        action.drag_and_drop_by_offset(span, 330, 0).perform()  # 按住并拖动 >300px即可,选用330绰绰有余
        # action.click_and_hold(span).perform()
        # action.move_by_offset(xoffset=300,yoffset=0).perform() 另一张拖动
        action.release()  # 释放
        print(browser.execute_script(js))
        time.sleep(2)
        a = browser.find_element_by_xpath('//*[@id="nc_1_refresh1"]')  # 查找刷新按钮,如果没有说明登录成功,执行except跳出循环
        a.click()  # 如果刚刚滑动失败,则点击刷新,重新滑动
        time.sleep(5)
    except Exception as e:
        print(e)
        break

3 最终验证通过,结果如下

 

 

 验证通过啦

 

标签:xpath,webdriver,滑块,selenium,id,12306,find,browser
来源: https://www.cnblogs.com/shark-001/p/15466381.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有