火车票信息


```python
#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'Holic'
import requests,time,re

# 获取城市名和城市代码
class Check_Hcp():
    def __init__(self):
        self.Result,self.Station,self.Code=self.Get_Station()
        self.FromStations_ToBJ = ["怀化南","三穗","贵定北","凯里南","铜仁南","芷江","贵阳北","安顺西","关岭","曲靖北","昆明南"]
        self.ToStations_ToBJ = ["北京","保定东","石家庄",
                                "高邑西","邯郸东","安阳东","新乡东","郑州东",
                                "漯河西","驻马店西","信阳东","武汉",
                                "赤壁北","长沙南",
                                "湘潭北","韶山南","娄底南","邵阳北","新化南"]
        self.ToStations_ToHome = list(set(self.FromStations_ToBJ).union(set(self.ToStations_ToBJ)))
        self.ToStations_ToHome.remove("北京")
        print(self.ToStations_ToHome)
        self.StationsNo_ToBJ=["G82","G404","G402","G406","D940"]

        self.StationsNo_ToHome=["G81","G401","G403","G405","D939"]

    # 获取火车站台信息
    def Get_Station(self):
        # 关闭https证书验证警告
        requests.packages.urllib3.disable_warnings()
        # 12306的城市名和城市代码js文件url
        url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9018'
        try:
            r = requests.get(url, verify=False)
        except:
            return False,"",""
        else:
            pattern = u'([\u4e00-\u9fa5]+)\|([A-Z]+)'
            result = re.findall(pattern, r.text)
            code_dict = {v: k for k, v in dict(result).items()}
            print(code_dict)
            return True,dict(result),code_dict

    # 获取请求网址
    def Get_Url(self,text):
        if self.Result==False:
            date, from_station, to_station = '--', '--', '--'
        else:
            # 返回调用api的url链接
            # 解析参数 aggs[0]里是固定字符串:车票查询 用于匹配公众号接口
            args = str(text).split(' ')
            try:
                date = args[1]
                from_station_name = args[2]
                to_station_name = args[3]
                from_station = self.Station[from_station_name]
                to_station = self.Station[to_station_name]
            except:
                date, from_station, to_station = '--', '--', '--'
                # 将城市名转换为城市代码
        # api url 构造
        url = (
            'https://kyfw.12306.cn/otn/leftTicket/query?'
            'leftTicketDTO.train_date={}&'
            'leftTicketDTO.from_station={}&'
            'leftTicketDTO.to_station={}&'
            'purpose_codes=ADULT'
        ).format(date, from_station, to_station)
        return url

    # 根据Url查询火车票信息
    def Query_Train_Info(self,url):
        '''
        查询火车票信息:
        返回 信息查询列表
        '''
        info_list = []
        try:
            r = requests.get(url, verify=False)
            # 获取返回的json数据里的data字段的result结果
            raw_trains = r.json()['data']['result']

            for raw_train in raw_trains:
                # 循环遍历每辆列车的信息
                data_list = raw_train.split('|')

                # 车次号码
                train_no = data_list[3]

                # 出发站
                from_station_code = data_list[6]
                from_station_name = self.Code[from_station_code]
                # 终点站
                to_station_code = data_list[7]
                to_station_name = self.Code[to_station_code]
                # 出发时间
                start_time = data_list[8]
                # 到达时间
                arrive_time = data_list[9]
                # 总耗时
                time_fucked_up = data_list[10]
                # 一等座
                first_class_seat = data_list[31] or '--'
                if first_class_seat=="无":first_class_seat="--"

                # 二等座
                second_class_seat = data_list[30] or '--'
                if second_class_seat=="无":second_class_seat="--"

                # 软卧
                soft_sleep = data_list[23] or '--'
                if soft_sleep=="无":soft_sleep="--"

                #判断所需车次
                if first_class_seat=="--" and second_class_seat=="--" and soft_sleep=="--":
                    continue

                # 硬卧
                hard_sleep = data_list[28] or '--'
                # 硬座
                hard_seat = data_list[29] or '--'
                # 无座
                no_seat = data_list[26] or '--'

                # # 打印查询结果
                # info = (
                # '车次:{}\n出发站:{}\n目的地:{}\n出发时间:{}\n到达时间:{}\n消耗时间:{}\n座位情况:\n 一等座:「{}」 \n二等座:「{}」\n软卧:「{}」\n硬卧:「{}」\n硬座:「{}」\n无座:「{}」\n\n'.format(
                #     train_no, from_station_name, to_station_name, start_time, arrive_time, time_fucked_up, first_class_seat,
                #     second_class_seat, soft_sleep, hard_sleep, hard_seat, no_seat))
                # 打印查询结果
                info = (
                '【车次:{}】【出发站:{}】【目的地:{}】【出发时间:{}】【到达时间:{}】【消耗时间:{}】\n【座位情况】:一等座:「{}」 二等座:「{}」软卧:「{}」'.format(
                    train_no, from_station_name, to_station_name, start_time, arrive_time, time_fucked_up, first_class_seat,
                    second_class_seat, soft_sleep))
                # print(info)
                # print("-"*50)
                info_list.append(info)

            return True,info_list
        except:
            return False,' 输出信息有误,请重新输入【%s】' %url
    def Query_Text(self,Date,FromStation,ToStation):
        Result, infos = self.Query_Train_Info(self.Get_Url(r" %s " % Date + FromStation + " " + ToStation))
        if Result:
            for info in infos:
                print(info)
                print("-"*50)
        else:
            print(infos)

    def Query_Holic(self,data,way="Home"):
        if way=="BJ":
            FromStations=self.FromStations_ToBJ
            ToStations=self.ToStations_ToBJ
            TranNos=self.StationsNo_ToBJ
        elif way=="Home":
            FromStations=["北京"]
            ToStations=self.ToStations_ToHome
            TranNos=self.StationsNo_ToHome
        else:
            return

        for FromStation in FromStations:
            for ToStation in ToStations:
                Result,infos=self.Query_Train_Info(self.Get_Url(r" %s " %data + FromStation + " " + ToStation))
                if Result:
                    for info in infos:
                        TranNo =re.findall(u"【车次:(.+)】【出发站",info)[0]
                        if TranNo in TranNos:
                            print(info)
                            print("-"*50)
                else:
                    print(infos)

if __name__ == '__main__':
    # Check_Hcp().Query_Holic("2018-12-01",way="BJ")
    Check_Hcp().Query_Text("2018-12-3","上海","天津")


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值