Python实现火车票查询小工具

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    这个小工具通过抓取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

Python可以用来开发火车票查询工具,通常利用第三方API或网站数据抓取技术。例如,通过requests库访问中国铁路客户服务中心的API,或者使用BeautifulSoup等库爬取12306官网的数据。下面是一个简单的步骤概述: 1. **安装必要的库**:首先需要安装如requests、lxml(用于解析HTML)、pandas等用于数据处理的库。 2. **获取API或网页数据**:如果是官方API,需要申请相应的API key,并按照文档调用接口,获取列车信息。如果没有官方API,就直接抓取网页源码。 3. **数据结构和解析**:获取到的数据通常是JSON或HTML格式,需要用适当的方式解析,提取出关键信息如车次、发站、到站、时间等。 4. **用户界面**:创建命令行交互界面或者GUI,允许用户输入出发地、目的地和日期,然后显示查询结果。 5. **异常处理**:考虑到网络请求可能存在失败的情况,需要对可能出现的错误进行妥善处理。 ```python # 示例代码片段 import requests from bs4 import BeautifulSoup def query_train_tickets(start_city, end_city, date): url = "https://kyfw.12306.cn/otn/leftTicket/init" # 使用实际的API接口地址和参数替换这里 params = {'leftTicketDTO.train_date': date, 'leftTicketDTO.from_station': start_city, 'leftTicketDTO.to_station': end_city} try: response = requests.get(url, params=params) if response.status_code == 200: soup = BeautifulSoup(response.text, 'lxml') # 解析并返回火车票信息 return process_ticket_data(soup) else: print("查询失败,状态码:", response.status_code) except Exception as e: print("查询过程中发生错误:", str(e)) def process_ticket_data(html_content): # 这里是对解析后的HTML内容进行进一步处理 pass start_city = input("请输入出发城市:") end_city = input("请输入到达城市:") date = input("请输入查询日期:") tickets = query_train_tickets(start_city, end_city, date) if tickets: for ticket in tickets: print(ticket) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值