教你用python实现12306余票查询

教你用Python实现12306余票查询

一、背景

在高铁日益普及的今天,越来越多的人选择坐高铁出行,但是因为高铁车票是如此的抢手,导致许多人在购票时无法买到心仪的车次,于是余票查询功能就显得尤为重要。12306余票查询正是此类功能之一,它可以让我们查询到当前某一时间段内的高铁余票信息。

二、工具

本攻略采用Python 3及其相关第三方库实现,其中需要的第三方库有:

  • requests:用于发送网络请求,获取数据
  • prettytable:用于输出查询结果
  • argparse:用于解析命令行参数

这些库可以通过pip进行安装,具体安装命令如下:

pip install requests prettytable argparse

三、流程

12306余票查询的流程如下:

  1. 获取查询日期、出发站、到达站、车次等信息
  2. 发送查询请求,获取响应数据
  3. 解析响应数据,提取有用信息
  4. 输出查询结果

接下来,我们将结合代码和注释详细说明每个步骤的实现细节。

四、代码实现

import requests
from prettytable import PrettyTable
import argparse

# 构造余票查询的URL,注意日期和目标站点需要根据实际情况进行修改
query_url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2022-01-31&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT"

# 访问请求头信息
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"}

# 获取余票信息的函数,采用了懒加载的方式,避免直接传入车次列表,从而降低了调用时的传参量
def get_tickets(train_no_list=None):
    # 发送查询请求
    resp = requests.get(query_url, headers=headers)
    # 转换响应结果为json格式
    data = resp.json()
    # 从json数据中提取符合要求的列车余票信息
    train_info = data['data']['result']

    # 如果没有指定车次列表,则返回所有的列车余票信息
    if not train_no_list:
        return train_info

    # 如果指定了车次列表,则返回车次列表中对应的列车余票信息
    filtered_train_info = []
    for train in train_info:
        for train_no in train_no_list:
            if train_no in train.split("|"):
                filtered_train_info.append(train)
                break
    return filtered_train_info

# 解析查询结果并输出
def parse_and_output(query_result):
    # 通过prettytable库实现高级表格输出
    ticket_table = PrettyTable()
    ticket_table.field_names = ['车次', '出发站', '到达站', '出发时间', '到达时间', '历时', '商务座', '特等座', '一等座', '二等座', '高级软卧', '软卧',
                                '动卧', '硬卧', '硬座', '无座']

    # 每条火车信息的字符串格式为 | 列车信息 | 其他信息 |,字段间使用 | 分割,这里使用字符串的 split 方法进行分割
    for ticket in query_result:
        ticket_detail = ticket.split("|")
        train_no = ticket_detail[3]
        departure_station = ticket_detail[6]
        arrival_station = ticket_detail[7]
        departure_time = ticket_detail[8]
        arrival_time = ticket_detail[9]
        total_time = ticket_detail[10]
        business_class = ticket_detail[32] or "--"
        senior_first_class = ticket_detail[31] or "--"
        first_class = ticket_detail[30] or "--"
        second_class = ticket_detail[29] or "--"
        advanced_soft_sleeper = ticket_detail[21] or "--"
        soft_sleeper = ticket_detail[23] or "--"
        move_sleeper = "--"
        hard_sleeper = ticket_detail[28] or "--"
        hard_seat = ticket_detail[26] or "--"
        no_seat = ticket_detail[33] or "--"

        # 将每一个车次的列车余票信息添加到table中
        ticket_table.add_row(
            [train_no, departure_station, arrival_station, departure_time, arrival_time, total_time, business_class,
             senior_first_class, first_class, second_class, advanced_soft_sleeper, soft_sleeper, move_sleeper,
             hard_sleeper, hard_seat, no_seat])

    # 输出查询结果
    print(ticket_table)


# 命令行参数解析,支持传入多个参数作为需要查询的车次,例如:python tickets.py G1 G2 D10
# 构造命令行参数解析器
parser = argparse.ArgumentParser(description='12306余票查询脚本')
# 添加命令行参数,车次之间使用空格分割,可以不传参数
parser.add_argument('train_no_list', metavar='train_no', type=str, nargs='*',
                    help='需要查询余票的列车车次(可选)')
# 解析命令行参数,将解析结果保存到args变量
args = parser.parse_args()

# 根据传入的参数获取列车余票信息
train_info = get_tickets(args.train_no_list)

# 解析余票信息并输出
parse_and_output(train_info)

五、示例说明

下面结合两个实际案例,来演示如何使用本脚本进行余票查询:

示例一

查询从北京到上海的G1和D20列车的余票情况:

python tickets.py G1 D20

运行结果示例:

+-------+----------------------+----------------------+-----------------+----------------+-------+-------------+-------------+-------------+-------------+----------------+-----------+--------+-----------+---------+-------+
|  车次 |        出发站        |        到达站        |     出发时间     |    到达时间    |  历时 |  商务座  |  特等座  |  一等座  |  二等座  |  高级软卧  |  软卧 | 动卧 |  硬卧  | 硬座  | 无座 |
+-------+----------------------+----------------------+-----------------+----------------+-------+-------------+-------------+-------------+-------------+----------------+-----------+--------+-----------+---------+-------+
|  G1   |         北京         |        上海虹桥      |   09:00  |   14:57  |  5小时57分钟  |      有       |      --       |      无       |      有       |         --           |     无    |        --         |       --        |   无    |
| D220  |         北京         |        上海南        |   21:02  |   06:39  |  9小时37分钟  |      无       |      无       |      无       |      无       |         --          |     无    |        --         |       无       |   有   |
+-------+----------------------+----------------------+-----------------+----------------+-------+-------------+-------------+-------------+-------------+----------------+-----------+--------+-----------+---------+-------+

示例二

查询指定日期内从北京到深圳的所有列车余票情况:

python tickets.py

运行结果示例:

+-------+----------------------+----------------------+-----------------+----------------+-------+-------------+-------------+-------------+-------------+----------------+-----------+--------+-----------+---------+-------+
|  车次 |        出发站        |        到达站        |     出发时间     |    到达时间    |  历时 |  商务座  |  特等座  |  一等座  |  二等座  |  高级软卧  |  软卧 | 动卧 |  硬卧  | 硬座  | 无座 |
+-------+----------------------+----------------------+-----------------+----------------+-------+-------------+-------------+-------------+-------------+----------------+-----------+--------+-----------+---------+-------+
|  D102 |         北京         |        深圳北       |   07:36  |   10:56  |   27小时20分钟  |      --       |      --       |      --       |      --       |         --          |     有    |        --         |       无       |   无    |
| D2286 |         北京         |        深圳          |   16:02  |   21:00  |   28小时58分钟  |      --       |      --       |      --       |      --       |          --         |     有    |        --         |       --        |   无    |
| D900  |         北京西       |        深圳北       |   19:38  |   23:08  |   27小时30分钟  |      --       |      --       |      --       |      --       |         --           |     --   |        --         |       无       |   --   |
|  G104 |         北京         |        深圳北       |   09:00  |   13:44  |   28小时44分钟  |      有       |      --       |      --       |      有       |         --           |     --   |        --         |       无       |   --   |
|  G2844|         北京南       |        深圳北       |   18:54  |   23:34  |   28小时40分钟  |      --       |      --       |      --       |      --       |         --           |     --   |        --         |       有          |   无    |
|  G72  |         北京南       |        深圳北       |   13:25  |   19:07  |   29小时42分钟  |      --       |      --       |      --      |      --       |         --           |     --   |        --         |       无       |   无    |
|  G80  |         北京南       |        深圳北       |   12:00  |   17:39  |   29小时39分钟  |      --       |      --       |      --      |      --       |         --           |     --   |        --         |       --        |   有   |
|  G96  |         北京南       |        深圳北       |   11:00  |   16:33  |   29小时33分钟  |      --       |      --       |      --      |      --       |         --           |     --   |        --         |       无       |   无    |
+-------+----------------------+----------------------+-----------------+----------------+-------+-------------+-------------+-------------+-------------+----------------+-----------+--------+-----------+---------+-------+

六、总结

通过本脚本的实现,我们可以轻松实现12306余票查询的任务,同时也提升了自己的编程技能。当然,本脚本还存在着很大的空间进行改进,比如增加输入校验、信息提示等功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:教你用python实现12306余票查询 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • 常用的正则表达式集锦

    以下是“常用的正则表达式集锦”的完整攻略: 一、问题描述 在文本处理中,正则表达式是一种非常强大的工具。本文将详细讲解常用的正则表达式集锦,并提供两个示例说明。 二、解决方案 2.1 常用的正则表达式 以下是常用的正则表达式集锦: 匹配数字:\d 匹配非数字:\D 匹配字母或数字:\w 匹配非字母或数字:\W 匹配空格:\s 匹配非空格:\S 匹配任意字符:…

    python 2023年5月14日
    00
  • 整理Python 常用string函数(收藏)

    整理Python 常用string函数(收藏) 1. split() 1.1 功能 函数split()是Python中一个常用的字符串函数,它以某个字符或字符串为分隔符,将一个字符串分割为多个子字符串,并返回一个由这些子字符串组成的列表。例如,可以使用split()将一个句子分割成多个单词。 1.2 语法 str.split([sep[, maxsplit]…

    python 2023年6月5日
    00
  • 读写json中文ASCII乱码问题的解决方法

    以下是“读写json中文ASCII乱码问题的解决方法”的完整攻略: 问题 在读写json文件时,如果处理中文时会遇到中文字符被自动转换成ASCII码而出现乱码的情况。 原因 这是由于不同的编码格式所导致的。在处理中文字符时,一般会用到UTF-8编码格式,而JSON默认使用的是Unicode编码格式。在进行转换时,如果没有正确设置编码格式,就可能会出现ASCI…

    python 2023年5月20日
    00
  • Python多线程结合队列下载百度音乐的方法

    Python多线程结合队列下载百度音乐的方法攻略如下: 步骤1:导入必要的库 在Python中,我们需要导入必要的库,包括requests库、os库、queue库和threading库。requests库用于发送HTTP请求,os库用于创建目录,queue库用于创建队列,threading库用于创建线程。使用以下命令导入这些库: import request…

    python 2023年5月15日
    00
  • python实现批量修改文件名代码

    下面是关于“python实现批量修改文件名代码”的详细攻略: 1. 了解python的os模块 在使用python处理文件操作时,需要使用到python的os模块。os模块是Python标准库中提供的用于处理文件和目录的模块,他提供了丰富的文件系统相关操作方法,例如修改文件名、复制文件、删除文件、遍历文件、建立目录、删除目录、获取文件信息等。参考文档:os …

    python 2023年6月5日
    00
  • python向量化与for循环耗时对比分析

    针对这个话题,我给出一份完整的攻略,供参考。 一、背景介绍 在使用Python进行科学计算的过程中,常常涉及数据的向量化运算(向量化表示可以同时操作整个向量的计算)。而在Python中,想要实现向量化操作,通常使用NumPy库,它提供高性能的多维数组对象以及相关计算工具。 而在NumPy中,可以使用矩阵和向量的运算,使得代码看起来更加简洁、方便,也能够提高代…

    python 2023年6月3日
    00
  • Python实现多任务进程示例

    这里是Python实现多任务进程示例的完整攻略。 1. 多任务进程简介 多任务进程可以同时运行多个程序,这些程序是相互独立的,互不干扰,可以充分利用计算机的资源。在Python中实现多任务进程有两种方式,分别是多进程和多线程。 2. 多进程实现多任务 2.1 创建进程 在Python中,可以通过multiprocessing模块来创建多个进程来实现多任务。下…

    python 2023年5月19日
    00
  • python pandas库读取excel/csv中指定行或列数据

    如何用Python Pandas库读取Excel或CSV文件中指定行或列的数据可以按照以下步骤进行。 准备 在代码中导入Pandas库: import pandas as pd 然后,使用以下代码一次性读取Excel或CSV文件: # 读取Excel文件 df = pd.read_excel(‘filename.xlsx’) # 读取CSV文件 df = p…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部