Python实现火车票查询小工具

本文介绍了如何使用Python通过12306官网API进行火车票查询。通过docopt库解析命令行参数,抓取指定日期、始发站和终点站的车次信息,并详细说明了获取数据的过程,包括网络请求的URL和解析JSON响应数据。同时,还提供了用于解析车站信息的Python脚本,以获取车站的代号。

     这个小工具通过抓取12306网站提供的数据并进行解析,从而实现通过命令行的方式查询火车票余票数的功能。主要运用了docopt,requests,prettytable,colorama的库函数,达到简单熟悉Python3网络编程的目的。

运行效果如下:

首先,我们用docopt这个库来解析Python的命令行参数,docopt可以按我们在文档字符串中定义的格式来解析参数,比如我们在代码中写下以下内容:

# coding: utf-8

"""命令行火车票查看器

Usage:
    tickets [-gdtkz] <from> <to> <date>

Options:
    -h,--help   显示帮助菜单
    -g          高铁
    -d          动车
    -t          特快
    -k          快速
    -z          直达

Example:
    tickets 北京 上海 2017-10-22
    tickets -dg 成都 南京 2017-10-22
"""
from docopt import docopt

def cli():
    """command-line interface"""
    arguments = docopt(__doc__)
    print(arguments)

if __name__ == '__main__':
    cli()
上面的程序中, docopt 会根据我们在 docstring 中的定义的格式自动解析出参数并返回一个字典,也就是 arguments, 我们打印出了这个字典的内容。

接下来是获取数据,让我们先打开12306的官网,进入余票查询页面,随便查询一次从北京到上海的车次,然后按F12打开开发者工具,选中Network一栏,在调试工具观察下请求和响应:


从图中可以很容易找到请求数据的URL:https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-10-23&leftTicketDTO.from_station=SHH&leftTicketDTO.to_station=BJP&purpose_codes=ADULT

### 创建火车票查询应用程序 #### 方法概述 为了创建一个功能完整的火车票查询应用,可以采用多种方法和技术栈。对于初学者来说,构建命令行版本的应用是一个不错的起点[^1]。随着技能的增长,还可以扩展至具有图形用户界面(GUI)的应用程序[^2]。 #### 命令行版火车票查询器 此部分将展示如何利用Python开发简易的命令行火车票查询工具: ```python import requests from prettytable import PrettyTable def fetch_ticket_info(from_station, to_station, date): url = "https://example.com/api/train_tickets" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Cookie': '<your-cookie-here>' } params = {'from': from_station, 'to': to_station, 'date': date} response = requests.get(url, headers=headers, params=params) if response.status_code == 200: data = response.json() table = PrettyTable(['Train No.', 'Departure Time', 'Arrival Time']) for item in data['trains']: table.add_row([item['train_no'], item['departure_time'], item['arrival_time']]) print(table) else: print(f"Failed to retrieve ticket information: {response.text}") if __name__ == "__main__": from_station = input("请输入出发站:") to_station = input("请输入到达站:") travel_date = input("请输入出行日期(YYYY-MM-DD):") fetch_ticket_info(from_station, to_station, travel_date) ``` 这段代码展示了基本的工作流程——向指定URL发送GET请求并解析返回的数据,最后以表格形式打印出来。需要注意的是这里的`url`应替换为真实的API地址,并且要设置合适的HTTP头部信息来模拟合法用户的访问行为[^4]。 #### GUI 版本火车票查询器简介 当希望进一步提升用户体验时,则可考虑加入GUI组件。这里推荐使用Tkinter作为窗口部件库,它简单易用适合快速原型开发。另外也可以借助更高级别的框架如PyQt或wxPython等完成复杂交互逻辑的设计。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值