使用 python 抢火车票可提高成功率。获取车次信息:通过 requests 库发送 GET 请求获取车次信息。实时查询车票:循环发送 GET 请求查询车票,若有票打印车次信息。自动下单:循环查询车票并自动下单,若有票则拼接下单参数发送 POST 请求下单。
如何使用 Python 抢火车票
介绍
抢火车票一直是一项艰巨的任务,尤其是热门线路和节假日出行高峰期。Python 作为一门强大的编程语言,可以自动化抢票过程,提高抢票成功率。
所需工具
立即学习“Python免费学习笔记(深入)”;
点击下载“修复打印机驱动工具”;
- Python 3.6 或更高版本
- requests 库
- beautifulsoup4 库
步骤
1. 获取车次信息
import requests
from bs4 import BeautifulSoup
# 设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
# 发送请求获取车次信息
url = 'https://kyfw.12306.cn/otn/resources/js/query/train_list.js'
response = requests.get(url, headers=headers)
# 解析车次信息
soup = BeautifulSoup(response.text, 'lxml')
trains = soup.select('script')[-1].text
2. 实时查询车票
import time
# 设置查询参数
from_station = '北京'
to_station = '上海'
train_date = '2023-05-01'
while True:
# 发送请求查询车票
url = 'https://kyfw.12306.cn/otn/leftTicket/query?' + 'leftTicketDTO.train_date=' + train_date + '&leftTicketDTO.from_station=' + from_station + '&leftTicketDTO.to_station=' + to_station + '&purpose_codes=ADULT'
response = requests.get(url, headers=headers)
# 解析车票信息
soup = BeautifulSoup(response.text, 'lxml')
tickets = soup.find_all('tr')
# 筛选出有票的车次
available_trains = []
for ticket in tickets:
if ticket.find('td', {'id': 'ticket'}) is not None:
available_trains.append(ticket)
# 打印有票车次
if len(available_trains) > 0:
for train in available_trains:
print('车次:{},出发站:{},到达站:{},出发时间:{},到达时间:{},剩余票数:{}'.format(
train.find('td', {'id': 'train_no'}).text,
train.find('td', {'id': 'from_station_name'}).text,
train.find('td', {'id': 'to_station_name'}).text,
train.find('td', {'id': 'start_time'}).text,
train.find('td', {'id': 'arrive_time'}).text,
train.find('td', {'id': 'ticket'}).text
))
break
else:
print('暂无余票,继续查询...')
# 间隔一段时间再查询
time.sleep(1)
3. 自动下单
import time
# 设置抢票参数
seat_type = 'O' # 座位类型(O:二等座,M:一等座)
passenger_name = '张三' # 乘客姓名
passenger_id = '身份证号' # 乘客身份证号
phone_number = '12345678910' # 乘客手机号
# 循环查询车票并自动下单
while True:
# 发送请求查询车票
url = 'https://kyfw.12306.cn/otn/leftTicket/query?' + 'leftTicketDTO.train_date=' + train_date + '&leftTicketDTO.from_station=' + from_station + '&leftTicketDTO.to_station=' + to_station + '&purpose_codes=ADULT'
response = requests.get(url, headers=headers)
# 解析车票信息
soup = BeautifulSoup(response.text, 'lxml')
tickets = soup.find_all('tr')
# 筛选出有票的车次
available_trains = []
for ticket in tickets:
if ticket.find('td', {'id': 'ticket'}) is not None:
available_trains.append(ticket)
# 自动下单
if len(available_trains) > 0:
train = available_trains[0]
seat_count = train.find('td', {'id': 'ticket'}).text # 获取剩余票数
if int(seat_count) >= 1:
# 拼接下单参数
data = {
'secretStr': train.find('form', {'id': 'form_submit'})['action'],
'train_date': train_date,
'back_train_date': train_date,
'tour_flag': 'dc',
'purpose_codes': 'ADULT',
'query_from_station_name': from_station,
'query_to_station_name': to_station,
'undefined': '',
'from_station': from_station,
'to_station': to_station,
'seat_types': seat_type,
'train_no': train.find('td', {'id': 'train_no'}).text,
'stationTrainCode': train.find('td', {'id': 'station_train_code'}).text,
'leftTicket': seat_count,
'submitToken': train.find('input', {'id': 'submitToken'})['value'],
'passengerTicketStr': passenger_name + ',1,' + seat_type + ',' + passenger_id + ',' + 'N' + ',11,' + phone_number,
'oldPassengerStr': passenger_name + ',' + passenger_id + ',' + '11'
}
# 发送下单请求
url = 'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
response = requests.post(url, data=data, headers=headers)
print(response.text) # 打印下单结果
break
else:
print('暂无余票,继续查询...')
# 间隔一段时间再查询
time.sleep(1)