python+Splinter实现12306抢票功能

本文实例为大家分享了python实现12306抢票功能的具体代码,供大家参考,具体内容如下

源码记录如下:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

from splinter.browser import Browser
from time import sleep
import os
# from selenium.webdriver.chrome.options import Options
import logging
from log_class import Logger # 需要一个logger库
import sys

reload(sys)
sys.setdefaultencoding('utf-8') # 防止由于Unicode编码与ASCII编码的不兼容造成错误

class BuyTicket(object):
  def __init__(self, username, passwd, order, passengers, seatType, ticketType, daytime, starts, ends):
    # 用户名 密码
    self.username = username
    self.passwd = passwd
    # 车次,选择第几趟,0则从上之下依次点击
    self.order = order
    # 乘客名
    self.passengers = passengers
    # 席位
    self.seatType = seatType
    self.ticketType = ticketType
    # 时间格式2018-02-05
    self.daytime = daytime
    # 起始地和终点
    self.starts = starts
    self.ends = ends

    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 = 'firefox' # chrome firefox
    # 火狐浏览器第三方驱动
    self.executable_path = os.getcwd()+'/geckodriver' # 获取工程目录下的火狐驱动 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)
    logbticket.info("请手动输入验证码...")
    # print('请手动输入验证码...') # 目前没有自动验证码
    # 循环等待登录,登录成功,跳出循环
    while True:
      if self.driver.url != self.initMy_url:
        sleep(1)
      else:
        break

  def start_buy(self):
    # 这些设置都是必要的
    # chrome_options = Options()
    # chrome_options.add_argument("--no-sandbox")
    # chrome_options.add_argument("--disable-setuid-sandbox")
    # chrome_options.add_argument("disable-infobars") # 禁用网页上部的提示栏
    # self.driver = Browser(driver_name=self.driver_name, options=chrome_options, executable_path=self.executable_path)
    self.driver = Browser(driver_name=self.driver_name,
               executable_path=self.executable_path)
    # 设置窗口大小尺寸
    self.driver.driver.set_window_size(1400, 1000)
    # 用户登录
    self.login()
    # 进入选票网站
    self.driver.visit(self.ticket_url)
    try:
      logbticket.info("购票页面开始....")
      # print("购票页面开始....")
      # 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.daytime})

      self.driver.reload()

      count = 0
      if self.order != 0:
        while self.driver.url == self.ticket_url:
          self.driver.find_by_text("查询").click()
          count = count+1
          logbticket.info("第 %d 次点击查询..." % count)
          # print("第 %d 次点击查询..." % count)
          # sleep(1)
          try:
            self.driver.find_by_text("预订")[self.order - 1].click() # 点击第几个“预订”
            sleep(1.5)
          except Exception as e: # e是Exception 的一个instance
            # print(e)
            # print("预订失败...")
            logbticket.error(e)
            logbticket.error("预订失败...")
            continue
      else:
        while self.driver.url == self.ticket_url:
          self.driver.find_by_text("查询").click()
          count += 1
          logbticket.info("第 %d 次点击查询..." % count)
          # print("第 %d 次点击查询..." % count)
          try:
            for i in self.driver.find_by_text("预订"):
              i.click()
              sleep(1)
          except Exception as e:
            # print(e)
            # print("预订失败...")
            logbticket.error(e)
            logbticket.error("预订失败...")
            continue

      # print("开始预订....")
      logbticket.info("开始预订....")
      # sleep(1)
      # self.driver.reload()
      sleep(1)
      # print("开始选择用户....")
      logbticket.info("开始选择用户....")
      for p in self.passengers:
        pg = self.driver.find_by_text(p) # .last.click()
        pg.last.click()
      # print("提交订单....")
      logbticket.info("提交订单....")
      sleep(1)
      i = 0
      while len(self.passengers) > 0:
        i = i + 1
        seat_id_string = "seatType_" + str(i)
        ticket_id_string = "ticketType_" + str(i)
        self.driver.find_by_xpath('//select[@id="%s"]/option[@value="%s"]'
                     % (seat_id_string, self.seatType)).first._element.click()
        self.driver.find_by_xpath('//select[@id="%s"]//option[@value="%s"]'
                     % (ticket_id_string, self.ticketType)).first._element.click()
        # self.driver.select("confirmTicketType", "3")
        self.passengers.pop()
        sleep(1)
      self.driver.find_by_id("submitOrder_id").click()
      # print("开始选座...")
      logbticket.info("开始选座...")
      sleep(1.5)
      # print("确认选座....")
      logbticket.info("确认选座....")
      self.driver.find_by_text("qr_submit_id").click()

    except Exception as e:
      # print(e)
      logbticket.error(e)

city = {"深圳": "%u6DF1%u5733%2CSZQ",
    "武汉": "%u6B66%u6C49%2CWHN",
    "随州": "%u968F%u5DDE%2CSZN"}

seatT = {"硬卧": "3",
     "软卧": "4",
     "硬座": "1",
     "二等座": "O",
     "一等座": "M",
     "商务座": "9"}

if __name__ == '__main__':
  # 用户名
  username = "xxxxxxxx"
  # 密码
  password = "xxxxxx"
  # 车次选择,0代表所有车次
  order = 13
  # 乘客名,比如passengers = ['丁小红', '丁小明']
  passengers = ["xxx", "xxx"]
  # 日期,格式为:'2018-01-20'
  daytime = "2018-04-05"
  # 出发地(需填写cookie值)
  starts = city["xx"] # 武汉
  # 目的地(需填写cookie值)
  ends = city["xx"] # 北京
  # 席别
  seatType = seatT["二等座"] # 二等座
  # 票种
  ticketType = "1" # 成人票

  logbticket = Logger("bticket.log", logging.DEBUG, logging.ERROR)

  BuyTicket(username, password, order, passengers, seatType, ticketType, daytime, starts, ends).start_buy()

火狐浏览器的驱动下载地址

logger库文件:

源代码如下:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import logging

class Logger:
  def __init__(self, path, clevel=logging.DEBUG, Flevel=logging.DEBUG):
    self.logger = logging.getLogger(path)
    self.logger.setLevel(logging.DEBUG)
    fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
    # 设置CMD日志
    sh = logging.StreamHandler()
    sh.setFormatter(fmt)
    sh.setLevel(clevel)
    # 设置文件日志
    fh = logging.FileHandler(path)
    fh.setFormatter(fmt)
    fh.setLevel(Flevel)
    self.logger.addHandler(sh)
    self.logger.addHandler(fh)

  def debug(self, message):
    self.logger.debug(message)

  def info(self, message):
    self.logger.info(message)

  def war(self, message):
    self.logger.warn(message)

  def error(self, message):
    self.logger.error(message)

  def cri(self, message):
    self.logger.critical(message)

if __name__ == '__main__':
  logyyx = Logger('yyx.log', logging.ERROR, logging.DEBUG)
  logyyx.debug('一个debug信息')
  logyyx.info('一个info信息')
  logyyx.war('一个warning信息')
  logyyx.error('一个error信息')
  logyyx.cri('一个致命critical信息')

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

(0)

相关推荐

  • 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 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

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

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

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

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

  • python实现12306抢票及自动邮件发送提醒付款功能

    #写在前面,这个程序我已经弄出来了,但是因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹就是技术交流. 只做技术交流..... 嗯,程序结束后,自己还是得手动付款. 废话不多说,下面就直接开始技术主要部分阐述. 先讲理论部分:首先我们需要代码实现一个浏览器功能,那么模块基本上可以确定urllib.parse.urllib.request,这两个包都是和网址有关的模块,那么咱们去登录一个网址,特别是有验证码这些的网址,我们登录进去是不是就行了?答案是对的,但是我们用代码实现的话,这个

  • python自动12306抢票软件实现代码

    昨天我发的是抓取的12306数据包,然后分析了一下,今天按照昨天的分析 用代码实现了,如果有需要的同学们可以看一下,实现的功能有,登录,验证码识别,自动查票,有余票点击预定, 差了最后一步提交订单.同学们可以自己研究一下. import requests import time import dmpt import re import random from copyheaders import headers_raw_to_dict DEFAULT_HEADERS={ 'Host':'kyfw

  • 用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+splinter实现12306网站刷票并自动购票流程

    通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站的 <查询> 刷新频率(默认自动查询的刷新频率为5秒).对于学习splinter感觉还是不错的,但是想通过装个类似刷票程序成功购票的 还是多花点钱升级升级硬件设备,提高提高网速吧. 程序写的有点乱,随时修改ing. #!/usr/bin/env python3 # encoding: utf-8 from splinter.browser import Brows

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

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

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

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

  • Python动刷新抢12306火车票的代码(附源码)

    用python另一个抢票神器,你get到了吗? 2017年时间飞逝,转眼间距离2018年春节还有不到1个月的时间,还在为抢不到火车票发愁吗?作为程序员的我们撸一个抢票软件可好? 难以想象的数据,预示着今年春运回程和返程车票 购买难度将进一步加大- 抢购车票怕是比李白跨越"蜀道"的难度还大哦~ 当你想查询一下火车票信息的时候,还在为打开无响应的12306官网和广告n秒的APP吗而懊恼吗? 不如用 Python 写一个命令行版的火车票查看器, 只要在命令行敲一行命令就能获得你想要的火车票信

  • python+splinter自动刷新抢票功能

    抢票脚本,python +splinter自动刷新抢票,可以成功抢到(依赖自己的网络环境太厉害,还有机器的好坏),但是感觉不是很完美. 有大神请指导完善一下(或者有没有别的好点的思路),不胜感谢. # -*- coding: utf-8 -*- """ @author: liuyw """ from splinter.browser import Browser from time import sleep import traceback im

  • 手把手教你用python抢票回家过年(代码简单)

    首先看看如何快速查看剩余火车票? 当你想查询一下火车票信息的时候,你还在上12306官网吗?或是打开你手机里的APP?下面让我们来用Python写一个命令行版的火车票查看器, 只要在命令行敲一行命令就能获得你想要的火车票信息!如果你刚掌握了Python基础,这将是个不错的小练习. 接口设计 一个应用写出来最终是要给人使用的,哪怕只是给你自己使用.所以,首先应该想想你希望怎么使用它?让我们先给这个小应用起个名字吧,既然及查询票务信息,那就叫它tickets好了.我们希望用户只要输入出发站,到达站以

随机推荐