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网址上存在,并且要按红色方框内容填写
编写一个判断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处理。
#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文件。
祝大家抢票成功!
本文内容转载自网络,本着传播与分享的原则,来源/作者信息已在文章顶部表明,版权归原作者所有,如有侵权请联系我们进行删除!
python模拟火车订票系统_如何用python编写火车抢票助手相关推荐
- 用python做一个舆情分析系统_如何用Python做舆情时间序列可视化?
如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...
- python模拟登录qq账号密码_最新的Python模拟登陆QQ脚本,一键批量登录,强行过验证!...
Python模拟QQ批量登陆脚本,以下代码附带解释以便于理解思路. Python代码: #coding=utf-8 import os import time import win32gui impo ...
- 怎样用python搭建简单的系统_如何用Python搭建一个简单的推荐系统?
推荐系统的相关知识我们已在前文中提到,在这篇文章中,我们会介绍如何用Python来搭建一个简单的推荐系统. 本文使用的数据集是MovieLens数据集,该数据集由明尼苏达大学的Grouplens研究小 ...
- 用python做舆情分析系统_如何用Python做舆情时间序列可视化?
如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...
- python在工作中怎么用_如何用python在工作中“偷懒”
原标题:如何用python在工作中"偷懒" "偷懒还能干完活,才是本事 " 有些朋友在工作中会有这样的困惑:明明我从早忙到晚,为什么得到的评价还不高? 要知道, ...
- python如何让图片镜像翻转_如何用 Python 增量备份 Roam Research 笔记图片?
消除后顾之忧,轻松输入卡片笔记. 题图:Photo by Markus Spiske on Unsplash 前些日子,我用视频的方式给你介绍了 Roam Research 这款工具.如果你还没有来得 ...
- python turtle画房子详细解释_如何用python画一个小房子
Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发.Python ...
- python词云有什么用_如何用Python实现词云效果
如何用Python实现词云效果 发布时间:2020-06-06 10:56:57 来源:亿速云 阅读:204 作者:Leah 这篇文章主要为大家详细介绍了用Python实现词云效果的方法,图文详解容易 ...
- python怎样打开加密的文件_如何用Python 加密文件
生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库. 但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而 ...
最新文章
- antv g2字体阴影_antv g2的理解总结
- SSH-CLIENT : gSTM
- python 清华镜像_Anaconda3清华镜像 V5.3.1 最新免费版
- 震惊! Leftmost Digit
- 好系统教你如何在Windows中更改文件夹的图标
- apicloud入门学习笔记1:简单介绍
- 计算机桌面快捷方式误删了,电脑把桌面快捷方式删除了怎么办?电脑快捷方式删除了的恢复方法...
- python import 搜索包路径的机制,以及添加自定义python包的方法
- “飞扬小字典” -- 辅助记忆的小工具
- 网吧游戏二层更新linux,图文细说网吧游戏更新软件【处理手段】
- UiAUtomator基础入门级学习
- DBA的主要工作是什么
- 怎么在线压缩PDF文件?常见途径说明
- Android快速转战Kotlin教程,面试必备
- PMBOK(第六版) 学习笔记 ——《第一章 引论》
- 彭兰 新媒体进阶研究
- Hadoop学习笔记(16)Hive的基本概念、Hive的下载与安装、MySQL数据库下载与安装
- 智能社 - VueJs(1-11章全)
- 螺丝头部及其相关知识点
- 可用驱动精灵备份系统的驱动
热门文章
- boost::system::linux_error相关的测试程序
- boost::safe_numerics模块实现数据类型下溢的测试程序
- boost::lambda::constructor用法的测试程序
- boost::fusion::remove_if用法的测试程序
- boost::date_time模块测试时间分辨率特征
- GDCM:ReadUpToTag的测试程序
- VTK:PolyData之LinearExtrusion
- VTK:绘图之StackedPlot
- VTK:图片之ImageMagnify
- QML中定义JavaScript资源