用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中的模块导入和读取键盘输入的方法
Oct 16 Python
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 Python
详解python 字符串和日期之间转换 StringAndDate
May 04 Python
numpy找出array中的最大值,最小值实例
Apr 03 Python
Python之pandas读写文件乱码的解决方法
Apr 20 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
使用python判断你是青少年还是老年人
Nov 29 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
通过实例了解python property属性
Nov 01 Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 Python
python正则表达式的懒惰匹配和贪婪匹配说明
Jul 13 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 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
discuz的php防止sql注入函数
2011/01/17 PHP
php的sso单点登录实现方法
2015/01/08 PHP
Java中final关键字详解
2015/08/10 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
jQuery的css()方法用法实例
2014/12/24 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
Python程序设计入门(1)基本语法简介
2014/06/13 Python
Python中matplotlib中文乱码解决办法
2017/05/12 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
python selenium 弹出框处理的实现
2019/02/26 Python
django foreignkey(外键)的实现
2019/07/29 Python
python同步windows和linux文件
2019/08/29 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
送餐员岗位职责范本
2014/02/21 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
记账会计岗位职责
2014/06/16 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
2015年党性分析材料
2014/12/19 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
如何用python清洗文件中的数据
2021/06/18 Python
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技