用python抢火车票怎么实现
抢火车票的实现可以分为以下几个步骤:
- 登录12306网站获取cookie和token;
- 查询符合要求的车次和座位信息;
- 选择需要抢购的车次和座位;
- 提交订单;
- 验证订单是否成功。
以下是一个简单的Python代码示例:
import requests
import time
# 登录12306网站
def login():
url = 'https://kyfw.12306.cn/otn/login/init'
response = requests.get(url)
if response.status_code == 200:
print('登录成功')
return response.cookies, response.text.split("'")[1]
# 查询符合要求的车次和座位信息
def query_train(cookies, token):
from_station = '上海'
to_station = '北京'
date = '2022-01-01'
url = f'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={date}&leftTicketDTO.from_station={from_station}&leftTicketDTO.to_station={to_station}&purpose_codes=ADULT'
headers = {
'Referer': 'https://kyfw.12306.cn/otn/leftTicket/init',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
response = requests.get(url, headers=headers, cookies=cookies)
if response.status_code == 200:
data = response.json()['data']
for item in data:
train_info = item['queryLeftNewDTO']
if train_info['station_train_code'] == 'G1' and train_info['canWebBuy'] == 'Y' and train_info['ze_num'] != '--':
secret = item['secretStr']
return secret, train_info['train_no'], train_info['from_station_telecode'], train_info['to_station_telecode'], date
# 选择需要抢购的车次和座位
def select_seat(cookies, secret, train_no, from_station, to_station, date):
url = f'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
data = {
'secretStr': secret,
'train_date': date,
'back_train_date': date,
'tour_flag': 'dc',
'purpose_codes': 'ADULT',
'query_from_station_name': from_station,
'query_to_station_name': to_station,
'undefined': ''
}
headers = {
'Referer': 'https://kyfw.12306.cn/otn/leftTicket/init',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
response = requests.post(url, headers=headers, cookies=cookies, data=data)
if response.status_code == 200:
print('选择座位成功')
return response.cookies
# 提交订单
def submit_order(cookies):
url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'
headers = {
'Referer': 'https://kyfw.12306.cn/otn/leftTicket/init',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
response = requests.get(url, headers=headers, cookies=cookies)
if response.status_code == 200:
print('提交订单成功')
return response.cookies
# 验证订单是否成功
def check_order(cookies):
url = 'https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount'
headers = {
'Referer': 'https://kyfw.12306.cn/otn/confirmPassenger/initDc',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
data = {
'_json_att': ''
}
response = requests.post(url, headers=headers, cookies=cookies, data=data)
if response.status_code == 200:
if response.json()['status'] == True:
print('抢票成功')
else:
print('抢票失败')
if __name__ == '__main__':
# 登录12306网站
cookies, token = login()
# 查询符合要求的车次和座位信息
secret, train_no, from_station, to_station, date = query_train(cookies, token)
# 选择需要抢购的车次和座位
cookies = select_seat(cookies, secret, train_no, from_station, to_station, date)
# 提交订单
cookies = submit_order(cookies)
# 等待5秒后验证订单是否成功
time.sleep(5)
check_order(cookies)
需要注意的是,由于12306网站的反爬机制比较严格,以上代码只是一个简单的示例,并不能保证一定能抢到火车票。如果需要抢票成功率更高,可以尝试模拟人的操作行为,例如使用Selenium模拟浏览器操作。
原文地址: https://www.cveoy.top/t/topic/dvHc 著作权归作者所有。请勿转载和采集!