基于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 相关文章推荐
详解Django框架中用context来解析模板的方法
Jul 20 Python
python 写的一个爬虫程序源码
Feb 28 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
python3转换code128条形码的方法
Apr 17 Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 Python
使用python画社交网络图实例代码
Jul 10 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
利用Pytorch实现简单的线性回归算法
Jan 15 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
Jun 12 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 Python
Python常用配置文件ini、json、yaml读写总结
Jul 09 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中使用接口实现工厂设计模式的代码
2012/06/17 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
vue的事件绑定与方法详解
2017/08/16 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
python远程登录代码
2008/04/29 Python
python中from module import * 的一个坑
2014/07/20 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
django模板语法学习之include示例详解
2017/12/17 Python
python微信撤回监测代码
2019/04/29 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
旷课检讨书2000字
2014/01/14 职场文书
网络管理专业求职信
2014/03/15 职场文书
酒店管理求职信范文
2014/04/06 职场文书
社区服务活动总结
2014/05/07 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
病危通知单
2015/04/17 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis
python区块链实现简版工作量证明
2022/05/25 Python