一. 代码使用Python+Splinter开发,Splinter是一个使用Python开发的开源Web应用测试工具,它可以帮你实现自动浏览站点和与其进行交互。
二. 安装好Python 3或2都可以,然后安装Splinter  `pip install Splinter`
三. Splinter注意事项
    1. Splinter的Browser类默认优先使用firefox,所以用chrome的话,需要指定driver_name="chrome",只要养成一个习惯,不管用什么浏览器都指定,问题会出得少
    2. 当然,选择chrome的话,需要查看自己浏览器的版本,需要和chromedriver版本对应(不是版本号一致),参考和下载地址是http://blog.csdn.net/huilan_same/article/details/51896672
四. Splinter.broser部分方法介绍
    1.  findbyid("控件id").first:根据id找到组件
    2.  visis(url):访问指定网址
    3.  fill("填充的内容"):用指定内容填充组件
    4.  click():点击事件
    5.  reload():重新加载当前文档
五. 主要思路:
    1. 自动填充用户名,密码,点击图片验证码(手动),自动点击购票查询,预订,自动选择指定乘客进入提交订单页面
    2. 除登录时的图片验证码,全程自动
六. error(下面是我已经尝试成功的):
    1. OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
    2. 解决方案:chromedriver版本和电脑浏览器版本映射没对应
    3. ImportError: cannot import name 'Browser'。
    4. 解决方案:是否安装了Splinter  `pip install Splinter`,将代码文件和chromedriver放到一个新文件夹下,防止其他文件的影响
    5. 请在运行文件前,将代码内的乘客,用户名,密码正确填写好,检查cookies是否正确
七. cookies 查看
    1. 进入chrome浏览器,按F12,选中NetWork选项,如下图
    
     2. 起始地址: `_jc_save_fromStation` 购票时间: `_jc_save_fromDate` 目的地: `_jc_save_toStation`

八.  运行方法
    1. python trainticket.py 天津 南昌 2018-02-10
    2. OK

九.  具体代码如下

  # -*- coding:utf-8 -*-"""@author Jianxiong Rao"""from splinter.browser import Browserfrom time import sleepimport tracebackimport time,sysimport osclass HuoChe(object):"""docstring for Train"""driver_name=''executable_path=''#用户名 密码username = u"12306帐户名"passwd = u"12306密码"#cookies值自己找 # 天津%u5929%u6D25%2CTJP 南昌%u5357%u660C%2CNCG 桂林%u6842%u6797%2CGLZstarts = u"%u5929%u6D25%2CTJP"ends = u"%u5357%u660C%2CNCG"#时间格式2018-02-05dtime = u"2018-02-05"#车次,选择第几趟,0则从上之下依次点击order = 0###乘客姓名users=[u'乘客名']##席位xb=u"二等座"pz=u"成人票""""网址"""#12306查询URLticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"#12306登录URLlogin_url = "https://kyfw.12306.cn/otn/login/init"#我的12306URLinitmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"#购票URLbuy="https://kyfw.12306.cn/otn/confirmPassenger/initDc"login_url='https://kyfw.12306.cn/otn/login/init'def __init__(self):self.driver_name = 'chrome'self.executable_path = os.getcwd()+'/chromedriver'print("Welcome To Use The Tool")def login(self):self.driver.visit(self.login_url)#填充密码self.driver.fill("loginUserDTO.user_name",self.username)#sleep(1)self.driver.fill("userDTO.password",self.passwd)print("等待验证码,自行输入....")while True:if self.driver.url != self.initmy_url:sleep(1)else :breakdef start(self):self.driver = Browser(driver_name=self.driver_name,executable_path = self.executable_path)self.driver.driver.set_window_size(1400,1000)self.login()#sleep(1)self.driver.visit(self.ticket_url)try:print("购票页面开始....")#sleep(1)#加载查询信息self.driver.cookies.add({"_jc_save_fromStation":self.starts})self.driver.cookies.add({"_jc_save_toStation":self.ends})self.driver.cookies.add({"_jc_save_fromDate":self.dtime})self.driver.reload()count = 0if self.order != 0:while self.driver.url == self.ticket_url:self.driver.find_bytext(u"查询").click()count += 1print("循环点击查询.... 第 %s 次"%count)#sleep(1)try:self.driver.find_by_text(u'预订')[self.order - 1].click()except Exception as e:print(e)print("还没开始预订")continueelse :while self.driver.url == self.ticket_url:self.driver.find_by_text(u"查询").click()count += 1print("循环点击查询.... 第 %s 次"%count)#sleep(0.8)try:for i in self.driver.find_by_text(u"预订"):i.click()sleep(1)except Exception as e:print(e)print("还没开始预订 %s "%count)continueprint("开始预订....")#sleep(1)#self.driver.reload()sleep(1)print("开始选择用户....")for user in self.users:self.driver.find_by_text(user).last.click()print("提交订单....")sleep(1)# self.driver.find_by_text(self.pz).click()# self.driver.find_by_id('').select(self.pz)# sleep(1)# self.driver.find_by_text(self.xb).click()# sleep(1)self.driver.find_by_id('submitOrder_id').click()print("开始选座...")# self.driver.find_by_id('1D').last.click()# self.driver.find_by_id('1F').last.click()sleep(1.5)print("确认选座....")self.driver.find_by_text('qr_submit_id').click()except Exception as e:print(e)cities={'天津':'%u5929%u6D25%2CTJP','南昌':'%u5357%u660C%2CNCG','桂林':'%u6842%u6797%2CGLZ'}if __name__=="__main__":train = HuoChe()train.starts = cities[sys.argv[1]]train.ends = cities[sys.argv[2]]train.dtime = sys.argv[3]train.start()

十.  源码地址

如有错误,请纠正,谢谢!

Python 一百多行实现抢票助手相关推荐

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

    前几天跟朋友说打算写一个抢票助手,最后由于某些原因念头打消了. 可就在昨天晚上,才隐约记起一年前的自己曾经说过:一年后我一定要写一个12306的抢票助手!瞬间激情澎湃,甚至已经是快临近凌晨时便开始动工 ...

  2. 趣玩Python——如何帮女朋友快速抢票

    又到了半年一度的考试季,对于那些翻山越岭外出求学的莘莘学子们,相比于各显神通的考试,更紧张的莫过于买一张回家的车票,相信很多群最近都被下面这样的图占领了. 如今,随着12306的抗压能力越来越强,各种 ...

  3. 春节Python抢票神器,支持候补抢票

    车栗子 发自 凹非寺 量子位 报道 | 公众号 QbitAI 想要回家的小伙伴们,大概经历了一波抢票大战. 顺便把一个Python抢票工具,送到了GitHub趋势榜第一. 项目名很干脆,就是12306 ...

  4. 春节Python抢票神器,支持候补抢票!你买好票了吗!

    想要回家的小伙伴们,大概经历了一波抢票大战. 顺便把一个 Python抢票工具 ,送到了GitHub趋势榜第一. 项目名很干脆,就是 12306 ,来自名叫 文贤平 的程序员. 这很可能是全GitHu ...

  5. 五一出行一票难求,用Python实现12306火车票自动抢票,省心省力!

    最近在学Python,所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正.话不多说,进入正题: 在进入正题之前,我想说明一下,由于12306官网 ...

  6. python判断火车票座位_Python抢票程序优化,可以选择车次和座次

    Python抢票程序优化,可以选择车次和座次 阅读文本大概需要 5 分钟. pk 哥在元旦前写了一篇关于自动化抢票的程序 用Python抢火车票加邮件通知,同时建了一个火车票助力群,本来只是写着玩玩, ...

  7. 趣味Python——如何帮女朋友快速抢票

    又快到了半年一度的考试季,对于那些翻山越岭外出求学的莘莘学子们,相比于各显神通的考试,更紧张的莫过于买一张回家的车票,相信很多群最近都被下面这样的图占领了. 如今,随着12306的抗压能力越来越强,各 ...

  8. python 学习笔记一 自动抢票软件

    这是一个系列,记录我练习python时的代码,有些是参考网上代码,送给那些想要学习python的人.可以相互交流, wx: Lxp911221 喜欢的加我吧 这篇是一个抢票软件,有登录,自动选座,自动 ...

  9. Python爬虫实战之12306抢票

    12306抢票 前言 一.爬虫是什么? 二.使用步骤 1.引入库 2.爬虫代码 3.城市编码 4.主程序 总结 前言 提示:用python实现简单的12306余票查询 提示:以下是本篇文章正文内容,下 ...

  10. python学习:12306火车票抢票代码公开揭秘

    火车票抢票代码公开揭秘 市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单.下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事. 该代码仅 ...

最新文章

  1. Understand Execution Context
  2. python变量声明语句_python – 在条件语句中声明变量有问题吗?
  3. 重新启动计算机的方法有,电脑重新启动怎么办 重新启动解决方法介绍【详解】...
  4. pdf annotator 中文版
  5. 【Redis系列】Redis 入门指南
  6. win10录屏_不需要第三方软件,看看WIN10自带的几个强大的截图、录屏工具
  7. od反编译c语言插件,Ollydbg反汇编工具
  8. 对比苏州和杭州这两座城市,你会发现?
  9. Vscode工作区调试(虚拟环境)配置指北
  10. 网站漏洞修复公司 对网站上传文件漏洞的修复与安全加固
  11. 计算机专业英语名词(复试)
  12. 零基础入门进化算法(基本概念)
  13. WINDOWS系统文件夹、实用自带工具、DOS、进程等,解析集合(积累)较实用...
  14. 服务器怎么使用快照还原系统,云服务器创建快照与还原
  15. 聊天机器人 AIML文件 srai标签解释(五)
  16. 魅族手机便签的备忘录内容误删了怎么办?
  17. !!!Adb 抓不住Genymotion的解决方法
  18. 台北淡水 渔人码头之行
  19. [Python][Selenium]浏览器无头模式
  20. 图神经网络GNN(三):基于图神经网络的节点表征学习

热门文章

  1. The All-purpose Zero-HDU5773
  2. android studio 初始化项目加载时间过长或失败问题解决
  3. 混淆矩阵 confusion matrices
  4. hiveserver2启动后beeline无法连接:root is not allowed to impersonate hah
  5. 麻将胡牌算法(C++版)
  6. figma安装包_Figma软件下载|UI界面设计软件(Figma)下载 v3.0.4 官方版 - 比克尔下载...
  7. Python 鸡肋面试题总结
  8. uni-app实战之社区交友APP(12)文章和话题API开发
  9. mysql出现1048_MySQLdb_异常操作错误:(1048,“……不能为空”)
  10. win10把中文用户名改为英文用户名的两种方法