用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实现字典的key和values的交换
Aug 04 Python
Python解析树及树的遍历
Feb 03 Python
pytorch构建网络模型的4种方法
Apr 13 Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
pytorch自定义初始化权重的方法
Aug 17 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
python实现高斯判别分析算法的例子
Dec 09 Python
Python astype(np.float)函数使用方法解析
Jun 08 Python
python在linux环境下安装skimage的示例代码
Oct 14 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 Python
python爬取豆瓣电影TOP250数据
May 23 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中empty is_null和isset的测试
2013/06/29 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
php单一接口的实现方法
2015/06/20 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
JS模拟多线程
2007/02/07 Javascript
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
Python每天必学之bytes字节
2016/01/28 Python
详解python的数字类型变量与其方法
2016/11/20 Python
python如何获取服务器硬件信息
2017/05/11 Python
python pytest进阶之fixture详解
2019/06/27 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
个人评语大全
2014/05/04 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
大学生求职信怎么写
2015/03/19 职场文书