Python火车票查询方法介绍

通过 ticket-booking 库(示例):

python 复制代码
from ticket_booking import TrainTicket

# 初始化查询
train = TrainTicket()

# 查询火车票
result = train.search(
    from_station="北京",
    to_station="上海",
    date="2024-01-20"
)

# 显示结果
for ticket in result:
    print(f"车次: {ticket['train_no']}")
    print(f"出发时间: {ticket['departure_time']}")
    print(f"到达时间: {ticket['arrival_time']}")
    print(f"座位类型: {ticket['seat_type']}")
    print(f"价格: {ticket['price']}")
    print("-" * 30)
  1. 调用12306官方API(需要验证)
python 复制代码
import requests
import json
from datetime import datetime

def query_train_tickets(from_station, to_station, date):
    """
    查询火车票信息
    """
    # 12306 API地址(注意:官方API经常变化,需要处理验证)
    url = "https://kyfw.12306.cn/otn/leftTicket/query"
    
    params = {
        'leftTicketDTO.train_date': date,
        'leftTicketDTO.from_station': from_station,
        'leftTicketDTO.to_station': to_station,
        'purpose_codes': 'ADULT'
    }
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Referer': 'https://kyfw.12306.cn/otn/leftTicket/init'
    }
    
    try:
        response = requests.get(url, params=params, headers=headers, verify=False)
        response.raise_for_status()
        return response.json()
    except Exception as e:
        print(f"查询失败: {e}")
        return None

# 使用示例
if __name__ == "__main__":
    # 需要先获取车站代码
    result = query_train_tickets("BJP", "SHH", "2024-01-20")
    if result:
        print(json.dumps(result, indent=2, ensure_ascii=False))
  1. 使用第三方API服务
python 复制代码
import requests
import pandas as pd

def query_via_third_party(from_city, to_city, date):
    """
    使用聚合数据等第三方API
    需要申请API Key
    """
    api_key = "your_api_key_here"
    url = f"http://apis.juhe.cn/train/station2s"
    
    params = {
        "from": from_city,
        "to": to_city,
        "date": date,
        "key": api_key,
        "dtype": "json"
    }
    
    response = requests.get(url, params=params)
    data = response.json()
    
    if data["error_code"] == 0:
        trains = data["result"]["list"]
        df = pd.DataFrame(trains)
        return df[['train_no', 'start_time', 'arrive_time', 'lishi', 'seat_types']]
    else:
        print(f"查询失败: {data['reason']}")
        return None
  1. 完整的命令行工具示例
python 复制代码
import argparse
import requests
from prettytable import PrettyTable
from colorama import init, Fore

init(autoreset=True)

class TrainQuery:
    def __init__(self):
        self.stations = self.load_stations()
    
    def load_stations(self):
        """加载车站代码"""
        # 这里可以从文件或API加载车站代码对照表
        stations = {
            "北京": "BJP",
            "上海": "SHH",
            "广州": "GZQ",
            "深圳": "SZQ",
            "南京": "NJH",
            "杭州": "HZH"
        }
        return stations
    
    def query(self, from_city, to_city, date):
        """查询车票"""
        from_code = self.stations.get(from_city)
        to_code = self.stations.get(to_city)
        
        if not from_code or not to_code:
            print("车站名称错误")
            return
        
        # 这里调用查询API
        print(f"查询 {from_city} → {to_city} {date} 的车次...")
        
        # 模拟数据
        trains = [
            {"车次": "G1", "出发": "08:00", "到达": "12:30", "历时": "4.5h", "商务座": "有", "一等座": "有", "二等座": "有"},
            {"车次": "G3", "出发": "10:00", "到达": "14:30", "历时": "4.5h", "商务座": "有", "一等座": "有", "二等座": "无"},
            {"车次": "D305", "出发": "12:30", "到达": "18:00", "历时": "5.5h", "商务座": "无", "一等座": "有", "二等座": "有"},
        ]
        
        # 用表格显示
        table = PrettyTable()
        table.field_names = ["车次", "出发时间", "到达时间", "历时", "商务座", "一等座", "二等座"]
        
        for train in trains:
            row = [
                Fore.GREEN + train["车次"],
                train["出发"],
                train["到达"],
                train["历时"],
                Fore.GREEN + "有" if train["商务座"] == "有" else Fore.RED + "无",
                Fore.GREEN + "有" if train["一等座"] == "有" else Fore.RED + "无",
                Fore.GREEN + "有" if train["二等座"] == "有" else Fore.RED + "无"
            ]
            table.add_row(row)
        
        print(table)

def main():
    parser = argparse.ArgumentParser(description="火车票查询工具")
    parser.add_argument("-f", "--from", dest="from_city", required=True, help="出发城市")
    parser.add_argument("-t", "--to", dest="to_city", required=True, help="到达城市")
    parser.add_argument("-d", "--date", required=True, help="出发日期 (格式: YYYY-MM-DD)")
    
    args = parser.parse_args()
    
    query_tool = TrainQuery()
    query_tool.query(args.from_city, args.to_city, args.date)

if __name__ == "__main__":
    main()

病危通知书 https://www.chiniurou.com/bingweitongzhishu/

相关推荐
lixinnnn.2 小时前
字符串拼接:Cities and States S
开发语言·c++·算法
努力毕业的小土博^_^2 小时前
【AI课程领学】第十二课 · 超参数设定与网络训练(课时1) 网络超参数设定:从“要调什么”到“怎么系统地调”(含 PyTorch 可复用模板)
人工智能·pytorch·python·深度学习·神经网络·机器学习
这是个栗子2 小时前
前端开发中的常用工具函数(二)(持续更新中...)
开发语言·前端·javascript
苦藤新鸡2 小时前
38.交换二叉树中所有的左右节点
开发语言·前端·javascript
YMLT花岗岩2 小时前
Python学习之-函数-入门训练-在函数中修改全局变量
python·学习
花月mmc2 小时前
CanMV K230 波形识别——数据分析(2)
python·数据挖掘·数据分析·信号处理
2501_944521592 小时前
Flutter for OpenHarmony 微动漫App实战:主题配置实现
android·开发语言·前端·javascript·flutter·ecmascript
kk”2 小时前
C++智能指针
开发语言·c++
MX_93592 小时前
以配置非自定义bean来演示bean的实例化方式
java·开发语言·后端