12306之查询余票

一、查询全国车站电报码

1.地址

url ='https://kyfw.12306.cn/otn/resources/js/framework/station_name.js'

2.解析数据

data_str = req.text.strip("var station_names =';") #将头部和尾部删掉
data_list = data_str.split('@')[1:]  #使用@分割成列表
list_temp = data_list[0].split('|')    # 以 | 为分隔符,分割数据

3.分析数据

拼音缩写 中文名称 电报码 拼音全拼 拼音第一个之母 序号
bjb 北京北 VAP beijingbei bjb 0
bjd 北京东 BOP beijingdong bjd 1
... ... ... ... ... ...

从中分析:我们只需要中文名称和电报码,电报码用于查询车次,中文名称用于显示。

二、查询车次

1.地址

url = 'https://kyfw.12306.cn/otn/leftTicket/queryT'

2.请求参数

参数 格式 说明
leftTicketDTO.train_date 2021-01-11 查询日期
leftTicketDTO.from_station GIW 出发站电报码
leftTicketDTO.to_station ZYE 到达站电报码
purpose_codes ADULT 默认不变

3.解析数据

data_json = json.loads(req.text)
result = data_json['data']['result']
list_temp = result[0].split("|")

4.分析数据

list_temp列表 内容 说明
[1] 预定
[2] 710000K8720M 列车编号
[3] K872 车次
[4] ZJZ 起点站
[5] ICW 终点站
[6] GIW 出发站
[7] ZYE 到达站
[8] 05:24 出发时间
[9] 06:51 到达时间
[10] 01:27 历时
[11] Y/N 是否有票
[13] 20210111 日期
[32] 特等座
[31] 一等座
[30] 二等座
[29] 硬座
[28] 硬卧
[26] 无座
[23] 2 软卧

三、实现余票查询-源码

__author__ = 'ztaos'
#coding:utf-8

import requests
import json

class Kyfw(object):

    def __init__(self):
        self.target = "https://www.12306.cn/"
        self.header = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest',
            'Cookie': 'cookie'   #浏览器获取
        }
        self.data = {
            'leftTicketDTO.train_date':'2021-01-11',    #时间
            'leftTicketDTO.from_station':'GIW',         #出发地
            'leftTicketDTO.to_station':'ZYE',           #到达地
            'purpose_codes':'ADULT',
        }
        self.station_name = {}

    def get_station_name(self):
        """
        从12306 获取所有车站信息
        :return:
        """
        url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js'
        req = requests.get(url,headers=self.header)
        data_str = req.text.strip("var station_names =';") #将头部和尾部删掉
        data_list = data_str.split('@')[1:]  #使用@分割成列表
        #数据存入字典
        for r in data_list:
            list_temp =r.split('|')
            self.station_name[list_temp[2]] =list_temp[1]

    def get_station_info(self):
        """
        查询车票信息
        :return:
        """
        url = "https://kyfw.12306.cn/otn/leftTicket/queryT"
        req = requests.get(url=url,headers=self.header,params=self.data)
        data_json = json.loads(req.text)
        result = data_json['data']['result']
        print("乘车日期:%s"%self.data['leftTicketDTO.train_date'])
        print("车次\t出发站名\t到达站名\t出发时间\t到达时间\t特等座\t一等座\t二等座\t硬座\t无座\t硬卧\t软卧")
        for r in result:
            list_temp = r.split("|")                 #以 | 为分隔符,分割数据
            if list_temp[11] == 'Y':                 #确认是否有票
                print(list_temp[3]+"\t"+self.station_name[list_temp[6]]+"\t\t"+self.station_name[list_temp[7]]+"\t\t"+list_temp[8]+"\t\t"+list_temp[9]+"\t\t"+list_temp[32]+"\t\t"+list_temp[31]+"\t\t"+list_temp[30]+"\t\t"+list_temp[29]+"\t\t"+list_temp[26]+"\t\t"+list_temp[28]+"\t\t"+list_temp[23])

kyfw = Kyfw()
kyfw.get_station_name()
kyfw.get_station_info()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容