########################################################
# Python学习交流群:548377875
#源码+微信:mmp9972
# 火车票抢票系统V1.0
########################################################
import requests
import Station_Parse
import threading
import os
from datetime import datetime
from splinter.browser import Browser
from time import sleep
from tkinter import *
from PIL import Image, ImageTk
from tkinter import messagebox
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 忽视该警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# 车票查询部分
#-------------------------------------------------------------------------------------------------------------------------------------------
# 数据处理+显示
class Trains_Demo():
# 初始化
def __init__(self, txt_show_ticket, raw_trains, option):
self.headers = '车次: 车站: 时间: 历时: 商务/特等座: 一等座: 二等座: 高级软卧: 软卧: 动卧: 硬卧: 软座: 硬座: 无座:'.split()
self.raw_trains = raw_trains
self.option = option
txt_show_ticket.delete(1.0, END)
# 获取出发和到达站
def get_from_to_station_name(self, data_list):
self.from_station_name = data_list[6]
self.to_station_name = data_list[7]
self.from_to_station_name = Station_Parse.parse_station().disparse(self.from_station_name) + '-->' + Station_Parse.parse_station().disparse(self.to_station_name)
return self.from_to_station_name
# 获得出发和到达时间
def get_start_arrive_time(self, data_list):
self.start_arrive_time = data_list[8] + '-->' + data_list[9]
return self.start_arrive_time
# 解析trains数据(与headers依次对应)
def parse_trains_data(self, data_list):
return {
'trips': data_list[3],
'from_to_station_name': self.get_from_to_station_name(data_list),
'start_arrive_time': self.get_start_arrive_time(data_list),
'duration': data_list[10],
'business_premier_seat': data_list[32] or '--',
'first_class_seat': data_list[31] or '--',
'second_class_seat': data_list[30] or '--',
'senior_soft_sleep': data_list[21] or '--',
'soft_sleep': data_list[23] or '--',
'move_sleep': data_list[33] or '--',
'hard_sleep': data_list[28] or '--',
'soft_seat': data_list[24] or '--',
'hard_seat': data_list[29] or '--',
'no_seat': data_list[26] or '--',
}
# 判断是否需要显示
def need_show(self, data_list):
self.trips = data_list[3]
initial = self.trips[0].lower()
if 'a' in self.option:
return self.trips
else:
return(initial in self.option)
# 数据显示
def show_trian_data(self):
self.t_num = 0
for self.train in self.raw_trains:
self.data_list = self.train.split('|')
if self.need_show(self.data_list):
self.values_row = []
self.parsed_train_data = self.parse_trains_data(self.data_list)
self.values_row.append(self.headers[0] + self.parsed_train_data['trips'])
self.values_row.append(self.headers[1] + self.parsed_train_data['from_to_station_name'])
self.values_row.append(self.headers[2] + self.parsed_train_data['start_arrive_time'])
self.values_row.append(self.headers[3] + self.parsed_train_data['duration'])
self.values_row.append(self.headers[4] + self.parsed_train_data['business_premier_seat'])
self.values_row.append(self.headers[5] + self.parsed_train_data['first_class_seat'])
self.values_row.append(self.headers[6] + self.parsed_train_data['second_class_seat'])
self.values_row.append(self.headers[7] + self.parsed_train_data['senior_soft_sleep'])
self.values_row.append(self.headers[8] + self.parsed_train_data['soft_sleep'])
self.values_row.append(self.headers[9] + self.parsed_train_data['move_sleep'])
self.values_row.append(self.headers[10] + self.parsed_train_data['hard_sleep'])
self.values_row.append(self.headers[11] + self.parsed_train_data['soft_seat'])
self.values_row.append(self.headers[12] + self.parsed_train_data['hard_seat'])
self.values_row.append(self.headers[13] + self.parsed_train_data['no_seat'])
self.t_num += 1
txt_show_ticket.insert(END, '第%d班:' % self.t_num + '*'*80)
txt_show_ticket.insert(END, '\n')
txt_show_ticket.insert(END, self.values_row)
txt_show_ticket.insert(END, '\n')
# 车票查询
class Query_Ticket():
# 初始化
def __init__(self, txt_show_ticket, ticket_option, from_station, to_station, date):
# 请求地址的模板
self.url_template = (
'https://kyfw.12306.cn/otn/leftTicket/query{}?leftTicketDTO.'
'train_date={}&'
'leftTicketDTO.from_station={}&'
'leftTicketDTO.to_station={}&'
'purpose_codes=ADULT'
)
self.ticket_option = ticket_option
self.from_station = from_station
self.to_station = to_station
self.date = date
# 获得请求地址
def request_url1(self):
return(self.url_template.format('A', self.date, self.from_station, self.to_station))
def request_url2(self):
return(self.url_template.format('Z', self.date, self.from_station, self.to_station))
# 查询车票
def query(self):
self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3294.6 Safari/537.36'}
self.res = requests.get(self.request_url1(), headers=self.headers, verify=False)
try:
try:
self.trains = self.res.json()['data']['result']
except:
self.res = requests.get(self.request_url2(), headers=self.headers, verify=False)
self.trains = self.res.json()['data']['result']
Trains_Demo(txt_show_ticket, self.trains, self.ticket_option).show_trian_data()
except:
title = '提示'
message = '出了点小问题,请重新点击按钮!'
messagebox.showinfo(title, message)
#-------------------------------------------------------------------------------------------------------------------------------------------
# 抢票部分
#-------------------------------------------------------------------------------------------------------------------------------------------
# 抢票
class Buy_Tickets(object):
# 初始化
def __init__(self, username, passwd, order, passengers, dtime, starts, ends):
self.url_template = (
'https://kyfw.12306.cn/otn/leftTicket/query{}?leftTicketDTO.'
'train_date={}&'
'leftTicketDTO.from_station={}&'
'leftTicketDTO.to_station={}&'
'purpose_codes=ADULT'
)
self.username = username
self.passwd = passwd
# 日期
self.dtime = dtime
# 乘客名
self.passengers = passengers.split(',')
# 起始地和终点
self.starts = Station_Parse.parse_station().parse(starts)
self.ends = Station_Parse.parse_station().parse(ends)
if self.starts is None or self.ends is None:
self.title = '提示'
self.message = '请输入有效的车站名'
messagebox.showinfo(self.title, self.message)
# 车次
self.order = order
if self.order != '0':
self.order = self.order_transfer()
while(not self.order):
sleep(1)
self.order = self.order_transfer()
# 起始地和终点转为cookie值
self.starts = self.Get_Cookies()[0] + '%2C' + self.starts
self.ends = self.Get_Cookies()[1] + '%2C' + self.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 = 'chrome'
self.executable_path = 'D:\\Python35\\Scripts\\chromedriver.exe'
# 登录
def login(self):
self.driver.visit(self.login_url)
self.driver.fill('loginUserDTO.user_name', self.username)
self.driver.fill('userDTO.password', self.passwd)
self.title = '提示'
self.message = '请在自动打开的浏览器中输入验证码!'
messagebox.showinfo(self.title, self.message)
while True:
if self.driver.url != self.initMy_url:
sleep(1)
else:
br
没有合适的资源?快使用搜索试试~ 我知道了~
Python实战示例 查票抢票.zip
共4个文件
py:2个
pyc:1个
png:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 201 浏览量
2024-06-21
20:59:53
上传
评论
收藏 241KB ZIP 举报
温馨提示
Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票Python实战 查票抢票
资源推荐
资源详情
资源评论
收起资源包目录
实例-05 查票抢票.zip (4个子文件)
实例-05 查票抢票
bg2_demo.png 240KB
抢票.py 19KB
Station_Parse.py 884B
__pycache__
Station_Parse.cpython-37.pyc 1KB
共 4 条
- 1
资源评论
0仰望星空007
- 粉丝: 4174
- 资源: 581
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip
- (源码)基于C语言的操作系统实验项目.zip
- (源码)基于C++的分布式设备配置文件管理系统.zip
- (源码)基于ESP8266和Arduino的HomeMatic水表读数系统.zip
- (源码)基于Django和OpenCV的智能车视频处理系统.zip
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功