【使用python+selenium实现12306的自动登录及购票】

2023-10-26

一、流程介绍
1. 访问登录页面
  在此页面输入用户名及密码后,点击立即登录。在这里插入图片描述
注意事项:
  一些网站在使用Selenium时会有前端检测,为了避免这种检测,需要对ChromeOptions进行设置,通过调用add_argument方法添加参数–disable-blink-features。
代码实现:

options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')  # 避免webdriver检测

driver = webdriver.Chrome(options=options)    # Chrome浏览器
driver.set_window_size(1080, 800);
driver.implicitly_wait(10);

# 打开网页
driver.get("https://kyfw.12306.cn/otn/resources/login.html")
user = driver.find_element_by_id("J-userName");
user.click();
user.send_keys("xxxxxxxx");
pswd = driver.find_element_by_id("J-password");
pswd.click();
pswd.send_keys("xxxxxxxx");
butten = driver.find_element_by_id("J-login");
butten.click();
time.sleep(1);

2.选择验证方式
在这里插入图片描述
注意事项:
  这里的拖拽需要通过 ActionChains来实现。ActionChains用来模拟鼠标操作,比如单击、双击、点击鼠标右键、拖拽等等。
代码实现:

while True:
    try:
        span = driver.find_element_by_id("nc_1_n1z")
        actions = ActionChains(driver)  # 行为链实例化
        time.sleep(1)  # 等待2秒钟
        # 经截图测量,滑块需要滑过的距离为300像素
        actions.click_and_hold(span).move_by_offset(300, 0).perform()  # 滑动
        actions.release();
        time.sleep(1);
        a = driver.find_element_by_id("nc_1_refresh1");# 查找刷新按钮,如果没有说明登录成功,执行except跳出循环
        a.click();# 如果刚刚滑动失败,则点击刷新,重新滑动
    except Exception as e:
        print(e);
        break;

3.关闭提示框,点击“车票预订”链接,跳转至车票预订页面**
在这里插入图片描述在这里插入图片描述
代码实现:

sure = driver.find_element_by_class_name("btn-primary");
sure.click();
link_for_ticket = driver.find_element_by_id("link_for_ticket");
link_for_ticket.click();

4.设置出发地、目的地、出发日、车次类型等信息
在这里插入图片描述
代码实现:

driver.find_element_by_id("fromStationText").click();
driver.find_element_by_css_selector(u"[title=长沙]").click();
driver.find_element_by_id("toStationText").click();
driver.find_element_by_css_selector(u"[title=北京]").click();
time.sleep(5);
train_date = driver.find_element_by_id("train_date");
train_date.clear();
tomorrow = (date.today() + timedelta(days= 1)).strftime("%Y-%m-%d")
train_date.send_keys(tomorrow);
driver.find_element_by_css_selector("#_ul_station_train_code > li:nth-child(1) > label").click()

5.点击“预订”,选择乘车人,完成购票
在这里插入图片描述
代码实现:

while True:
    try:
        driver.find_element_by_id("query_ticket").click();
        driver.find_element_by_xpath("/html/body/div[3]/div[7]/div[8]/table/tbody[1]/tr[1]/td[13]").click();
        time.sleep(3);
        driver.find_element_by_id("normalPassenger_0").click();
        driver.find_element_by_id("submitOrder_id").click();
        driver.find_element_by_link_text("确认").click();
    except:
        pass;

二、完整代码

import time
from datetime import date, timedelta
from selenium import webdriver
from selenium.webdriver import ActionChains

options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')  # 避免webdriver检测

driver = webdriver.Chrome(options=options)    # Chrome浏览器
driver.set_window_size(1080, 800);
driver.implicitly_wait(10);

# 打开网页
driver.get("https://kyfw.12306.cn/otn/resources/login.html")
user = driver.find_element_by_id("J-userName");
user.click();
user.send_keys("xxxxxxx");
pswd = driver.find_element_by_id("J-password");
pswd.click();
pswd.send_keys("xxxxxxx");
butten = driver.find_element_by_id("J-login");
butten.click();
time.sleep(1);

while True:
    try:
        span = driver.find_element_by_id("nc_1_n1z")
        actions = ActionChains(driver)  # 行为链实例化
        time.sleep(1)  # 等待2秒钟
        # 经截图测量,滑块需要滑过的距离为300像素
        actions.click_and_hold(span).move_by_offset(300, 0).perform()  # 滑动
        actions.release();
        time.sleep(1);
        a = driver.find_element_by_id("nc_1_refresh1");# 查找刷新按钮,如果没有说明登录成功,执行except跳出循环
        a.click();# 如果刚刚滑动失败,则点击刷新,重新滑动
    except Exception as e:
        print(e);
        break;

sure = driver.find_element_by_class_name("btn-primary");
sure.click();

link_for_ticket = driver.find_element_by_id("link_for_ticket");
link_for_ticket.click();
driver.find_element_by_id("fromStationText").click();
driver.find_element_by_css_selector(u"[title=长沙]").click();
driver.find_element_by_id("toStationText").click();
driver.find_element_by_css_selector(u"[title=北京]").click();
time.sleep(5);
train_date = driver.find_element_by_id("train_date");
train_date.clear();

tomorrow = (date.today() + timedelta(days= 1)).strftime("%Y-%m-%d")
train_date.send_keys(tomorrow);
driver.find_element_by_css_selector("#_ul_station_train_code > li:nth-child(1) > label").click()

while True:
    try:
        driver.find_element_by_id("query_ticket").click();
        driver.find_element_by_xpath("/html/body/div[3]/div[7]/div[8]/table/tbody[1]/tr[1]/td[13]").click();
        time.sleep(3);
        driver.find_element_by_id("normalPassenger_0").click();
        driver.find_element_by_id("submitOrder_id").click();
        driver.find_element_by_link_text("确认").click();
    except:
        pass;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【使用python+selenium实现12306的自动登录及购票】 的相关文章

  • QSortFilterProxyModel + QAbstractItemModel modelIndex.internalPointer() 导致崩溃

    我在 PyQt 4 8 Python 2 7 中实现了自己的 QAbstractItemModel class FriendListModel QtCore QAbstractItemModel def init self groups c
  • 更改 Inkscape 的 Python 解释器

    在使用 Inkscape 时 我不断收到错误 这似乎意味着未满足 python 2 vs 3 的期望 尽管我已经安装了它们 例如 当我尝试从模板生成新文档时 我得到 Traceback most recent call last File
  • 错误只有 size-1 数组可以转换为 Python 标量

    我有这个代码 for a in data X for i in a if not i isdigit x hash i data X column row x row row 1 row 0 column column 1 desired
  • #文档是什么意思?

    这是我的 HTML 文件 我正在尝试使用Selenium Webdriver API随着Chrome驱动程序 to send keys to an input归档内 但我无法访问其中的任何内容 document 我不明白为什么 有人可以告诉
  • 按 ListProperty (NDB) 对查询进行排序

    如何按 ListProperty 对查询进行排序 该模型 class Chapter ndb Model title ndb StringProperty required True version ndb IntegerProperty
  • Python中#和"""注释的区别

    开始用 Python 编程 我看到一些带有注释的脚本 and comments 这两种评论方式有什么区别 最好的事情就是阅读PEP 8 Python 代码风格指南 https www python org dev peps pep 0008
  • 同情因子简单关系

    我在 sympy 中有一个简单的因式分解问题 无法解决 我在 sympy 处理相当复杂的积分方面取得了巨大成功 但我对一些简单的事情感到困惑 如何得到 phi 2 2 phi phi 0 phi 0 2 8 因式分解 phi phi 0 2
  • 运行源代码中包含 Unicode 字符的 Python 2.7 代码

    我想运行一个在源代码中包含 unicode utf 8 字符的 Python 源文件 我知道这可以通过添加评论来完成 coding utf 8 在一开始的时候 但是 我希望不使用这种方法来做到这一点 我能想到的一种方法是以转义形式编写 un
  • Keras,如何获取每一层的输出?

    我已经用 CNN 训练了一个二元分类模型 这是我的代码 model Sequential model add Convolution2D nb filters kernel size 0 kernel size 1 border mode
  • 在一张图中同时绘制两个截面强度

    我有一个形状数组 512 512 看起来像 行 x 列 y 密度 z 数组的数量 0 012825 0 020408 0 022976 0 015938 0 02165 0 024357 0 036332 0 031904 0 025462
  • Python NLP 英式英语与美式英语

    我目前正在用Python 进行NLP 工作 然而 在我的语料库中 既有英式英语也有美式英语 实现 实现 我正在考虑将英式英语转换为美式英语 但是 我没有找到一个好的工具 包来做到这一点 有什么建议么 我也找不到包 但试试这个 请注意 我必须
  • python 语言环境奇怪的错误。这究竟是怎么回事?

    所以今天我升级到了 bazaar 2 0 2 我开始收到这条消息 顺便说一句 我在雪豹上 bzr warning unknown locale UTF 8 Could not determine what text encoding to
  • keras 预测内存交换无限期增加

    我使用keras实现了一个分类程序 我有一大组图像 我想使用 for 循环来预测每个图像 然而 每次计算新图像时 交换内存都会增加 我尝试删除预测函数内部的所有变量 并且我确信该函数内部存在问题 但内存仍然增加 for img in ima
  • 如何在 Numpy 中实现垃圾收集

    我有一个名为main py 它引用另一个文件Optimisers py它仅具有功能并用于for循环进入main py 这些函数都有不同的优化功能 This Optimisers py然后引用另外两个类似的文件 其中也只有函数 它们位于whi
  • 散景中的时间序列流

    我想在散景中绘制实时时间序列 我只想在每次更新时绘制新的数据点 我怎样才能做到这一点 散景网站上有一个动画情节的示例 但它每次都需要重新绘制整个图片 另外 我正在寻找一个简单的示例 我可以在其中逐点绘制时间序列的实时绘图 散景效果0 11
  • 通过套接字发送字符串(python)

    我有两个脚本 Server py 和 Client py 我心中有两个目标 能够从客户端一次又一次地向服务器发送数据 能够将数据从服务器发送到客户端 这是我的 Server py import socket serversocket soc
  • 从 subprocess.Popen 获取整个输出

    我通过调用 subprocess Popen 得到了一个有点奇怪的结果 我怀疑这与我对 Python 的陌生有很大关系 args cscript USERPROFILE tools jslint js USERPROFILE tools j
  • 带有整数的 np.sqrt 和 where 条件返回错误结果

    当我将 numpy sqrt 方法应用于带有 a 的整数数组时 我得到了奇怪的结果where健康 状况 见下文 对于整数 a np array 1 4 9 np sqrt a where a gt 5 Out 3 array 0 0 5 3
  • 如何在 Python 中解析损坏的 XML?

    我无法影响的服务器发送的 XML 非常损坏 具体来说 Unicode WHITE STAR 将被编码为 UTF 8 E2 98 86 然后使用 Latin 1 转换为 HTML 实体表 我得到的是 acirc 98 86 9 个字节 位于声
  • python IDLE shell 似乎无法正确处理一些转义

    例如 b 退格键打印为四元 在下面的示例中显示为 但是 n 换行是可以的 gt gt gt print abc bd abc d gt gt gt print abc nd abc d 我在 Vista pro python 2 7 下运行

随机推荐