基于Python3.6+splinter实现自动抢火车票


Posted in Python onSeptember 25, 2018

本文实例为大家分享了python实现自动抢火车票,供大家参考,具体内容如下

splinter使用

首先介绍一下splinter使用:
plinter.brower是一个开源工具,通过Python自动化测试web,通过电脑自动操作网页。
Splinter模块是python egg,下载当然很简单,安装: pip install splinter
同时还需要浏览器的驱动,Splinter的Browser类默认优先调用的驱动是firefox,所以用chrome的话需要在初始化Browser时候指定driver_name="chrome"参数,建议都明确指定浏览器!
注意:Chrome的驱动chromedriver,注意版本要对应,不然基本上会有unknown error,打不开浏览器

splinter.brower基础知识

创建一个Browser实例,就会打开相应的浏览器。
visit(url): 故名思议,访问指定网站
findbyid("控件的id").first: 根据控件的属性id找到控件,一般控件都有独立唯一的id。不然,Splinter api还提供byname,byid,by_tag等方法!first表示返回第一次找到的控件。
fill("要填充的内容"): 用指定的内容填充相应控件
控件是指对数据和方法的封装。控件可以有自己的属性和方法,其中属性是控件数据的简单访问者,方法则是控件的一些简单而可见的功能、控件创建过程包括设计、开发、调试(就是所谓的3Ds开发流程,即Design、Develop、Debug)工作, 然后是控件的使用。
设计控件是一项繁重的工作。自行开发控件与使用控件进行可视化程序开发存在着极大的不同,要求程序员精通面向对象程序设计。创建控件的最大意义在于封装重复的工作,其次是可以扩充现有控件的功能。
click(): 点击控件
登录后,browser.cookies.all()中保存了本次登录的cookie信息(dict类型),可以打印出来或者保存下次使用
quit_browser(browser)函数: 要求用户交互输入q再退出。否则,程序跑完之后就直接退出了,释放Browser的实例,调用quit()方法,浏览器也就关闭了。
reload() 方法用于重新加载当前文档

实现思路

首先我们需要登陆12306网站,登录时需要输入用户名与密码,然后需要输入蛋疼的验证码,然后选择起、始站,时间,车次类型,点击查询,再选择车次,乘客,提交订单。如果按照这样的手动操作下来,票早已经没有了
备注:加粗字体都是需要购买火车票的属性

实现目标

整个流程全自动,自动登陆,自动查询,自动订单,自动提交订单( (暂时不实现自动点击验证码,验证码成功几率比较低)

'''
实现自动抢火车票(基于Python3.6+splinter)
Created on 2018年1月15日
@author: liuyazhuang
'''
from splinter.browser import Browser
from time import sleep
import traceback
 
#实现自动购票的类
class Buy_Tickets(object):
  # 定义实例属性,初始化
  def __init__(self, username, passwd, order, passengers, dtime, starts, ends):
    self.username = username
    self.passwd = passwd
    # 车次,0代表所有车次,依次从上到下,1代表所有车次,依次类推
    self.order = order
    # 乘客名
    self.passengers = passengers
    # 起始地和终点
    self.starts = starts
    self.ends = ends
    # 日期
    self.dtime = dtime
    # self.xb = xb
    # self.pz = pz
    self.login_url = 'https://kyfw.12306.cn/otn/login/init'
    self.initMy_url = 'https://kyfw.12306.cn/otn/index/initMy12306'
    self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
    self.driver_name = 'chrome'
    self.executable_path = 'C:\Python36\Scripts\chromedriver.exe'
  # 登录功能实现
  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)
    # sleep(1)
    print('请输入验证码...')
    while True:
      if self.driver.url != self.initMy_url:
        sleep(1)
      else:
        break
  # 买票功能实现
  def start_buy(self):
    self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)
    #窗口大小的操作
    self.driver.driver.set_window_size(700, 500)
    self.login()
    self.driver.visit(self.ticket_url)
    try:
      print('开始购票...')
      # 加载查询信息
      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('查询').click()
          count += 1
          print('第%d次点击查询...' % count)
          try:
            self.driver.find_by_text('预订')[self.order-1].click()
            sleep(1.5)
          except Exception as e:
            print(e)
            print('预订失败...')
            continue
      else:
        while self.driver.url == self.ticket_url:
          self.driver.find_by_text('查询').click()
          count += 1
          print('第%d次点击查询...' % count)
          try:
            for i in self.driver.find_by_text('预订'):
              i.click()
              sleep(1)
          except Exception as e:
            print(e)
            print('预订失败...')
            continue
      print('开始预订...')
      sleep(1)
      print('开始选择用户...')
      for p in self.passengers:
 
        self.driver.find_by_text(p).last.click()
        sleep(0.5)
        if p[-1] == ')':
          self.driver.find_by_id('dialog_xsertcj_ok').click()
      print('提交订单...')
      # sleep(1)
      # self.driver.find_by_text(self.pz).click()
      # sleep(1)
      # self.driver.find_by_text(self.xb).click()
      # sleep(1)
      self.driver.find_by_id('submitOrder_id').click()
      sleep(2)
      print('确认选座...')
      self.driver.find_by_id('qr_submit_id').click()
      print('预订成功...')
    except Exception as e:
      print(e)
 
if __name__ == '__main__':
  # 用户名
  username = 'xxxx'
  # 密码
  password = 'xxx'
  # 车次选择,0代表所有车次
  order = 2
  # 乘客名,比如passengers = ['XXX', 'XXX']
  # 学生票需注明,注明方式为:passengers = ['XXX(学生)', 'XXX']
  passengers = ['刘亚壮']
  # 日期,格式为:'2018-01-20'
  dtime = '2018-01-20'
  # 出发地(需填写cookie值)
  starts = '%u6210%u90FD%2CCDW' #成都
  # 目的地(需填写cookie值)
  ends = '%%u5317%u4EAC%u897F%2CBXP' #北京
 
  # xb =['硬座座'] 
  # pz=['成人票']
 
Buy_Tickets(username, password, order, passengers, dtime, starts, ends).start_buy()

完整源码见:链接地址

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

Python 相关文章推荐
python监控网卡流量并使用graphite绘图的示例
Apr 27 Python
使用优化器来提升Python程序的执行效率的教程
Apr 02 Python
Python 功能和特点(新手必学)
Dec 30 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
Jan 10 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
python匿名函数的使用方法解析
Oct 10 Python
python hashlib加密实现代码
Oct 17 Python
python调用接口的4种方式代码实例
Nov 19 Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
May 12 Python
keras中的卷积层&池化层的用法
May 22 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
Python做智能家居温湿度报警系统
Sep 25 #Python
python+splinter自动刷新抢票功能
Sep 25 #Python
python+Splinter实现12306抢票功能
Sep 25 #Python
一百多行python代码实现抢票助手
Sep 25 #Python
python爬虫之自动登录与验证码识别
Jun 15 #Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 #Python
python绘制多个曲线的折线图
Mar 23 #Python
You might like
php FPDF类库应用实现代码
2009/03/20 PHP
php中static静态变量的使用方法详解
2010/06/04 PHP
php 面向对象的一个例子
2011/04/12 PHP
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
php输出xml属性的方法
2015/03/19 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
php微信开发自定义菜单
2016/08/27 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
Python 可爱的大小写
2008/09/06 Python
python实现ip查询示例
2014/03/26 Python
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
pyqt5 QProgressBar清空进度条的实例
2019/06/21 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
python实现银行实战系统
2020/02/26 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
社区敬老月活动总结
2015/05/07 职场文书
建党伟业电影观后感
2015/06/01 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android