一、查询全国车站电报码
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()