提示:
高铁 : 二等座 + 学生票+ F位
火车: 默认硬卧 + 学生票(也可以选择硬座,将BuyTicket,py里w=='2'的注释打开即可)
为什么搞这个呢?因为每当开学的时候,我老是买不到票,这个气啊!都是卡准时间进的,但终归是手速不行,跟不上,不是在排队中,就是没票…后来就想,别人都能写脚本,我为啥不行,我也是计科人啊,所以就搜资料看视频,不断的加工,终于–还算是写出来了吧,虽然这个版本bug不断,抢票全靠运气
图片展示
视频不过审,就换图片了
运行,在控制台输入相应信息,查询车次
确认购票,输入车次前对应的次序,开始等待自动抢票(当前抢的是预售票,自动刷新)
最终抢票界面(一切顺利,大概4s左右订单就提交了)
环境准备
python解释器(python环境)
官网下载地址:https://www.python.org/downloads/windows/
谷歌驱动(chromedriver.exe)
下载地址:https://chromedriver.storage.googleapis.com/index.html
将下载解压后的驱动(chromedriver.exe)分别放到谷歌和python环境下
python环境放置位置
谷歌放置位置
下载第三方库
这里主要用到了就是一个交互和滑块检测
pip install selenium==4.1.1
这里建议指定版本下载,我最开始是默认版本(最新),出现闪退,就降版本了
pip下载慢的,看这篇https://blog.csdn.net/m0_58730471/article/details/128793934
查票
查票这里是接上一篇https://blog.csdn.net/m0_58730471/article/details/128881512
在原基础上进行了部分修改(city.json文件在上一行给的文章里
)
# 数据请求模块
import requests
# 序列化和反序列化
import json
# 表格格式输出(美化输出)
import prettytable as pt
import datetime
#导入自定义模块
import BuyTicket as buy
# 读取city.json文件
f = open('city.json', mode='r', encoding='utf-8')
text = f.read()
city_json = json.loads(text)
#进行查票(在指定乘车日期+指定出发时间段+有票)
flag=False
while True:
print()
print("========================开始购票============================")
print()
while True:
from_station = input('请输入你的出发地: ')
try:
city_json[from_station]
break
except:
print()
print("出发地不存在,或输入不正确")
print()
while True:
to_station = input('请输入你的目的地: ')
try:
city_json[to_station]
break
except:
print()
print("目的地不存在,或输入不正确")
print()
version=input("乘车类型(高铁-1,火车-2,所有车次-3):")
# 购票日期
while True:
# 获取当前系统时间
now1 = datetime.datetime.now().strftime('%Y-%m-%d')
now=now1.split('-')
train_date1 = input('请输入乘车时间(格式:'+now1+'): ')
train_date=train_date1.split('-')
# 判断输入合法性
# 判断日期时间是不是满足要求(当天+后继14天)
if len(train_date)==3:
if len(train_date[0])==4 and train_date[0]>=now[0]:
if len(train_date[1])==2 and '00'<train_date[1]<='12':
if len(train_date[2])==2 and '00'<train_date[2]<='31':
date2=datetime.datetime.strptime(now1[0:10],"%Y-%m-%d")
date1=datetime.datetime.strptime(train_date1[0:10],"%Y-%m-%d")
if 0<=(date1-date2).days<15:
break
print("日期输入有误,请再次输入!!!")
# 出发时间段
while True:
times=input("输入想要购票的时间段(24小时制)(例:10-14):").split('-')
try:
if len(times)==2:
if 0<=int(times[0])<=int(times[1]) and int(times[1])<=23:
break
else:
print("是时间,24小时制的时间(0-23),不要闹好不好")
else:
print("再闹没票了啊!!!")
except:
print("还闹,不管你了啊!!!")
#访问url
url = "https://kyfw.12306.cn/otn/leftTicket/queryZ?"
#携带的请求参数
data = {
'leftTicketDTO.train_date': train_date1,
'leftTicketDTO.from_station': city_json[from_station],
'leftTicketDTO.to_station': city_json[to_station],
'purpose_codes': 'ADULT'
}
#携带验证信息
headers = {
'Cookie': '_uab_collina=167499505748263902067472; JSESSIONID=EBB7BB72E53FB9EBDF572A1FB5F9501F; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u6D1B%u9633%u9F99%u95E8%2CLLF; _jc_save_toStation=%u5B89%u9633%u4E1C%2CADF; _jc_save_wfdc_flag=dc; RAIL_EXPIRATION=1675700441381; RAIL_DEVICEID=qe8Urc4t2EKH4vO7M9o074ICj3yjpgbyj6OtWFWizKxzSPkD_UHtsq7uqt8EQlU55v57L_ra7h0HgkwUIhuajVkSm8Xi2ezDrFIWl_hg05ZDcuvwTrwHWNsc_x8MN4x5Cippb8ILX9U_2zwe6DDHxtxMZKiYeaPb; BIGipServerotn=2229797130.50210.0000; BIGipServerpassport=803733770.50215.0000; fo=g4nfuizb5y3uxsafrbjh5eUbePmfMzR2ut8WtkFjj-THCc1n0cQeaR31JlgmsQqwW4_p2scXT7hb1zuzVv6lD-UTrEDL4xtGjZOZt_R1KOPDlO6bldWB3bhMNDZEwYqudPnSoV-jLO-sxKJEfVSftKitQTlFTNd5fVAaVfDwHX0hm7lPEYM4aBB0bwI; route=c5c62a339e7744272a54643b3be5bf64; _jc_save_toDate=2023-02-04; _jc_save_fromDate=2023-02-12',
}
# 发送请求
res = requests.get(url=url, params=data, headers=headers)
# 自动转码(中文乱码)
res.encoding = res.apparent_encoding
print(res)
# 获得携带的需求数据
result=res.json()['data']['result']
# 数据格式化
tb=pt.PrettyTable()
if version=='1':
# 高铁
tb.field_names=[
'次序',
'车次',
'出发时间',
'到达时间',
'耗时',
'特等座',
'一等',
'二等',
]
elif version=='2':
# 火车
tb.field_names=[
'次序',
'车次',
'出发时间',
'到达时间',
'耗时',
'软卧',
'硬卧',
'硬座',
'无座',
]
else:
# 表头(所有车次)
tb.field_names=[
'次序',
'车次',
'出发时间',
'到达时间',
'耗时',
'特等座',
'一等',
'二等',
'软卧',
'硬卧',
'硬座',
'无座',
]
#遍历拆分数据
page=1
for index in result:
# requests.utils.unquote(index)
# index_list = index.replace('有', 'Yes').replace('无', 'No').split('|')
index_list = index.split('|')
# print(index_list)
train_number = index_list[3] # 车次
time_1 = index_list[8] # 出发时间
time_2 = index_list[9] # 到达时间
use_time=index_list[10] # 耗时
# 高铁
prince_seat = index_list[32] # 特等座
first_class_seat = index_list[31] # 一等座
second_class = index_list[30] # 二等座
# 火车
hard_seat = index_list[29] # 硬座
no_seat = index_list[26] # 无座
soft_sleeper = index_list[23] # 软卧
hard_sleeper = index_list[28] # 硬卧
# 指定时间段
if int(times[0])<=int(time_1.split(':')[0])<=int(times[1]):
# 高铁
if version=='1' and train_number[0]=='G':
if prince_seat!='无' or first_class_seat!='无' or second_class!='无':
# 表格内容
tb.add_row([
page,
train_number,
time_1,
time_2,
use_time,
prince_seat,
first_class_seat,
second_class,
])
# 火车
elif version=='2' and train_number[0]!='G':
if hard_seat!='无' or no_seat!='无' or soft_sleeper!='无' or hard_sleeper!='无':
# 表格内容
tb.add_row([
page,
train_number,
time_1,
time_2,
use_time,
soft_sleeper,
hard_sleeper,
hard_seat,
no_seat,
])
# 所有车次
elif version!='1' and version!='2':
# 表格内容
tb.add_row([
page,
train_number,
time_1,
time_2,
use_time,
prince_seat,
prince_seat,
second_class,
soft_sleeper,
hard_sleeper,
hard_seat,
no_seat,
])
page+=1
print(tb)
print()
print()
抢票
这里是自己瞎搞的,也确实能买到票,但终归是小白入门,所以嗯哼~
思路:
1 访问网址,填写账号密码,点击登录
2 借助网上大神的解释,解决滑块验证
3 后面就是查找出发地、目的地、日期的对应位置,填入预订信息
4 去检测指定车次的预订位置判断指定位置的内容:
是预订,就点击跳转,进入下一页,选择乘车人信息
如果是16点起售,就是没到放票时间,不断刷新5 选择乘车人信息(指定选择了第一个)
6 解决学生票弹窗(我是学生,所以购买的学生票,点击的是)
7 提交订单,选择车位(选的F位,两人位靠窗,多爽啊)
8 狂刷点击确定,直到出现订单提交(这时候别退,要多等一会儿,确保买到票)
9 嗯~,没有了,目前就这些(但是技术不断变化,当前可行,可能一段时间就GG了)
10 对了,有一个问题,有时候都到预定了,一点机预订,会二次弹出账号密码登录,我试着写了,但没解决,后来代码写成了现在这b样子,就不想动他了,终归遇到的次数不多,也就这样了,后续了解了,继续优化
注意
:
ser = Service(f’D:\Python\chromedriver.exe’)
里面的路径就是最开始环境搭建时候下载的驱动在python中的放置位置
#账号(后面是你的登录账号,一般就用手机哈)
driver.find_element_by_css_selector(‘#J-userName’).send_keys(‘137xxxxxxxx’)
#密码(这个填入的是你的账号对应的密码)
driver.find_element_by_css_selector(‘#J-password’).send_keys(‘123hdsjdwe’)
BuyTicket.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#from password import account, password
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 导入动作链对应的类
from selenium.webdriver import ActionChains
# 反检测
from selenium.webdriver import ChromeOptions
from time import sleep
# 购票
def buy_ticket(num,from_station,to_station,sendData,w):
option=ChromeOptions()
# 谷歌驱动路径
ser = Service(f'D:\Python\chromedriver.exe')
# 实现规避检测
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_experimental_option("detach", True)
# 定义为全局,避免窗口一闪而过
global driver
driver=webdriver.Chrome(service=ser,options=option)
# 隐式等待5s
driver.implicitly_wait(10)
driver.get("https://kyfw.12306.cn/otn/resources/login.html")
# 采取去除特征识别,即以下两行代码。
script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});'
driver.execute_script(script)
# js = 'return window.navigator.webdriver'
# print(driver.execute_script(js)) # 可以直接在终端输出webdriver检测结果
#账号(后面是你的登录账号,一般就用手机哈)
driver.find_element_by_css_selector('#J-userName').send_keys('137xxxxxxxx')
#密码(这个填入的是你的账号对应的密码)
driver.find_element_by_css_selector('#J-password').send_keys('123hdsjdwe')
#点击登录
driver.find_element_by_css_selector('#J-login').click()
sleep(0.5)
#找到滑块
div_TAG=driver.find_element(By.ID,"nc_1_n1z")
# 动作链
action=ActionChains(driver)
# 点击并长按指定的标签
action.click_and_hold(div_TAG)
# 渐移
for i in range(6):
#perform() 立即执行动作链操作
# move_by_offset(x,y): x 水平方向 y数值方向 两个参数
action.move_by_offset(50,0).perform()
sleep(0.5)
action.release().perform()
# 绕过检测
# driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
# "source": """
# Object.defineProperty(navigator, 'webdriver', {
# get: () => undefined
# })
# """
# })
#回车
# driver.find_element_by_css_selector('#link_for_ticket').send_keys(Keys.ENTER)
# 通过元素定位, 点击车票预定
driver.find_element_by_css_selector('#link_for_ticket').click()
# 始发地点 =======================================
# 通过元素定位, 点击键盘回车
# driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER)
# 通过元素定位, 清空输入框内容
driver.find_element_by_css_selector('#fromStationText').clear()
# 通过元素定位, 点击一下输入框
driver.find_element_by_css_selector('#fromStationText').click()
# 通过元素定位, 输入出发城市
driver.find_element_by_css_selector('#fromStationText').send_keys(from_station)
# 通过元素定位, 点击键盘回车
driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER)
# 终点地点====================================
driver.find_element_by_css_selector('#toStationText').clear()
driver.find_element_by_css_selector('#toStationText').click()
driver.find_element_by_css_selector('#toStationText').send_keys(to_station)
driver.find_element_by_css_selector('#toStationText').send_keys(Keys.ENTER)
# 购票时间====================================
driver.find_element_by_css_selector('#train_date').clear()
driver.find_element_by_css_selector('#train_date').click()
driver.find_element_by_css_selector('#train_date').send_keys(sendData)
driver.find_element_by_css_selector('#train_date').send_keys(Keys.ENTER)
#===========================循环抢票=====================================
#思路:(自己瞎搞的,小白入门)
# 如果预订点击有效,会进行页面跳转,url发生变化,所以去捕获url,变化了,就是有票了(买买买买....),
# 不跳转就刷寻查询,继续判断(这里默认为时无法预订导致的url不变,
# 其实还有一种情况就是,跳转了,只是代码执行太快了,页面还没加载上就又去获取了ulr2,url2和url1一样了)
# 哈哈哈,很垃圾,见笑见笑,小白,纯纯小白。
while True:
# 点击查询
try:
driver.find_element_by_css_selector('#query_ticket').click()
except:
break
#获取当前url
url1=driver.current_url
#============================ 预订============================
# 获取指定位置内容
# 内容为预订,就点击购票
# 内容为16点起售,就是还没有放票,就不断的查询刷新
#queryLeftTable tr:nth-child(1) .no-br 16点起售
try:
content= driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({2*num-1}) .no-br').text
except:
break
if content=='预订':
try:
driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({2*num-1}) .btn72').click()
except:
break
else:
continue
#在测试的时候,在点击预订后,会弹出您尚未登录,让重新登录
#所以就想着把之前的登录操作在搞一遍就是了,但是后边又突然不出现二次登陆了,所以这一块儿对于二次登录弹窗
#不知道可行不,还得测试
try:
login=driver.find_element_by_css_selector(f'#login > div.modal-login-tit > h2').text
if login=='您尚未登录':
#账号
driver.find_element_by_css_selector('#J-userName').send_keys('137xxxxxxxx')
#密码
driver.find_element_by_css_selector('#J-password').send_keys('123sahdjahdj')
#点击登录
driver.find_element_by_css_selector('#J-login').click()
#找到滑块
div_TAG=driver.find_element(By.ID,"nc_1_n1z")
# 动作链
action=ActionChains(driver)
# 点击并长按指定的标签
action.click_and_hold(div_TAG)
# 渐移
for i in range(2):
#perform() 立即执行动作链操作
# move_by_offset(x,y): x 水平方向 y数值方向 两个参数
action.move_by_offset(150,0).perform()
action.release().perform()
except:
pass
finally:
try:
#获取当前url
url2=driver.current_url
if driver.find_element_by_css_selector(f'#normal_passenger_image_id').text=='乘车人':
break
# 判断url不一样,就是发生了页面跳转
print("url2==================================="+url2)
if url1!=url2:
break
except:
continue
#==============================================================
#==================================================================================
# # 买票(默认选第一乘车人和F座)
# 选择乘车人
driver.find_element_by_css_selector('#normalPassenger_0').click()
# 学生票选择(确定买)
driver.find_element_by_css_selector('#dialog_xsertcj_ok').click()
# 提交订单
driver.find_element_by_css_selector('#submitOrder_id').click()
# 选座位(F位) 高铁选座位,火车就直接确定了
if w=='1':
driver.find_element_by_css_selector('#erdeng1 > ul:nth-child(4) > li:nth-child(2) a').click()
#火车如果选择硬座,请打开该注释,不打开默认选的硬卧
# if w=='2':
# driver.find_element_by_css_selector('#seatType_1 > option:nth-child(2)').click()
#订单确认(进入待支付状态)
try:
while True:
driver.find_element_by_css_selector('#qr_submit_id').click()
except:
print()
print()
print('||======================================||')
print('|| ||')
print("|| 购票成功,请在10分钟内完成支付 ! ! ! ||")
print('|| ||')
print('||======================================||')
print()
print()
return
# buy_ticket(5,'洛阳龙门','安阳东','2023-02-09','2')
查票+抢票
在前面有对应的校验
出发地
目的地
日期(2023-02-05格式的,只能是当前日期或者后推14天的日期,只预售15天,还带上当天)
发车时间段(24小时制的0-23)查询车次之后,打印的带一个次序号,想要乘坐那个车,就输入对应的车次号
在这里有一点就是,对应车次的预订按钮变化是(1,3,5,7,9,奇数)式的,后边做了处理就是(2*num-1),总归就是坐哪个车就输入对应的次序(例:G656–>7)
连接纽扣
while True:
if version=='1' or version=='2':
choise=input("是否开始购票-----(Y/N)")
print()
print()
if choise=='Y' or choise=='y':
Train_number=int(input("输入预购票车次序号(例:6):"))
while True:
try:
buy.buy_ticket(Train_number,from_station,to_station,train_date1,version)
flag2=True
break
except:
print()
print()
print('购票失败!!!')
print()
print()
#跳出当前购票,并终止程序
if flag2:
flag=True
break
elif choise=='N' or choise=='n':
# 是否继续查询判定
again = input('是否继续查询(Y/N): ')
if again == 'Y' or again == 'y':
break
else:
flag=True
break
else:
x=input('所有车次展示完毕,如需购票(高铁输入--1, 火车输入--2,再次查询--3): ')
if x=='1' or x=='2':
version=x
else:
break
# 终止程序
if flag:
print()
print('=======================程序已退出=========================')
print()
print()
print()
break
完整代码
里面导入的BuyTicket就是抢票对应的代码
#导入自定义模块
import BuyTicket as buy
最终的文件夹里放的就是这三个
抢票终极版.py
# 数据请求模块
import requests
# 序列化和反序列化
import json
# 表格格式输出(美化输出)
import prettytable as pt
import datetime
#导入自定义模块
import BuyTicket as buy
# 读取city.json文件
f = open('city.json', mode='r', encoding='utf-8')
text = f.read()
city_json = json.loads(text)
#进行查票(在指定乘车日期+指定出发时间段+有票)
flag=False
while True:
print()
print("========================开始购票============================")
print()
while True:
from_station = input('请输入你的出发地: ')
try:
city_json[from_station]
break
except:
print()
print("出发地不存在,或输入不正确")
print()
while True:
to_station = input('请输入你的目的地: ')
try:
city_json[to_station]
break
except:
print()
print("目的地不存在,或输入不正确")
print()
version=input("查询车辆信息(高铁-1,火车-2,所有车次-3):")
# 购票日期
while True:
# 获取当前系统时间
now1 = datetime.datetime.now().strftime('%Y-%m-%d')
now=now1.split('-')
train_date1 = input('请输入乘车时间(格式:'+now1+'): ')
train_date=train_date1.split('-')
# 判断输入合法性
# 判断日期时间是不是满足要求(当天+后继14天)
if len(train_date)==3:
if len(train_date[0])==4 and train_date[0]>=now[0]:
if len(train_date[1])==2 and '00'<train_date[1]<='12':
if len(train_date[2])==2 and '00'<train_date[2]<='31':
date2=datetime.datetime.strptime(now1[0:10],"%Y-%m-%d")
date1=datetime.datetime.strptime(train_date1[0:10],"%Y-%m-%d")
if 0<=(date1-date2).days<15:
break
print("日期输入有误,请再次输入!!!")
# 出发时间段
while True:
times=input("输入想要购票的时间段(24小时制)(例:10-14):").split('-')
try:
if len(times)==2:
if 0<=int(times[0])<=int(times[1]) and int(times[1])<=23:
break
else:
print("是时间,24小时制的时间(0-23),不要闹好不好")
else:
print("再闹没票了啊!!!")
except:
print("还闹,不管你了啊!!!")
#访问url
url = "https://kyfw.12306.cn/otn/leftTicket/queryZ?"
#携带的请求参数
data = {
'leftTicketDTO.train_date': train_date1,
'leftTicketDTO.from_station': city_json[from_station],
'leftTicketDTO.to_station': city_json[to_station],
'purpose_codes': 'ADULT'
}
#携带验证信息
headers = {
'Cookie': '_uab_collina=167499505748263902067472; JSESSIONID=EBB7BB72E53FB9EBDF572A1FB5F9501F; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u6D1B%u9633%u9F99%u95E8%2CLLF; _jc_save_toStation=%u5B89%u9633%u4E1C%2CADF; _jc_save_wfdc_flag=dc; RAIL_EXPIRATION=1675700441381; RAIL_DEVICEID=qe8Urc4t2EKH4vO7M9o074ICj3yjpgbyj6OtWFWizKxzSPkD_UHtsq7uqt8EQlU55v57L_ra7h0HgkwUIhuajVkSm8Xi2ezDrFIWl_hg05ZDcuvwTrwHWNsc_x8MN4x5Cippb8ILX9U_2zwe6DDHxtxMZKiYeaPb; BIGipServerotn=2229797130.50210.0000; BIGipServerpassport=803733770.50215.0000; fo=g4nfuizb5y3uxsafrbjh5eUbePmfMzR2ut8WtkFjj-THCc1n0cQeaR31JlgmsQqwW4_p2scXT7hb1zuzVv6lD-UTrEDL4xtGjZOZt_R1KOPDlO6bldWB3bhMNDZEwYqudPnSoV-jLO-sxKJEfVSftKitQTlFTNd5fVAaVfDwHX0hm7lPEYM4aBB0bwI; route=c5c62a339e7744272a54643b3be5bf64; _jc_save_toDate=2023-02-04; _jc_save_fromDate=2023-02-12',
}
# 发送请求
res = requests.get(url=url, params=data, headers=headers)
# 自动转码(中文乱码)
res.encoding = res.apparent_encoding
print(res)
# 获得携带的需求数据
result=res.json()['data']['result']
# 数据格式化
tb=pt.PrettyTable()
if version=='1':
# 高铁
tb.field_names=[
'次序',
'车次',
'出发时间',
'到达时间',
'耗时',
'特等座',
'一等',
'二等',
]
elif version=='2':
# 火车
tb.field_names=[
'次序',
'车次',
'出发时间',
'到达时间',
'耗时',
'软卧',
'硬卧',
'硬座',
'无座',
]
else:
# 表头(所有车次)
tb.field_names=[
'次序',
'车次',
'出发时间',
'到达时间',
'耗时',
'特等座',
'一等',
'二等',
'软卧',
'硬卧',
'硬座',
'无座',
]
#遍历拆分数据
page=1
for index in result:
# requests.utils.unquote(index)
# index_list = index.replace('有', 'Yes').replace('无', 'No').split('|')
index_list = index.split('|')
# print(index_list)
train_number = index_list[3] # 车次
time_1 = index_list[8] # 出发时间
time_2 = index_list[9] # 到达时间
use_time=index_list[10] # 耗时
# 高铁
prince_seat = index_list[32] # 特等座
first_class_seat = index_list[31] # 一等座
second_class = index_list[30] # 二等座
# 火车
hard_seat = index_list[29] # 硬座
no_seat = index_list[26] # 无座
soft_sleeper = index_list[23] # 软卧
hard_sleeper = index_list[28] # 硬卧
# 指定时间段
if int(times[0])<=int(time_1.split(':')[0])<=int(times[1]):
# 高铁
if version=='1' and train_number[0]=='G':
if prince_seat!='无' or first_class_seat!='无' or second_class!='无':
# 表格内容
tb.add_row([
page,
train_number,
time_1,
time_2,
use_time,
prince_seat,
first_class_seat,
second_class,
])
# 火车
elif version=='2' and train_number[0]!='G':
if hard_seat!='无' or no_seat!='无' or soft_sleeper!='无' or hard_sleeper!='无':
# 表格内容
tb.add_row([
page,
train_number,
time_1,
time_2,
use_time,
soft_sleeper,
hard_sleeper,
hard_seat,
no_seat,
])
# 所有车次
elif version!='1' and version!='2':
# 表格内容
tb.add_row([
page,
train_number,
time_1,
time_2,
use_time,
prince_seat,
prince_seat,
second_class,
soft_sleeper,
hard_sleeper,
hard_seat,
no_seat,
])
page+=1
print(tb)
print()
print()
while True:
if version=='1' or version=='2':
choise=input("是否开始购票-----(Y/N)")
print()
print()
if choise=='Y' or choise=='y':
Train_number=int(input("输入预购票车次序号(例:6):"))
while True:
try:
buy.buy_ticket(Train_number,from_station,to_station,train_date1,version)
flag2=True
break
except:
print()
print()
print('购票失败!!!')
print()
print()
#跳出当前购票,并终止程序
if flag2:
flag=True
break
elif choise=='N' or choise=='n':
# 是否继续查询判定
again = input('是否继续查询(Y/N): ')
if again == 'Y' or again == 'y':
break
else:
flag=True
break
else:
x=input('所有车次展示完毕,如需购票(高铁输入--1, 火车输入--2,再次查询--3): ')
if x=='1' or x=='2':
version=x
else:
break
# 终止程序
if flag:
print()
print('=======================程序已退出=========================')
print()
print()
print()
break
总结
到这里就完了。总归来说,爬虫真的挺有意思,这一类脚本语言还是有必要学的,毕竟作为一个计科人,多学一些东西是没坏处的。但是这个抢票还是得看天意了(这个取决于你的电脑性能,网速,还有就是会不会遇到稀奇古怪的问题,不过还是希望各位都能-码到票成)
(感觉还可以的就,麻烦大佬动动您致富的小手指,来个点赞+关注吧!)