火车票车票查询-Python

一、相关代码

python 复制代码
# @Time: 2024/1/22 20:24
# @Author: 马龙强
# @File: 实现12306查票购票.py
# @software: PyCharm
"""

网址:https://www.12306.cn/index/
数据:车次信息
查票链接:https://kyfw.12306.cn/otn/leftTicket/queryE?leftTicketDTO.train_date=2024-01-23&leftTicketDTO.from_station=LON&leftTicketDTO.to_station=XUN&purpose_codes=ADULT
"""
import requests
from pprint import pprint
import json

#导入漂亮的制表
from prettytable import PrettyTable

"""查票功能
1.输入出发城市
2.输入目的城市
3.输入出发时间
根据输入城市 -> 通过 city.json 找到对应城市字母(station.json 对应车站)


12306自动购票


"""
#读取json文件
f = open('city.json',encoding='utf-8').read()
#转成json字典
city_data = json.loads(f)
# print(city_data)
from_city = input('请输入出发的城市:')
site_city = input('请输入到达的城市:')
from_time = input('请输入出发的时间:')  #2024-01-25
print('出发城市字母',city_data[from_city])
print('目的城市字母',city_data[site_city])

"""发送请求:模拟浏览器对于url地址发送请求"""
#请求网址
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
    "Cookie": "_uab_collina=170592620040439510680099; JSESSIONID=80E55A815952C4C2E5B1AC826CC88FF0; BIGipServerpassport=1005060362.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; route=6f50b51faa11b987e576cdb301e545c4; BIGipServerotn=2095579402.64545.0000; _jc_save_fromStation=%u6F2F%u6CB3%2CLON; _jc_save_toStation=%u4FE1%u9633%2CXUN; _jc_save_fromDate=2024-01-23; _jc_save_toDate=2024-01-22; _jc_save_wfdc_flag=dc"
}

url = f'https://kyfw.12306.cn/otn/leftTicket/queryE?leftTicketDTO.train_date={from_time}&leftTicketDTO.from_station={city_data[from_city]}&leftTicketDTO.to_station={city_data[site_city]}&purpose_codes=ADULT'

#发送请求
response = requests.get(url=url,headers=headers)
# print(response.json())
# print(response.text)
json_data = response.json()

#实例化一个对象
tb = PrettyTable()
#设置一个字段名
tb.field_names = [
    '序号',
    '车次',
    '出发时间',
    '到达时间',
    '时长',
    '特等座',
    '一等座',
    '二等座',
    '软卧',
    '硬卧',
    '硬座',
    '无座',
]
#设置序号
page = 1
# pprint(json_data)
#提取车次信息所在列表
result = json_data['data']['result']
# pprint(result)
#for循环遍历,提取列表里面的元素
for i in result:
    # print(i)
    #字符串分割 -> index列表
    index = i.split('|')
    # print(index)
    num = index[3]  #车次
    time_1 = index[8]   #出发时间
    time_2 = index[9]   #到达时间
    time_3 = index[10]  #时长
    topGrade = index[32]    #特等座
    first_class = index[31] #一等座
    second_class = index[30]    #二等座
    hrad_sleeper = index[28]    #硬卧
    hard_seat = index[29]   #硬座
    no_seat = index[26]     #无座
    soft_sleeper = index[23]    #软卧
    dit = {
        '车次': num,
        '出发时间': time_1,
        '到达时间': time_2,
        '时长': time_3,
        '特等座': topGrade,
        '一等座': first_class,
        '二等座': second_class,
        '软卧': soft_sleeper,
        '硬卧': hrad_sleeper,
        '硬座': hard_seat,
        '无座': no_seat,
    }

    #车次
    # print(index)
    # page = 0
    # for j in index:
    #     print(page,j,sep='****')
    #     page+=1
    # break
    #添加字段内容
    tb.add_row([
        page,
        num,
        time_1,
        time_2,
        time_3,
        topGrade,
        first_class,
        second_class,
        soft_sleeper,
        hrad_sleeper,
        hard_seat,
        no_seat,
    ])
    # print(dit)
    page +=1

print(tb)

二、结果

三、注意12306城市对应缩写city.json的获取

1.相关链接:12306城市名对应字母缩写 - 悟透 - 博客园 (cnblogs.com)

2.在桌面创建文本文件,复制内容到文本文件中,保存后,更改后缀为.json,放到与代码同级的目录中

四、过程请查看代码注释

相关推荐
想躺平的咸鱼干32 分钟前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
Owen_Q1 小时前
Denso Create Programming Contest 2025(AtCoder Beginner Contest 413)
开发语言·算法·职场和发展
·云扬·1 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
liulilittle2 小时前
C++ i386/AMD64平台汇编指令对齐长度获取实现
c语言·开发语言·汇编·c++
巴里巴气2 小时前
selenium基础知识 和 模拟登录selenium版本
爬虫·python·selenium·爬虫模拟登录
19892 小时前
【零基础学AI】第26讲:循环神经网络(RNN)与LSTM - 文本生成
人工智能·python·rnn·神经网络·机器学习·tensorflow·lstm
JavaEdge在掘金2 小时前
Redis 数据倾斜?别慌!从成因到解决方案,一文帮你搞定
python
ansurfen2 小时前
我的第一个AI项目:从零搭建RAG知识库的踩坑之旅
python·llm
Thomas_YXQ2 小时前
Unity URP法线贴图实现教程
开发语言·unity·性能优化·游戏引擎·unity3d·贴图·单一职责原则
前端付豪2 小时前
20、用 Python + API 打造终端天气预报工具(支持城市查询、天气图标、美化输出🧊
后端·python