用Python抢火车票的简单小程序实现解析


Posted in Python onAugust 14, 2019

利用Python制作自动抢火车票小程序,过年再也不要担心没票了!

前言

每次过年很多人都会因为抢不到火车票而回不了家,所以小编利用Python写了一个自动抢火车票的工具,希望大家能抢到火车票,回家过个好年!

我本来想自己写一个练练手的,但是转眼一想,Python 本身最大的优势是什么,不就是有很多牛逼的人已经造好轮子了吗?你只需要知道这些轮子并会使用就行了,这样会节省你大量的精力和时间,而且站在巨人的肩膀上,会看得更远。

于是我在 github 上一搜索,果然有不少抢票程序,有的是 Python2,有的是 Python3,按 start 数据排序,经过亲自使用和对比,我选择了一个相对较好用的程序,并稍加以改进和完善。

话不多说,直接上代码:

'''
在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,934109170
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容。
'''
 
@@ -0,0 +1,124 @@
# -*- coding: utf-8 -*-
"""
@author: liuyw
"""
from splinter.browser import Browser
from time import sleep
import traceback
import time, sys
 
class huoche(object):
 driver_name = ''
 executable_path = ''
 #用户名,密码
 username = u"xxx"
 passwd = u"xxx"
 # cookies值得自己去找, 下面两个分别是沈阳, 哈尔滨
 starts = u"%u6C88%u9633%2CSYT"
 ends = u"%u54C8%u5C14%u6EE8%2CHBB"
 
 # 时间格式2018-01-19
 dtime = u"2018-01-19"
 # 车次,选择第几趟,0则从上之下依次点击
 order = 0
 ###乘客名
 users = [u"xxx",u"xxx"]
 ##席位
 xb = u"二等座"
 pz = u"成人票"
 
 """网址"""
 ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"
 login_url = "https://kyfw.12306.cn/otn/login/init"
 initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
 buy = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
 
 def __init__(self):
  self.driver_name = 'chrome'
  self.executable_path = 'D:/chromedriver'
 
 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(u"等待验证码,自行输入...")
  while True:
   if self.driver.url != self.initmy_url:
    sleep(1)
   else:
    break
 
 def 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(u"购票页面开始...")
   # 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 = 0
   if self.order != 0:
    while self.driver.url == self.ticket_url:
     self.driver.find_by_text(u"查询").click()
     count += 1
     print(u"循环点击查询... 第 %s 次" % count)
     # sleep(1)
     try:
      self.driver.find_by_text(u"预订")[self.order - 1].click()
     except Exception as e:
      print(e)
      print(u"还没开始预订")
      continue
   else:
    while self.driver.url == self.ticket_url:
     self.driver.find_by_text(u"查询").click()
     count += 1
     print(u"循环点击查询... 第 %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(u"还没开始预订 %s" % count)
      continue
   print(u"开始预订...")
   # sleep(3)
   # self.driver.reload()
   sleep(1)
   print(u'开始选择用户...')
   for user in self.users:
    self.driver.find_by_text(user).last.click()
 
   print(u"提交订单...")
   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(u"开始选座...")
   self.driver.find_by_id('1D').last.click()
   self.driver.find_by_id('1F').last.click()
 
   sleep(1.5)
   print(u"确认选座...")
   self.driver.find_by_id('qr_submit_id').click()
 
  except Exception as e:
   print(e)
 
if __name__ == '__main__':
 huoche = huoche()
 huoche.start()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
进一步探究Python中的正则表达式
Apr 28 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
Python协程的用法和例子详解
Sep 09 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
Mac安装python3的方法步骤
Aug 09 Python
Pytorch Tensor的索引与切片例子
Aug 18 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
在Python中实现字典反转案例
Dec 05 Python
Python定时任务随机时间执行的实现方法
Aug 14 #Python
查看Python依赖包及其版本号信息的方法
Aug 13 #Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 #Python
Python编写带选项的命令行程序方法
Aug 13 #Python
使用python模拟命令行终端的示例
Aug 13 #Python
在macOS上搭建python环境的实现方法
Aug 13 #Python
解决Mac下使用python的坑
Aug 13 #Python
You might like
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
javascript 内存回收机制理解
2011/01/17 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
深入了解Python数据类型之列表
2016/06/24 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
python 搜索大文件的实例代码
2019/07/08 Python
Python中bisect的使用方法
2019/12/31 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
django和flask哪个值得研究学习
2020/07/31 Python
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
化学学院毕业生自荐信范文
2013/12/17 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android