2023年12306购票平台自动化购票终|解决乘客选择与车票提交(附自动化购票完整源代码与演示视频)

news2024/11/27 16:40:35

目录

一、说明

1.1、背景

1.2、说明

二、步骤

2.1、切换视角检索乘车乘客

2.2、选择乘客

2.3、关闭学生票选择界面

2.4、提交订单

2.5、选择座位并确认

三、完整代码与视频演示

3.1、完整源代码如下

3.2、视频演示代码运行

四、结果

4.1、代码运行结果

五、总结与完善

5.1、总结

5.2、完善


一、说明

1.1、背景

接前面一、二部分解决抢不到票的问题,本部分解决乘客选择与车票提交问题,并完整完成自动化购票功能。

1.2、说明

操作系统:win 10

编辑器:pycharm edu

语言及版本:python 3.10

使用的库:selenium

实现思路:使用selenium模拟人的行为,进行自动化操作

关于代码:完整代码已放出

第一部分内容-->已解决登录问题

第一部分内容链接:第一部分内容

第二部分内容-->已解决车次查找与预定车次问题

第二部分内容链接:第二部分内容

浏览器下载与驱动的安装:火狐浏览器下载与驱动下载

浏览器闪退说明:大概率是因为下载的浏览器和浏览器驱动版本不一致,建议使用搜索引擎查找大佬分享的内容解决

tips:以下url不会放真实的,拿来测试注意识别并自行更改。

二、步骤

当前界面默认进入乘客选择界面,因为之前的内容已经进入到该界面了。

2.1、切换视角检索乘车乘客

需要先把这个提示内容去掉,在输入需要购买车票的乘客名字进行检索,如下图1;

    # 进入订单界面,切换视角
    driver.switch_to.window(driver.window_handles[-1])
    time.sleep(3)  # 给加载时间
    # 进入乘客选择
    driver.find_element(By.XPATH, '//*[@id="quickQueryPassenger_id"]').click()  # 先点击,把提示内容去除
    driver.find_element(By.XPATH, '//*[@id="quickQueryPassenger_id"]').send_keys("乘客名字")  # 输入乘客姓名

 图1

2.2、选择乘客

乘客检索出来后,进行乘客的选择,如下图2;

    time.sleep(0.5)  # 给加载时间
    driver.find_element(By.XPATH, '//*[@id="normalPassenger_0"]').click()  # 选择乘客

 图2

2.3、关闭学生票选择界面

选择乘客后,如果是学生会出现学生票购买提示页面,需要关闭这个页面,如下图3;

    time.sleep(2)  # 给加载时间
    driver.find_element(By.XPATH, '//*[@id="dialog_xsertcj_cancel"]').click()  # 关闭学生票选项

图3

2.4、提交订单

一切准备就绪,可以进行提交订单了,如下图4;

    driver.find_element(By.XPATH, '//*[@id="submitOrder_id"]').click()  # 提交订单

 图4

2.5、选择座位并确认

座位选择的是F靠窗位置,座位不选择直接提交订单,随机座位也是可以的;

    # 选择座位,这里选择的是靠窗的F座位,不选择座位也是可以的
    driver.find_element(By.XPATH, '//*[@id="1F"]').click()
    # 点击确认订单
    driver.find_element(By.XPATH, '//*[@id="qr_submit_id"]').click()

三、完整代码与视频演示

3.1、完整源代码如下

from selenium.webdriver import Firefox  # 导入火狐
from selenium.webdriver.common.action_chains import ActionChains  # 导入时间链
from selenium.webdriver.common.by import By  # 导入需要的组件
from selenium.webdriver.common.keys import Keys


import time


def login_shop():
    login_url = "这里是12306登录的url"  # 登录界面url
    trains = ['G4362', 'K1208']  # 这里是你要购买票的车次名称

    driver = Firefox()
    driver.get(login_url)

    script = 'Object.defineProperty(navigator,"webdriver",{get:()=>false,});'
    driver.execute_script(script)

    driver.find_element(By.XPATH, '//*[@id="J-userName"]').send_keys("你的账户")
    driver.find_element(By.XPATH, '//*[@id="J-password"]').send_keys("你的密码")
    driver.find_element(By.XPATH, '//*[@id="J-login"]').click()
    time.sleep(5)
    push_btu = driver.find_element(By.XPATH, '//*[@id="nc_1_n1z"]')
    # 拖动滑块后,会跳转新窗口                     //*[@id="nc_1_n1z"]

    ActionChains(driver).drag_and_drop_by_offset(push_btu, 300, 0).perform()
    # 切换到新窗口
    driver.switch_to.window(driver.window_handles[-1])
    time.sleep(3)
    # 刷新
    driver.refresh()
    time.sleep(3)
    # 在新窗口点击前往订票,又会跳转到新窗口
    driver.find_element(By.XPATH, '//*[@id="link_for_ticket"]').click()
    # 这里也生成了一个新窗口,需要切换
    driver.switch_to.window(driver.window_handles[-1])
    time.sleep(5)
    # 出发地
    driver.find_element(By.XPATH, '//*[@id="fromStationText"]').click()
    driver.find_element(By.XPATH, '//*[@id="fromStationText"]').send_keys("深圳北", Keys.ENTER)
    # 目的地
    driver.find_element(By.XPATH, '//*[@id="toStationText"]').click()
    driver.find_element(By.XPATH, '//*[@id="toStationText"]').send_keys("百色", Keys.ENTER)
    # 日期,先清除默认内容,在输入
    driver.find_element(By.XPATH, '//*[@id="train_date"]').click()
    driver.find_element(By.XPATH, '//*[@id="train_date"]').clear()
    driver.find_element(By.XPATH, '//*[@id="train_date"]').send_keys("2023-01-20")
    # 点击查询
    driver.find_element(By.XPATH, '//*[@id="query_ticket"]').click()
    # 保存加载出来的车次信息,并进行筛选判断
    time.sleep(6)  # 确保页面内容加载完成
    # print(driver.current_url)
    tr_list = driver.find_elements(By.XPATH, ".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
    #                                            //*[@id="queryLeftTable"]
    for tr in tr_list:  # 遍历所有车次信息
        train_number = tr.find_element(By.CLASS_NAME, "number").text  # 车次
        print(train_number)
        if train_number in trains:  # 如果该车次在输入的车次里
            left_ticker_td = tr.find_element(By.XPATH, './/td[4]').text
            if left_ticker_td == '有' or left_ticker_td.isdigit():  # 如果该车次有票
                print(train_number+'有票')
                btn72 = tr.find_element(By.CLASS_NAME, 'btn72')  # 找到该车次的预订按钮
                btn72.click()
                break  # 这里点击了之后一定要退出,否则程序继续循环会导致报错
    # 进入订单界面,切换视角
    driver.switch_to.window(driver.window_handles[-1])
    time.sleep(3)  # 给加载时间
    # 进入乘客选择
    driver.find_element(By.XPATH, '//*[@id="quickQueryPassenger_id"]').click()  # 先点击,把提示内容去除
    driver.find_element(By.XPATH, '//*[@id="quickQueryPassenger_id"]').send_keys("乘客名称")  # 输入乘客姓名
    time.sleep(0.5)  # 给加载时间
    driver.find_element(By.XPATH, '//*[@id="normalPassenger_0"]').click()  # 选择乘客
    time.sleep(2)  # 给加载时间
    driver.find_element(By.XPATH, '//*[@id="dialog_xsertcj_cancel"]').click()  # 关闭学生票选项
    driver.find_element(By.XPATH, '//*[@id="submitOrder_id"]').click()  # 提交订单
    # 选择座位,这里选择的是靠窗的F座位,不选择座位也是可以的
    driver.find_element(By.XPATH, '//*[@id="1F"]').click()
    # 点击确认订单
    driver.find_element(By.XPATH, '//*[@id="qr_submit_id"]').click()

if __name__ == '__main__':
    login_shop()

3.2、视频演示代码运行

视频已经制作好了,但是有些奇怪不知道为啥电脑接收不了,所以就不上传了,需要视频请在评论区评论或者私聊我。

四、结果

4.1、代码运行结果

如下图5:

图5

五、总结与完善

5.1、总结

1)将一个大问题分析若干部分解决,将会变得轻松;

2)多学习;

5.2、完善

1)在以上的代码中用到了很多延时来确保页面可以加载成功,导致抢票慢,那么如何改进呢?

有两个库可以解决这个问题;

from selenium.webdriver.support.ui import WebDriverWait  # 条件等待
from selenium.webdriver.support import expected_conditions  # 导入判断条件

加入限定条件,确保页面加载完成了在进行下一步代码的执行,就不需要一直time.sleep了;

2)我们简陋的程序如何能抢得过各大抢票平台呢?

使用服务器进行代码的持续运行,增加购票成功的几率;

3)我们代码只能进行单次的抢票,如何进行多次抢票呢?

使用循环,或者其它条件,指定时间就执行一次代码,进行查票购票等操作即可;

4)买到票之后,只有10分钟的付款时间,抢到票如何进行快速通知呢?

Python实现用QQ邮箱发邮件进行提醒等;

总之,购票平台的自动化购票对我而言是一次很好的锻炼,以上内容是粗略记录该过程,之后更加完善自动化购票功能在进行分享,欢迎批评指正;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows获取iOS设备信息

依赖环境: 1.python3.6以上版本, 2.配置python的系统环境变量。 3.python已经安装pip。 安装tidevice: 1.打开cmd,输入命令pip3 install -U "tidevice[openssl]"如图所示,安装成功。 2.查看tidevice版本号&#xff0c…

网络超火的音效素材、BGM,全在这里了。

推荐几个超好用的音效素材网站,全网火爆的音效、BGM这里都能找到,自媒体、视频剪辑小伙伴必备!建议收藏! 1、菜鸟图库 https://www.sucai999.com/audio.html?vNTYwNDUx 菜鸟图库是一个综合性素材网站,站内涵盖设计、…

vector模拟实现之迭代器失效及深浅拷贝的问题

vector模拟实现 Tips:new申请空间不用判断,因为失败的话会抛异常。 STL源代码中vector的私有成员变量如下: private:iterator _start;//首元素iterator _finish;//最后一个有效数据的下一个,-_start为sizeiterator _endofstora…

6-3分布散度的9个梯度

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点,AB各由9张二值化的图片组成,排列组合A和B的所有可能性,固定收敛误差为7e-4,统计收敛迭代次数,并比较迭代次数的变化规律。 差值结构 A-B 迭代次数 …

Huawei Matebook X Pro 2018 Space Gray电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板Huawei Matebook X Pro 2018 Space Gray处理器Intel Core i7-8550U已驱动内存16 GB LPDDR4 2133 MHz已驱动硬盘LiteON SSD PCIe NVMe 512 GB [CA3-8D512]已驱动显卡NVIDIA GeForce MX150 (Disabled) / Intel(R) UHD Graphics 620已驱动声卡瑞昱ALC256 英特…

微积分——导数和切线问题

目录 1. 切线(Tangent Line)问题 2. 函数的导数(derivative) 3. 函数的可微性(differentiability)与连续性(Continuity) 1. 切线(Tangent Line)问题 微积分的出现源于17世纪欧洲数学家们正在研究解决的四个主要的问题: (1) 切线(tangent line)问题&#xf…

使用Alexnet实现CIFAR10数据集的训练

如果对你有用的话,希望能够点赞支持一下,这样我就能有更多的动力更新更多的学习笔记了。😄😄 使用Alexnet进行CIFAR-10数据集进行测试,这里使用的是将CIFAR-10数据集的分辨率扩大到224X224,因为在测试…

第03讲:Docker 容器的数据卷

一、什么是数据卷 数据卷是宿主机中的一个目录或文件,当容器目录或者文件和数据卷目录或者文件绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷,数据卷的作用:容器数据…

基于遥感卫星影像水体提取方法综述

水体提取分类依据及基础 水体提取分类依据 水体提取的方法很多,很多学者也进行了分类,大体上有一个分类框架,主要是基于光学影像的分类,比如王航等[7]将水体提取分成3类,分别是基于阈值法、分类器法和自动化法; 李丹等[8]更深一步进行总结,引入近些年发展火热的基于雷达影像数…

Redisson自定义序列化

配置RedissonClientBean public RedissonClient redissonClient() {Config config new Config();// 单节点模式SingleServerConfig singleServerConfig config.useSingleServer();singleServerConfig.setAddress("redis://127.0.0.1:6379");singleServerConfig.set…

LeetCode二叉树经典题目(六):二叉搜索树

目录 28. LeetCode617. 合并二叉树 29. LeetCode700. 二叉搜索树中的搜索 30. LeetCode98. 验证二叉搜索树 31. LeetCode530. 二叉搜索树的最小绝对差 32. LeetCode501. 二叉搜索树中的众数 33. LeetCode236. 二叉树的最近公共祖先​ 28. LeetCode617. 合并二叉树 递归&…

Hi3861鸿蒙物联网项目实战:智能安防报警

华清远见FS-Hi3861开发套件,支持HarmonyOS 3.0系统。开发板主控Hi3861芯片内置WiFi功能,开发板板载资源丰富,包括传感器、执行器、NFC、显示屏等,同时还配套丰富的拓展模块。开发板配套丰富的学习资料,包括全套开发教程…

Windows11 系统打开IE浏览器的方式(完整版)

前言 大家好,好久不见! 1、最近疯狂加班,旧电脑不太给力,换了新电脑,嘎嘎开心;开心之余发现新电脑是Win11系统的,但是IE浏览器找不到了,由于我的某些工作需要用到IE浏览器&#xf…

Vue2前端路由(vue-router的使用)、动态路由、路由和视图的命名以及声明式和编程式导航

目录 一、vue2的前端路由(vue-router) 1、路由:页面地址与组件之间的对应关系 2、路由方式:服务器端路由、前端路由 3、前端路由:在前端维护一组路由规则(地址和组件之间的对应关系)&#xf…

【UE4 第一人称射击游戏】34-制作一个简易计时器

上一篇:【UE4 第一人称射击游戏】33-创建一个迷你地图本篇效果:可以看到左上角有个简易的关卡计时器在倒计时步骤:打开“FPSHUD”,拖入一个图像控件图像选择“Timer_Backing”,尺寸改为4719拖入3个文本控件大小为1210字…

学习ffmpeg-录屏实现记录

项目需要一个录屏的功能,之前看到了一个使用Qt计时器截图avilib生成AVIffmpeg合并视频音频的方式:Qt C 录屏录音功能实现(avilibffmpeg)以及动态库生成https://blog.csdn.net/qq_35769071/article/details/125323624使用后&#x…

【.dll 没有被指定在windows上运行】

修复(重新注册DLL)的具体步骤如下: 方法一: 1、快捷键winr打开“运行”输入cmd,点击确定打开命令提示符窗口。 2、复制:for %1 in (%windir%\system32*.dll) do regsvr32.exe /s %1 命令,在打开的管理员…

ubuntu安装vue

首先建议使用ubuntu18.04以上的系统,不然会有类似fcntlGLIBC_2.28‘未定义的引用的报错 VUE官网:http://caibaojian.com/vue/guide/installation.html 其中安装说明只写到:npm install vue 我们还需要安装node.js、npm 1、安装 NVM&#xf…

Windows安装TensorRT

文章目录前言TensorRT下载TensorRT安装参考资料前言 本文将介绍Windows如何安装TensorRT。本文的基础是:Windows安装PytorchCUDA环境 TensorRT下载 进入官方网站:https://developer.nvidia.com/nvidia-tensorrt-8x-download 寻找自己对应的版本&#…

RabbitMQ之Work Queue(工作队列)

前言:大家好,我是小威,24届毕业生,曾经在某央企公司实习,目前在某税务公司。本篇文章将记录和分享RabbitMQ工作队列相关的知识点。 本篇文章记录的基础知识,适合在学Java的小白,也适合复习中&am…