用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 排列组合之itertools
Mar 20 Python
使用python编写android截屏脚本双击运行即可
Jul 21 Python
python之wxPython应用实例
Sep 28 Python
python调用OpenCV实现人脸识别功能
May 25 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
python2.7和NLTK安装详细教程
Sep 19 Python
python如何实现一个刷网页小程序
Nov 27 Python
Python网页正文转换语音文件的操作方法
Dec 09 Python
详解字符串在Python内部是如何省内存的
Feb 03 Python
使用Python爬取弹出窗口信息的实例
Mar 14 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 Python
python可视化之颜色映射详解
Sep 15 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
script不刷新页面的联动前后代码
2013/09/18 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
Python学习资料
2007/02/08 Python
python使用matplotlib绘制柱状图教程
2017/02/08 Python
python实现贪吃蛇游戏
2020/03/21 Python
python标记语句块使用方法总结
2019/08/05 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
敏捷开发的主要原则都有哪些
2015/04/26 面试题
总经理岗位职责
2013/11/09 职场文书
给女儿的表扬信
2014/01/18 职场文书
村庄绿化方案
2014/05/07 职场文书
十佳党员事迹材料
2014/08/28 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP
Oracle中update和select 关联操作
2022/01/18 Oracle
SpringBoot详解执行过程
2022/07/15 Java/Android