PHP前端开发

如何使用python抢火车票

百变鹏仔 3天前 #Python
文章标签 如何使用
使用 Python 抢火车票可提高成功率。获取车次信息:通过 requests 库发送 GET 请求获取车次信息。实时查询车票:循环发送 GET 请求查询车票,若有票打印车次信息。自动下单:循环查询车票并自动下单,若有票则拼接下单参数发送 POST 请求下单。

如何使用 Python 抢火车票

介绍

抢火车票一直是一项艰巨的任务,尤其是热门线路和节假日出行高峰期。Python 作为一门强大的编程语言,可以自动化抢票过程,提高抢票成功率。

所需工具

立即学习“Python免费学习笔记(深入)”;

步骤

1. 获取车次信息

import requestsfrom 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)