python模拟火车订票系统_如何用python编写火车抢票助手

前几天跟朋友说打算写一个抢票助手,最后由于某些原因念头打消了。

可就在昨天晚上,才隐约记起一年前的自己曾经说过:一年后我一定要写一个12306的抢票助手!瞬间激情澎湃,甚至已经是快临近凌晨时便开始动工,可天意不能违,12306晚上11点便开始维护,后续阶段程序不得不暂停;只能今天继续完成最后一部分,幸好自己进度还是可以的,刚刚debug完毕就给大家分享一下!

开头肯定是老套路

首先我们要安装python的编译环境,推荐使用python3.6(本文章使用的是python3);

python下载安装网址:https://www.python.org/

安装python的第三方工具库selenium

selenium是Web

应用程序自动化测试工具,可模拟人为操作实现自动化的强大的工具库

第二步:

下载chrome自动化驱动,链接:

http://chromedriver.storage.googleapis.com/index.html

chrome自动化驱动与chrome浏览器版本是有相对应的版本;chrome浏览器最新版本对应驱动版本2.35

具体驱动与浏览器版本映射表查看链接:

http://blog.csdn.net/huilan_same/article/details/51896672

第三步:进入主题,编写代码

引入库文件

from selenium import webdriver from selenium.webdriver.common.keys import Keys import time

编写主要代码

us=input('请输入12306账号:')

pw=input('请输入12306密码:')

fromStation=input('请输入出发站点:')

toStation=input('请输入目的站点:')

date=input('请输入出发时间(格式:2018-02-02):')

umber=input('请输入列车号(区别大小写):')

passenger=input('请输入乘车人姓名(格式:姓名(学生)或者姓名):')

driver=webdriver.Chrome()#加载chrome驱动 login(us,pw)#登录 query()#查询 buyTicket()#抢票 confirm()#购票

乘车人姓名要预先在12306网址上存在,并且要按红色方框内容填写

e896bf0478f1b6992c18abea04e2bffb.png

编写一个判断xpath是否存在的函数XpathExist(driver,xpath)

def XpathExist(driver,xpath):    """

检查xpath是否存在

:param driver,xpath:

:return:

"""    try:

driver.find_element_by_xpath(xpath)#若不存在会抛出异常        return True    except:

return False

编写登录12306函数login(us,pw)

#12306登录 def login(us,pw):    driver.get("https://kyfw.12306.cn/otn/login/init")#打开网址    username= driver.find_element_by_xpath('//*[@id="username"]')#获取用户名的位置    password=driver.find_element_by_xpath('//*[@id="password"]')#获取密码的位置    username.send_keys(us)#输入用户名    password.send_keys(pw)#输入密码    while True:

#链接跳转则,登录成功        if driver.current_url=='https://kyfw.12306.cn/otn/index/initMy12306':

break

编写12306查询函数query()

难点:主要就在输入出发站跟目的站,12306反爬技术很强大,自己在这里调试了两个小时,最后发现要先点击一下,再清除内容,再输入内容,再按键盘Down键,最后再按tab键才可以;时间则要用js处理。

855efa28f6082b111128c54b822ad1f5.png

#12306查询 def query():    driver.get('https://kyfw.12306.cn/otn/leftTicket/init')#打开网址    fromStationText=driver.find_element_by_xpath('//*[@id="fromStationText"]')#获取出发点的位置    toStationText=driver.find_element_by_xpath('//*[@id="toStationText"]')#获取目的地的位置    #要先点击一下,在清楚输入框的内容,再输入内容,再按键盘Down键,最后再按tab键    fromStationText.click()

fromStationText.clear();

fromStationText.send_keys(fromStation)

fromStationText.send_keys(Keys.DOWN)

fromStationText.send_keys(Keys.TAB)

toStationText.click()

toStationText.clear();

toStationText.send_keys(toStation)

toStationText.send_keys(Keys.DOWN)

toStationText.send_keys(Keys.TAB)

#用js输入时间    js="document.getElementById('train_date').value='"+date+"'"    driver.execute_script(js)

time.sleep(1)#等待1s    while True:

xpath='//*[@id="query_ticket"]'        if XpathExist(driver,xpath):

try:

driver.find_element_by_xpath(xpath).click()#点击查询按钮                print("查询中...")

break            except:

continue

抢票函数buyTicket()

#抢票 def buyTicket():    while True:

try:

xpath="//a[text()='"+number+"']/../../../../../td[13]/a"            if driver.current_url=='https://kyfw.12306.cn/otn/confirmPassenger/initDc':

break            if XpathExist(driver,xpath):

order=driver.find_element_by_xpath(xpath)

order.click()

print("抢票中...")

else:

xpath='//*[@id="query_ticket"]'                if XpathExist(driver,xpath):

try:

driver.find_element_by_xpath(xpath).click()

except:

print("重新点击")

except:

continue

确认购票confirm()

#确认购票 def confirm():    while True:

try:

xpath='//*[@id="content_defaultwarningAlert_hearder"]/a'            if XpathExist(driver,xpath):

driver.find_element_by_xpath(xpath)

print(driver.find_element_by_xpath(xpath))

else:

xpath='//label[text()="'+passenger+'"]'                while True:

try:

driver.find_element_by_xpath(xpath).click()

break                    except:

continue                xpath='//*[@id="dialog_xsertcj_ok"]'                if XpathExist(driver,xpath):

print("确认弹出窗口中...")

while True:

try:

driver.find_element_by_xpath(xpath).click()

break                        except:

break                xpath='//*[@id="content_defaultwarningAlert_title"]'                if XpathExist(driver,xpath):

print('目前没票')

else:

print("点击成功")

driver.find_element_by_xpath('//*[@id="submitOrder_id"]').click()

while True:

try:

if driver.current_url!='https://kyfw.12306.cn/otn/confirmPassenger/initDc':

print("抢票成功,请及时付款")

break                            xpath='//*[@id="orderResultInfo_id"]/div/span'                            if XpathExist(driver,xpath):

print('抢票失败')

break                            driver.find_element_by_xpath('//*[@id="qr_submit_id"]').click()

except:

continue                    break        except:

continue

由于想到这几天大家要开始第一轮抢票模式,所以刚刚写完的程序,没有经过大量测试,我便匆匆忙忙发布上来供大家分享;如果在使用中发现有bug,欢迎在本公众号后台留言,我会及时的处理!

为了不懂编程的小伙伴,同时我也对应发布了可执行的exe文件。

祝大家抢票成功!

本文内容转载自网络,本着传播与分享的原则,来源/作者信息已在文章顶部表明,版权归原作者所有,如有侵权请联系我们进行删除!

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

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

相关文章

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html

Yolo系列-yolov3

YOLO-V3 这张图讲道理真的过分了!!!我不是针对谁,在座的各位都是 终于到V3了,最大的改进就是网络结构,使其更适合小目标检测特征做的更细致,融入多持续特征图信息来预测不同规格物体 先验框更丰…

java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架

网络游戏框架简介 ioGame 是一个由 java 语言编写的网络游戏服务器框架。支持 websocket、tcp ,适用于全球同服、回合制游戏、策略游戏、即时战斗等游戏服务器的开发。具有高性能、稳定、易用易扩展、超好编程体验等特点。可做为 H5、手游、端游的 java 游戏服务器…

游戏服务器架构通识

前言 这节讲座里,我们将从游戏服务器发展的简单历程出发,鸟瞰一下目前大多数的游戏服务器架构。 这里尽可能的避免陷入细节的技术问题,而是从技术进化的结果状态,反推原始问题是什么。希望能通过这个过程,解释清楚游戏…

游戏服务器架构设计整理

文章目录 前言一、单进程多线程的服务器设计模式,只有一个进程,但一个进程包好多个线程二、多进程单线程的服务器设计模式,多个进程,每个进程只有一个线程1.早期的MMORPG服务器结构2.中期-用户分离集群式3.中后期数据分离集群式4.…

游戏服务器被攻击了怎么办?

随着互联网的发展,网民数量激增,电子游戏的普及,庞大的玩家数量必然推动游戏市场发展。游戏受到攻击是游戏开发者的痛点,DDOS攻击是流量攻击的一个总称,还包括SYN Flood、ACK Flood、UDP Flood、TCP Flood、ICMP Flood…

经典游戏服务器端架构

文章目录 一、 讨论的背景二、 游戏服务器架构的要素三、核心的三个架构四、 游戏服务器模型的进化历程五、分服模型1.模型描述2.调度架构1.单进程游戏服务器2.多进程游戏服务器 3.内存架构1.动态内存2.预分配内存 4.进程间通讯手段1.Socket通讯2.消息队列3.远程调用 5.容灾和扩…

哪家的云游戏服务器好?如何选择云游戏服务器?

现如今,不少行业领域都对云服务器有不少的需求,尤其是游戏行业,需要专门的云游戏服务器。目前市场上的云游戏服务器有很多种类型,那么,哪家的云游戏服务器好呢?如何选择云游戏服务器?下面就跟着…

游戏开发商如何租用合适稳定的游戏服务器?

随着互联网的快速发展,网络游戏的发展令人目不暇接。有些游戏开发商在开发游戏时,对游戏服务器的要求非常高,毕竟一款游戏最重要的是流畅度。如果大量用户在玩游戏,而游戏直接因为服务器的宕机而崩溃,这种体验可能会直…

游戏服务器开发

1 2-课程概述 https://www.bilibili.com/video/BV1Ks41177oi?fromsearch&seid5543458349378694564nodejs lua STL IO 语言方面 精简 不像Python 无统一 游戏服务器 工作量 不是 网络连接 是 逻辑的 实现 定义 一个 struct 有两个成员 指针 和 值 …

从零开始搭建游戏服务器 第一节 创建一个简单的服务器架构

目录 引言技术选型正文创建基础架构IDEA创建项目添加Netty监听端口编写客户端进行测试 总结 引言 由于现在java web太卷了,所以各位同行可以考虑换一个赛道,做游戏还是很开心的。 本篇教程给新人用于学习游戏服务器的基本知识,给新人们一些…

鹅厂公开课:游戏服务器,了解一下?

讲师简介:张正,腾讯互娱北极光工作室群专家工程师,拥有12年游戏后台开发经验,主导和参与了《天涯明月刀》、《轩辕传奇》等自研大型MMORPG项目的后台开发,现担任《天涯明月刀》项目后台技术总监,北极光后台…

游戏服务器的那些事儿

游戏程序开发有两个大方向,包括前端和后端。其中,前端是指客户端方面,包括PC、手机和平板上面的可视化图形技术。后端则偏向于服务器,即用户不可见的部分。本文将通过游戏服务器的起源、功能特点、分类和发展历史,以及…

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 🎈 模型网站🎈 仿真系列🎈 国风系列🎈 卡通动漫系列🎈 3D系列🎈 一些好用的lora模型 🎈 模型网站 由于现在大模型超级多,导致每种画风的模型太多,那么如何选择最…

通达信形态匹配选股,不会编写指标公式也可以形态选股

编写指标公式匹配技术形态难度比较高,公式也很复杂,新手往往难以掌握,即使是老手也常常感到困难。之前编写了N字形态、W底(双底)、头肩底,虽然成功完成,但工作量巨大,公式理解起来也…

python函数学习

def add(num1,num2):resultnum1num2print(f"函数add输出的结果是{result}")return result resultadd(int(num1), int(num2)) print(f"调用def add(num1,num2):这个函数最终返回的结果是: {result}")# 函数返回值 ②无返回值(也就是说是返回值类…

【python】python智能停车场数据分析(代码+数据集)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Linux驱动之platform设备驱动

目录 前言 一、Linux驱动的分离与分层 二、开发环境 三、驱动程序编写 3.2 platform 驱动模块程序 3.3 测试app程序 四、运行测试 4.1 编译 4.2 运行测试 前言 前面几章编写的设备驱动都非常的简单,都是对 IO进行最简单的读写操作。像 I2C、SPI、 LCD 等这…

嵌入式系统启动文件及其流程的理解

简单概括总结嵌入式上电启动顺序 启动第1步:加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、…

python使用win32库模拟拖拽文件发给指定窗口

最近要用python模拟人的操作给窗口发送拖拽文件的消息,网上搜了一大圈也没搜到现成可用的代码。幸好以前做过vc开发,熟悉点win32编程,于是装上vs和msdn,从消息WM_DROPFILES查起,慢慢得实现了这个功能。 WM_DROPFILES是…