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

本文实例为大家分享了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()

完整源码见:链接地址

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

(0)

相关推荐

  • 用Python抢火车票的简单小程序实现解析

    利用Python制作自动抢火车票小程序,过年再也不要担心没票了! 前言 每次过年很多人都会因为抢不到火车票而回不了家,所以小编利用Python写了一个自动抢火车票的工具,希望大家能抢到火车票,回家过个好年! 我本来想自己写一个练练手的,但是转眼一想,Python 本身最大的优势是什么,不就是有很多牛逼的人已经造好轮子了吗?你只需要知道这些轮子并会使用就行了,这样会节省你大量的精力和时间,而且站在巨人的肩膀上,会看得更远. 于是我在 github 上一搜索,果然有不少抢票程序,有的是 Python

  • 100行Python代码实现自动抢火车票(附源码)

    前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedriver 下载Python代码,来自网络整理 [点击下载 |  本地下载 ] 代码用的Python+Splinter开发,Splinter是一个使用Python开发的开源Web应用测试工具,它可以帮你实现自动浏览站点和与其进行交互. Splinter官网:http://splinter.readth

  • Python 12306抢火车票脚本

    本文实例为大家分享了Python 12306抢火车票的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- from splinter.browser import Browser from time import sleep import traceback import time, sys class huoche(object): """docstring for huoche""" driver_name =

  • 使用Python+Splinter自动刷新抢12306火车票

    一年一度的春运又来了,今年我自己写了个抢票脚本.使用Python+Splinter自动刷新抢票,可以成功抢到.(依赖自己的网络环境太厉害,还有机器的好坏) Splinter是一个使用Python开发的开源Web应用测试工具,它可以帮你实现自动浏览站点和与其进行交互,Splinter执行的时候会自动打开你指定的浏览器,访问指定的URL.然后你所开发的模拟的任何行为,都会自动完成,你只需要坐在电脑面前,像看电影一样看着屏幕上各种动作自动完成然后收集结果即可. 12306抢票Python代码片段 1.

  • 用Python抢过年的火车票附源码

    前言:大家跟我一起念,Python大法好,跟着本宝宝用Python抢火车票 首先我们需要splinter 安装: pip install splinter -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 然后还需要一个浏览器的驱动,当然用chrome啦 下载地址: http://chromedriver.storage.googleapis.com/index.html?path=2.20/ 根据下载的自己的电脑系统

  • 火车票抢票python代码公开揭秘!

    市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单.下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事. 该代码仅供参考,主要用于大家沟通交流,禁止用于商业用途. 具体代码如下,可以修改成自己的12306用户名账号: # -*- coding: utf-8 -*- from splinter.browser import Browser from time import sleep import traceback import ti

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

    本文实例为大家分享了python实现自动抢火车票,供大家参考,具体内容如下 splinter使用 首先介绍一下splinter使用: plinter.brower是一个开源工具,通过Python自动化测试web,通过电脑自动操作网页. Splinter模块是python egg,下载当然很简单,安装: pip install splinter 同时还需要浏览器的驱动,Splinter的Browser类默认优先调用的驱动是firefox,所以用chrome的话需要在初始化Browser时候指定dr

  • Python实现12306自动抢火车票功能

    目录 一.效果展示 二.代码详解 1 导入库 2 确定好购票基本信息 3 登录12306 4 模拟滑动滑块 5 处理疫情特殊要求 6 点击购票并填写出发地.目的地.出发时间 7 锁定车票 大家有没有这种感觉,一到国庆.春节这种长假,抢火车票就非常困难?各大互联网公司都推出抢票服务,只要加钱给服务费就可以增加抢到票的几率.有些火车票代售网点和一些加速买票软件,说你只要给100元服务费就可以优先帮忙抢到票.本文和你一起探索抢票软件背后的原理. 一.效果展示 在正式进入代码讲解之前,先来看下本文的实现

  • Python 12306抢火车票脚本 Python京东抢手机脚本

    本文实现12306抢火车票/京东抢手机示例,具体如下: #12306秒抢Python代码 from splinter.browser import Browser x = Browser(driver_name="chrome") url = "https://kyfw.12306.cn/otn/leftTicket/init" x = Browser(driver_name="chrome") x.visit(url) #填写登陆账户.密码 x

  • 基于python3 类的属性、方法、封装、继承实例讲解

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. python类与c++类相似,提供了类的封装,继承.多继承,构造函数.析构函数. 在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类. 类定义 类定义语法格式如下: class ClassName: <statement

  • 基于Python3 逗号代码 和 字符图网格(详谈)

    逗号代码 假定有下面这样的列表: spam=['apples','bananas','tofu',' cats'] 编写一个函数,它以一个列表值作为参数,返回一个字符串.该字符串包含所有表项,表项之间以逗号和空格分隔,并在最后一个表项之前插入 and .例如,将前面的spam列表传递给函数,将返回'apples,bananas,tofu,and cats'.但是你的函数应该能够传递给它的任何列表. 代码如下: import copy def conFun(nameList): n=len(nam

  • 基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能

    描述:使用QtDesignner设计界面,pyQt5+python3实现主体方法制作的猜数字游戏. 游戏规则:先选择游戏等级:初级.中级.高级.魔鬼级,选择完游戏等级后点击"确定",然后后台会自动生成一个与游戏等级匹配的"神秘数字",游戏玩家在文本框内输入数字,再点击文本框旁边的"确定",即可比较玩家所猜数字是否就是"神秘数字". 游戏界面: 源代码: 代码1: guessNumberGame.py (界面代码) # -*-

  • 为了顺利买到演唱会的票用Python制作了自动抢票的脚本

    目录 知识点: 开发环境: 先导入本次所需的模块 第一步,实现免登录 确定目标,设置全局变量 初始化加载 登录调用设置cookie 获取cookie 登录 打开浏览器 第二步,抢票并下单 判断元素是否存在 选票操作 选择座位 下单操作 抢票完成,退出 测试代码是否成功 最后看下效果如何 知识点: 面向对象编程 selenium 操作浏览器 pickle 保存和读取Cookie实现免登陆 time 做延时操作 os 创建文件,判断文件是否存在 开发环境: 版 本:anaconda5.2.0(pyt

随机推荐