python抢票web端_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信息')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
python抢票web端_python+Splinter实现12306抢票功能相关推荐
- python实战扫码下载_Python实例 一 12306抢票(一)扫码登陆
一.登陆 采用扫码二维码的方式登陆,就是得下个app.. 验证码太烦了,不想搞 1.获取二维码: 先分析二维码一般是一张图片,我们把他下载到本地 来方便扫码 图片还是base64的数据形式 但是我们 ...
- php++仿网页版微信,vue+web端仿微信网页版聊天室功能
一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室- ...
- python批量自动订票_python+splinter实现12306网站刷票并自动购票流程
python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...
- python网络编程web教程_python网络编程学习笔记(6):Web客户端访问
转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 6.1 最简单的爬虫 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.pyt ...
- python12306刷票脚本_python+splinter实现12306网站刷票并自动购票流程
通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站的 刷新频率(默认自动查询的刷新频率为5秒).对于学习splinte ...
- python12306下单步骤_python+splinter实现12306网站刷票并自动购票流程
通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站的 刷新频率(默认自动查询的刷新频率为5秒).对于学习splinte ...
- Python + Selenium实现web端的UI自动化
我的第一个Python自动化用例 环境准备 安装好Python 下载最新Python 命令行下查看是否安装成功: Python自带运行环境: IDLE是Python自带的集成开发环境,在开始菜单中搜索 ...
- python有哪些web框架_python五大主流web框架
Django Python框架虽然说是百花齐放,但仍然有那么一家是最大的,它就是Django.要说Django是Python框架里最好的,有人同意也有人 坚决反对,但说Django的文档最完善.市场占 ...
- python网络编程web教程_python网络编程学习笔记(10):webpy框架
django和webpy都是python的web开发框架.Django的主要目的是简便.快速的开发数据库驱动的网站.它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架 ...
最新文章
- 宏基因组实战9. 组装assembly和分箱bin结果可视化—Anvi'o
- PGA_AGGREGATE_TARGET 原理
- 字典数组根据某key排序
- java str2date,java date类与string类实例代码分享
- Linux 笔记(持续补充)
- sqlserver结果集转为字符串
- 武术与软件设计 - 简单即是最好
- ASP.NET下QueryString不同字符编码间强制转换的解决方案
- 架构的“一小步”,业务的一大步 1
- 中国移动上市第二日逼近破发线
- atomic原子类实现机制_JDK中Atomic开头的原子类实现原子性的原理是什么?
- 接口中定义的成员变量是( )。_C++:如何正确的定义一个接口类
- 隐藏桌面上计算机图标不见了怎么办,隐藏桌面我的电脑图标不见了怎么办
- Java游戏项目分享
- Wordpress 优化小结 杜绝博客因为CPU 占用过高被封
- iphone12是双卡双待吗
- 网友吐槽12306网站 专家:已接近技术极限
- Spyder runfile
- 2021年7月国产数据库排行榜:openGauss高歌猛进,GBase丢失第五
- 扇贝编程python学习笔记-基础篇3
热门文章
- Android隐藏输入法自带的输入框,将输入框向上推
- org.thymeleaf.exceptions.TemplateInputException异常
- java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
- 面试官一上来就问我Chrome底层原理和HTTP协议(万字长文)
- 什么是CSCI(Computer Software Configuration Item)?
- 李薇:大模型时代的数据变革
- 一文极速读懂UniProt数据库
- 【附源码】计算机毕业设计SSM校园排球联赛管理系统
- Herader 头常用项注解
- 网络安全与计算机病毒防范教案,网络安全与防护教案.doc