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

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

python抢票web端_python+Splinter实现12306抢票功能相关推荐

  1. python实战扫码下载_Python实例 一 12306抢票(一)扫码登陆

    一.登陆 采用扫码二维码的方式登陆,就是得下个app..  验证码太烦了,不想搞 1.获取二维码: 先分析二维码一般是一张图片,我们把他下载到本地 来方便扫码 图片还是base64的数据形式 但是我们 ...

  2. php++仿网页版微信,vue+web端仿微信网页版聊天室功能

    一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室- ...

  3. python批量自动订票_python+splinter实现12306网站刷票并自动购票流程

    python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...

  4. python网络编程web教程_python网络编程学习笔记(6):Web客户端访问

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 6.1 最简单的爬虫 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.pyt ...

  5. python12306刷票脚本_python+splinter实现12306网站刷票并自动购票流程

    通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站的 刷新频率(默认自动查询的刷新频率为5秒).对于学习splinte ...

  6. python12306下单步骤_python+splinter实现12306网站刷票并自动购票流程

    通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站的 刷新频率(默认自动查询的刷新频率为5秒).对于学习splinte ...

  7. Python + Selenium实现web端的UI自动化

    我的第一个Python自动化用例 环境准备 安装好Python 下载最新Python 命令行下查看是否安装成功: Python自带运行环境: IDLE是Python自带的集成开发环境,在开始菜单中搜索 ...

  8. python有哪些web框架_python五大主流web框架

    Django Python框架虽然说是百花齐放,但仍然有那么一家是最大的,它就是Django.要说Django是Python框架里最好的,有人同意也有人 坚决反对,但说Django的文档最完善.市场占 ...

  9. python网络编程web教程_python网络编程学习笔记(10):webpy框架

    django和webpy都是python的web开发框架.Django的主要目的是简便.快速的开发数据库驱动的网站.它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架 ...

最新文章

  1. 宏基因组实战9. 组装assembly和分箱bin结果可视化—Anvi'o
  2. PGA_AGGREGATE_TARGET 原理
  3. 字典数组根据某key排序
  4. java str2date,java date类与string类实例代码分享
  5. Linux 笔记(持续补充)
  6. sqlserver结果集转为字符串
  7. 武术与软件设计 - 简单即是最好
  8. ASP.NET下QueryString不同字符编码间强制转换的解决方案
  9. 架构的“一小步”,业务的一大步 1
  10. 中国移动上市第二日逼近破发线
  11. atomic原子类实现机制_JDK中Atomic开头的原子类实现原子性的原理是什么?
  12. 接口中定义的成员变量是( )。_C++:如何正确的定义一个接口类
  13. 隐藏桌面上计算机图标不见了怎么办,隐藏桌面我的电脑图标不见了怎么办
  14. Java游戏项目分享
  15. Wordpress 优化小结 杜绝博客因为CPU 占用过高被封
  16. iphone12是双卡双待吗
  17. 网友吐槽12306网站 专家:已接近技术极限
  18. Spyder runfile
  19. 2021年7月国产数据库排行榜:openGauss高歌猛进,GBase丢失第五
  20. 扇贝编程python学习笔记-基础篇3

热门文章

  1. Android隐藏输入法自带的输入框,将输入框向上推
  2. org.thymeleaf.exceptions.TemplateInputException异常
  3. java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
  4. 面试官一上来就问我Chrome底层原理和HTTP协议(万字长文)
  5. 什么是CSCI(Computer Software Configuration Item)?
  6. 李薇:大模型时代的数据变革
  7. 一文极速读懂UniProt数据库
  8. 【附源码】计算机毕业设计SSM校园排球联赛管理系统
  9. Herader 头常用项注解
  10. 网络安全与计算机病毒防范教案,网络安全与防护教案.doc