爬虫日常-selenium登录12306,绕过验证

这篇具有很好参考价值的文章主要介绍了爬虫日常-selenium登录12306,绕过验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

hello兄弟们,这里是无聊的网友。愉快的周末过去了,欢迎回到学习频道。书接上文,我们说到了再用selenium登录12306时遇到了滑块验证的问题。当前的网站几乎每家都会在登录模块添加一个认证,来规避各种爬虫,而我们则不断的去想办法绕过这些验证模块。目前一些简单的验证如图片拼接,汉字识别的都可以借助如图鉴,超级鹰提供的功能解决。而主流的流行应用的验证绕过则需要非常复杂的步骤。我们就有点自知之明,先能够做到简单的绕过就好。
爬虫日常-selenium登录12306,绕过验证,爬虫日常,爬虫,python,selenium就拿12306为例,目前还只是最简单的滑块验证,还好不是类似哔哩哔哩的极验类的滑块验证,所以我们趁着它简单先拿它开刀​

爬虫日常-selenium登录12306,绕过验证,爬虫日常,爬虫,python,selenium我们可以看到在输入账号密码后,页面就会跳出滑块认证,依旧是先分析再动手

按照正常思路,先点击到滑块认证,然后鼠标点击滑块,拖动到最边上。我们首先右键检查滑块认真,看看验证模块有没有存在iframe中

爬虫日常-selenium登录12306,绕过验证,爬虫日常,爬虫,python,selenium检查完发现div并没有被包裹在iframe中,就存在页面源码中,我们就可以直接通过find_element定位到此处并进行点击动作

代码设计

先放上上一期的代码

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By


# 定义登录方法
def login(user, pwd):
    login_choice = web.find_element(By.XPATH, '//*[@id="toolbar_Div"]/div[2]/div[2]/ul/li[1]')
    # 点击账号密码登录方式
    login_choice.click()
    web.find_element(By.XPATH, '//*[@id="J-userName"]').send_keys(user)  # 向账号框传入账号信息
    web.find_element(By.XPATH, '//*[@id="J-password"]').send_keys(pwd)  # 向密码框传入密码
    # 定位到登录按钮并点击
    web.find_element(By.XPATH, '//*[@id="J-login"]').click()


if __name__ == '__main__':
    opt = Options()
    opt.add_experimental_option('excludeSwitches', ['enable-automation'])  # 去除浏览器顶部显示受自动化程序控制
    opt.add_experimental_option('detach', True)  # 规避程序运行完自动退出浏览器
    web = Chrome(options=opt)
    web.get('https://kyfw.12306.cn/otn/resources/login.html')
    user = ''  # 此处输入账号
    pwd = ''   # 此处输入密码
    login(user, pwd)

按照设计思路,我们应当在登录方法处添加模拟点击滑块的代码
到了这一步,学完基础的同学就应该想到要借助ActionChains,ActionChains模拟鼠标操作的常用方法。使用click()方法可以进行鼠标的单击操作,此外还提供了有关双击、右击、悬停、鼠标拖动等功能的方法,这里不一一阐述了。

设计代码如下

    span = web.find_element(By.XPATH, '//*[@id="nc_2_n1z"]')  # 首先定位到滑块
    action = ActionChains(web)
    action.click_and_hold(span).move_by_offset(300, 0).perform() # click_and_hold代表点击并保持点击动作。move_by_offset(x, y),其中x代表水平移动距离,y代表垂直移动距离
    

爬虫日常-selenium登录12306,绕过验证,爬虫日常,爬虫,python,selenium爬虫日常-selenium登录12306,绕过验证,爬虫日常,爬虫,python,selenium可以看到整个滑块的水平长度为340​而需要移动的小滑块为38.4的宽度。所以大致需要移动的距离为340-38.4。如果move_by_offset的x参数过大可以导致程序报错超出滑框宽度,在循环中若移动的参数过小可能到达不了最右侧或者超时认证。因此此处我直接一次性滑动300.
编写完运行检测效果
爬虫日常-selenium登录12306,绕过验证,爬虫日常,爬虫,python,selenium可以看到第一次的运行失败,报错信息为滑块验证element没有定位到。那么为什么会出现这样的错误呢。是因为我们的速度太快了
爬虫日常-selenium登录12306,绕过验证,爬虫日常,爬虫,python,selenium
因为我们的点击请求过快,导致页面的滑块验证模块还没有跳转出来就直接进行点击请求了,解决的方法也很简单,可以直接使用time.sleep进行强制睡眠。但我们不建议这样使用,最好是采用显示等待的方法对其处理。

我们都知道显式等待也称为智能等待,针对指定元素定位指定等待时间,在指定时间范围内进行元素查找,找到元素则直接返回,如果在超时还没有找到元素,则抛出异常,显示等待是 selenium 当中比较灵活的一种等待方式,他的实现原理其实是通过 while 循环不停的尝试需要进行的操作。那么知道了原理后就直接上手用它。

在定位到滑块验证并点击前设置显示等待。需要下面两个包配合使用

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
     # 此处还去掉了点击滑块验证的操作
    # 设置显示等待直到滑块的span标签被定位到
    WebDriverWait(web, 0.5, 0.05).until(EC.presence_of_element_located((By.ID, 'nc_1_n1z')))
    span = web.find_element(By.ID, 'nc_1_n1z')  # 首先定位到滑块

WebDriverWait()中的参数主要为等待时间和刷新时间,经过我的测试0.5为我的程序最少的需要的等待时间,再少程序就要报错,同样0.05为最少刷新时间
这个是和个人电脑与网速有关的,报错的同学可以尝试修改
编写后在再次测试
爬虫日常-selenium登录12306,绕过验证,爬虫日常,爬虫,python,selenium
ok,最后运行成功。成功绕过12396的滑块认证。老规矩运行成功放源码

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


# 定义登录方法
def login(user, pwd):
    login_choice = web.find_element(By.XPATH, '//*[@id="toolbar_Div"]/div[2]/div[2]/ul/li[1]')
    # 点击账号密码登录方式
    login_choice.click()

    username = web.find_element(By.XPATH, '//*[@id="J-userName"]')  # 向账号框传入账号信息
    passwd = web.find_element(By.XPATH, '//*[@id="J-password"]')  # 向密码框传入密码
    username.click()
    username.send_keys(user)
    passwd.click()
    passwd.send_keys(pwd)
    # 定位到登录按钮并点击
    web.find_element(By.XPATH, '//*[@id="J-login"]').click()
    # 设置显示等待直到滑块的span标签被定位到
    WebDriverWait(web, 0.5, 0.05).until(EC.presence_of_element_located((By.ID, 'nc_1_n1z')))
    span = web.find_element(By.ID, 'nc_1_n1z')
    action = ActionChains(web)
    action.click_and_hold(span).move_by_offset(300, 0).perform() # click_and_hold代表点击并保持点击动作。move_by_offset(x, y),其中x代表水平移动距离,y代表垂直移动距离


if __name__ == '__main__':
    opt = Options()
    opt.add_experimental_option('excludeSwitches', ['enable-automation'])  # 去除浏览器顶部显示受自动化程序控制
    opt.add_experimental_option('detach', True)  # 规避程序运行完自动退出浏览器
    web = Chrome(options=opt)
    web.get('https://kyfw.12306.cn/otn/resources/login.html')
    # 解除浏览器特征识别selenium
    script = 'Object.defineProperty(navigator,"webdriver", {get: () => false,});'
    web.execute_script(script)
    user = ''  # 此处输入账号
    pwd = ''   # 此处输入密码
    login(user, pwd)

今天先告一段落,明天在和大家接着研究如何在登录后选购票。麻烦点个赞哦兄弟们。
爬虫日常-selenium登录12306,绕过验证,爬虫日常,爬虫,python,selenium文章来源地址https://www.toymoban.com/news/detail-730546.html

到了这里,关于爬虫日常-selenium登录12306,绕过验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 爬虫入门指南(6):反爬虫与高级技巧:IP代理、User-Agent伪装、Cookie绕过登录验证及验证码识别工具

    随着互联网发展,网站数据变得越来越重要。然而,为了保护其数据的安全性和唯一性,网站通常会采取反爬虫措施。本篇博客将介绍一些常见的反爬虫技巧,并提供代码案例和相关知识点,帮助您更好地应对反爬虫问题。 当我们使用爬虫程序频繁发送请求到同一个网站时,

    2024年02月12日
    浏览(50)
  • 爬虫笔记--Selenium实现有验证码网站模拟登录

    代码如下: 一点说明: 安利个巨好用的识别验证码的库 ddddocr gitHub:https://github.com/sml2h3/ddddocr 可能会在版本上遇到问题,我的报错参考这篇文档解决:https://blog.csdn.net/zhuchengchengct/article/details/124854199 我用的版本作为参考:python是3.9.13,ddddocr是1.4.2 如有问题,欢迎大家批评

    2024年02月16日
    浏览(44)
  • selenium+python操作cookie绕过登录

    selenium操作cookie的方法包括: 获取cookies:get_cookies();获取指定name的cookie值:get_cookie(name);删除所有cookie:delete_all_cookies();删除指定name的cookie值:delete_cookie(name);添加cookie:add_cookie(cookie_dict) 。通常可以使用cookie绕过包含验证码的登录请求,但需要事前先通过抓包等手段获取

    2024年02月15日
    浏览(44)
  • python selenium chrome 指定下载位置并绕过人机验证

    目前碰见需要绕过 chrome 人机验证的下载,采用 selenium 的方式进行下载 需要解决的问题: 直接使用 selenium 会被人机验证识别 下载文件需要指定下载位置,从网上找的大部分参数配置测试都不可用 selenium 绕过人机验证 用 undetected_chromedriver 代替 selenium 安装:pip install undetec

    2024年02月13日
    浏览(49)
  • Python使用Selenium库如何绕过Cloudflare验证,网页请确认你是不是机器人

    大家好,我是淘小白~ 前段时间使用selenium库写chatGPT的脚本,遇到过一个问题,那就是cloudflare的机器验证,让你点击确认不是机器人,这个问题最后找人解决掉了,我也是百度了很久没找到答案,B站找到的一个UP主,只要报名人家的课程才会给方法,所以,下面就把这个问题

    2024年02月05日
    浏览(91)
  • Python爬虫教程:Selenium模拟登录

    Selenium(本文基于python3.8)是一个功能强大的自动化测试工具,它可以用于模拟用户在浏览器中的行为,比如点击、输入、滚动等等,也可用于模拟登录网站并进行爬虫操作。本教程将详细介绍如何使用Python编写一个模拟登录地爬虫,使用XPath等多种元素匹配方法。 在开始之

    2024年02月04日
    浏览(48)
  • Python爬虫-使用Selenium模拟百度登录

        前面我已经安装好了Selenium并模拟成功了一下打开百度页面并进行查询,让我这个python初学者信心倍增,今天再来试一试百度登录 把打开百度的代码放到构造方法中 ps:那个文件目录是用于后面滑块验证图片保存的。 点击右上角的“登录”按钮,打开登录框, 代码如下:

    2024年02月06日
    浏览(57)
  • Python利用Selenium实现自动化验证登录

    Python里面使用Selenium是一个很重要的自动化测试模块,我们可以用它写一个验证登录脚本,有了这个可以用来保存cookie信息等,下面是一个简单的demo:

    2024年02月15日
    浏览(46)
  • python爬虫-使用selenium自动登录微博

    环境准备:anaconda、pycharm编辑器、chromedriver(记得下载) 首先查看本地anaconda的python环境和selenium版本号(不同版本的api接口可能不同) 输出 我的python版本是3.11.3,所以我默认下载的selenium版本号是 selenium 4.11.2 自动登录的python脚本代码如下: 最后运行这个脚本文件即可自动登录微

    2024年02月11日
    浏览(39)
  • python+selenium实现12306抢票

    1、要先下载相关的包,selenium、interval。最好使用国内清华源 2、还要下载对应浏览器的驱动: 2.1 安装chromedriver 谷歌浏览器驱动的网址为link 注意:谷歌浏览器的驱动版本要匹配谷歌浏览器的版本 随机点击一个版本: 点击notes.txt 2.2 安装FireFox驱动(我用的是这个) 火狐驱动

    2024年02月01日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包