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

可就在昨天晚上,才隐约记起一年前的自己曾经说过:一年后我一定要写一个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编写火车抢票助手相关推荐

  1. 用python做一个舆情分析系统_如何用Python做舆情时间序列可视化?

    如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...

  2. python模拟登录qq账号密码_最新的Python模拟登陆QQ脚本,一键批量登录,强行过验证!...

    Python模拟QQ批量登陆脚本,以下代码附带解释以便于理解思路. Python代码: #coding=utf-8 import os import time import win32gui impo ...

  3. 怎样用python搭建简单的系统_如何用Python搭建一个简单的推荐系统?

    推荐系统的相关知识我们已在前文中提到,在这篇文章中,我们会介绍如何用Python来搭建一个简单的推荐系统. 本文使用的数据集是MovieLens数据集,该数据集由明尼苏达大学的Grouplens研究小 ...

  4. 用python做舆情分析系统_如何用Python做舆情时间序列可视化?

    如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...

  5. python在工作中怎么用_如何用python在工作中“偷懒”

    原标题:如何用python在工作中"偷懒" "偷懒还能干完活,才是本事 " 有些朋友在工作中会有这样的困惑:明明我从早忙到晚,为什么得到的评价还不高? 要知道, ...

  6. python如何让图片镜像翻转_如何用 Python 增量备份 Roam Research 笔记图片?

    消除后顾之忧,轻松输入卡片笔记. 题图:Photo by Markus Spiske on Unsplash 前些日子,我用视频的方式给你介绍了 Roam Research 这款工具.如果你还没有来得 ...

  7. python turtle画房子详细解释_如何用python画一个小房子

    Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发.Python ...

  8. python词云有什么用_如何用Python实现词云效果

    如何用Python实现词云效果 发布时间:2020-06-06 10:56:57 来源:亿速云 阅读:204 作者:Leah 这篇文章主要为大家详细介绍了用Python实现词云效果的方法,图文详解容易 ...

  9. python怎样打开加密的文件_如何用Python 加密文件

    生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库. 但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而 ...

最新文章

  1. antv g2字体阴影_antv g2的理解总结
  2. SSH-CLIENT : gSTM
  3. python 清华镜像_Anaconda3清华镜像 V5.3.1 最新免费版
  4. 震惊! Leftmost Digit
  5. 好系统教你如何在Windows中更改文件夹的图标
  6. apicloud入门学习笔记1:简单介绍
  7. 计算机桌面快捷方式误删了,电脑把桌面快捷方式删除了怎么办?电脑快捷方式删除了的恢复方法...
  8. python import 搜索包路径的机制,以及添加自定义python包的方法
  9. “飞扬小字典” -- 辅助记忆的小工具
  10. 网吧游戏二层更新linux,图文细说网吧游戏更新软件【处理手段】
  11. UiAUtomator基础入门级学习
  12. DBA的主要工作是什么
  13. 怎么在线压缩PDF文件?常见途径说明
  14. Android快速转战Kotlin教程,面试必备
  15. PMBOK(第六版) 学习笔记 ——《第一章 引论》
  16. 彭兰 新媒体进阶研究
  17. Hadoop学习笔记(16)Hive的基本概念、Hive的下载与安装、MySQL数据库下载与安装
  18. 智能社 - VueJs(1-11章全)
  19. 螺丝头部及其相关知识点
  20. 可用驱动精灵备份系统的驱动

热门文章

  1. boost::system::linux_error相关的测试程序
  2. boost::safe_numerics模块实现数据类型下溢的测试程序
  3. boost::lambda::constructor用法的测试程序
  4. boost::fusion::remove_if用法的测试程序
  5. boost::date_time模块测试时间分辨率特征
  6. GDCM:ReadUpToTag的测试程序
  7. VTK:PolyData之LinearExtrusion
  8. VTK:绘图之StackedPlot
  9. VTK:图片之ImageMagnify
  10. QML中定义JavaScript资源