12306 查询列车

查票

请求查询 url 。拿到后面提交订单时所需要的 参数 。
  • 拿到出发站台的代码,建议用字典形式新建另外文件,方便取所需站台代码,后面无需再次请求站台代码页面。
#获取站台的前的代号
url='https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9094'
response = self.session.get(url=url, headers=headers)
#以字典方式来存储站台
content = response.text.split('@')
for info in content[1:]:
    context = info.split('|')
    self.code[context[1]] = context[2]
  • 获取出发时的信息,为了方便也可以将所需要的信息卸载前面的 getData1 中。
# 获取出发时间,出发站台,到达站台。为了方便也可以将所需要的信息卸载前面的 getData1 中。
getData1['train_date'] = input('请输入出发时间[2019-3-10]')
# 查询出发时间格式为 2019-3-10
getData1['from_station'] = input('请输入出发站台')
getData1['to_station'] = input('请输入到达站台')
  • 查询列车信息。因为是 get 请求,所以我们将请求的 data 格式化加入到 url 中。
#查询列车信息。因为是 get 请求,所以我们将请求的 data 格式化加入到url 中。
url = 'https://kyfw.12306.cn/otn/leftTicket/queryX?'
#将出发时间 出发站台 到达站台 数据发送查找火车票
data = {
    'leftTicketDTO.train_date':getData1['train_date'], 
    'leftTicketDTO.from_station': code[getData1['from_station']],#获取出发站台的代码 
    'leftTicketDTO.to_station': code[getData1['to_station']],#获取到达站台的代码
    'purpose_codes': 'ADULT'}#purpose_codes  ADULT -- 普通  0X00 -- 学生
# 将 data 格式化
data = urllib.parse.urlencode(data)
#数据拼接 url = url + data
response = self.session.get(url=url, headers= headers)
#将请求到的列车信息为 Json 格式,所以解析返回的信息
content = loads(response.content)
  • 将获取到的信息处理并显示出来。
if content['data']['result'] == '':
    print('未查找到该车次')    
    return
#将信息打印出来
print('|车次|出发时间|到达时间|历时|出发日|特等座|一等座|二等座|高级动卧|软卧|动卧|硬卧|硬座|无座|')
for str in content['data']['result']:
    str = str.split('|预订|')
    string = str[1].split('|')
    #获取列车的型号
    c = string[33]
    # 将后面需要使用的 secretStr 存储起来。按照 车次:secretStr 字典形式存储    
    self.secretStr[string[1]] = str[0]    
    # 将后面需要使用的 train_no 存储起来。按照 车次:train_no 字典形式存储    
    self.train_no[string[1]] = string[0]    
    # 将后面需要使用的 leftTicket 存储起来。按照 车次:leftTicket 字典形式存储    
    self.leftTicket[string[1]] = string[10]    
    # 将后面需要使用的 train_location 存储起来。按照 车次:train_location 字典形式存储    
    self.train_location[string[1]] = string[13]    
    # K  T  Z  列车信息    
    if  c == '1413': 
        #print('|软卧|硬卧|硬座|无座|')
        print('|%s| %s  | %s |%s|%s|     |     |      |        | %s |    | %s | %s | %s |'(string[1],string[6],string[7],string[8],string[11],string[21],string[26],string[27],string[24]))
# D  列车信息
    elif c == 'OMO' or c == 'OOM':
        #print('|一等座|二等座|无座|') 
        print('|%s| %s  | %s |%s|%s|    |  %s |  %s  |        |    |    |    |    | %s |'(string[1],string[6],string[7],string[8],string[11],string[29],string[28],string[24])) 
    # D  特殊列车信息
    elif c == 'OFAO':
            #print('高级动卧|动卧|二等座|无座|)
            print('|%s| %s  | %s |%s|%s|    |     |  %s  |   %s    |    | %s |    |    | %s |'(string[1],string[6],string[7],string[8],string[11],string[28],string[19],string[31],string[24]))    
    # G 列车信息    
    elif c == 'OM9':
        #print('|特等座|一等座|二等座|')
        print('|%s| %s  | %s |%s|%s| %s |  %s | %s  |        |    |     |    |   |    
|'(string[1],string[6],string[7],string[8],string[11],string[30],string[29],string[28]))
  • 获取需购买的列车号
# getData2['train_station'] 为需购买的列车号,如不想麻烦可以注释掉只需要在前面的 getData3 修改即可
getData2['train_station'] = input('请输入需要购买的列车号')
  • 查看列车经过站台。post 请求需提交 train_no,始发地,到达地,出发时间。(可以不用这一步,因为和购票没有关系)
 # 查看列车经过的站台
 url = 'https://kyfw.12306.cn/otn/czxx/queryByTrainNo?'
 data = 
 {
    'train_no': self.train_no[string[1]],#拿到在刚刚查询列车时拿到的列车号 
    'from_station_telecode': string[2],#事发地代号 
    'to_station_telecode': string[3],#到达地代号
    'depart_date': string[11][:4] + "-" + string[11][4:6] + "-" + string[11][6:8]#出发时间
}
# 将data转码
data = urllib.parse.urlencode(data)
# 拼接
urlurl = url + data
response = self.session.get(url=url, headers=headers)
content = loads(response.content)
context = content['data']['data']
print('|站序| 站名 |到站时间|出发时间|停留时间|')
for info in context:
    print('| %s |%s| %s | %s |%s|'%(info['station_no'],info['station_name'], 
info['arrive_time'], info['start_time'],info['stopover_time']))

查询列车信息就完成了,在这里主要的功能就是拿到后面需要提交订单时所需要的信息

github(https://github.com/Tedgar156/12306/tree/master)
如果觉得有用请点一下 star

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容