在win10上利用Python3.6制作火车票余票查询小程序

import re
import requests
from pprint import pprint 

url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971'
response = requests.get(url, verify=False)
stations = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text)
pprint(dict(stations), indent=4)



将上面代码运行产生的输出保存为stations.py,并将字典赋给变量stations
用pip安装没有的模块,具体的一些程序的作用可以参考实验楼中关于火车票余票查询的课程
from stations import stations
from prettytable import PrettyTable#格式化信息打印工具
import requests
import urllib3
import copy
from colorama import init, Fore#命令行着色工具

init()
"""取键,返回中文车站名"""
def _get_keys(station_eg):
    for key in stations:
        if stations[key] == station_eg:
            return key


class TrainsCollection:
    header = '车次 车站 时间 历时 商务座 一等座 二等座 高级软卧 软卧 动卧 硬卧 软座 硬座 无座 其他'.split()
    
    def __init__(self, available_trains):
        """
        :param available_trains: 官网提取到的json数据列表
        """
        self.available_trains = available_trains

    """切割"""
    def _cut_train(self):
        saperated_info = []
        for i in range(len(self.available_trains)):
            saperated_info.append((self.available_trains[i]).split('|'))
        #print(saperated_info[0])
        """构建字典列表"""
        dict_header = ['train_number', 'from_station', 'to_station', 'from_time', 'to_time', 'spend_time',
                       'business_class', 'first_class', 'second_class', 'Advanced_soft_sleeper', 'soft_sleeper',
                       'PowerCar_sleeper', 'hard_sleeper', 'soft_seat', 'hard_seat', 'none_seat', 'other']
        refer_to_num = [ 3, 6, 7, 8, 9, 10, 32, 31, 30, 21, 23, 33, 28, 24, 29, 26, 22]
        train_list = []
        train_dict = {}
        for times in range(len(saperated_info)):
            for key in range(len(dict_header)):
                if saperated_info[times][refer_to_num[key]]:
                    train_dict[dict_header[key]] = saperated_info[times][refer_to_num[key]]
                else:
                    train_dict[dict_header[key]] = '--'
            train_list.append(copy.deepcopy(train_dict))
        return train_list

    @property
    def trains(self):
        for raw_train in self._cut_train():
            train_no = raw_train['train_number']
            initial = train_no[0].lower()
            train = [
                    train_no,
                    '\n'.join([Fore.GREEN + _get_keys(raw_train['from_station']) + Fore.RESET,
                    Fore.RED + _get_keys(raw_train['to_station']) + Fore.RESET]),
                    '\n'.join([Fore.GREEN + raw_train['from_time'] + Fore.RESET,
                    Fore.RED + raw_train['to_time'] + Fore.RESET]),
                    raw_train['spend_time'],
                    raw_train['business_class'],
                    raw_train['first_class'],
                    raw_train['second_class'],
                    raw_train['Advanced_soft_sleeper'],
                    raw_train['soft_sleeper'],
                    raw_train['PowerCar_sleeper'],
                    raw_train['hard_sleeper'],
                    raw_train['soft_seat'],
                    raw_train['hard_seat'],
                    raw_train['none_seat'],
                    raw_train['other'],
                 ]
            yield train

    def pretty_print(self):
        pt = PrettyTable()
        pt._set_field_names(self.header)
        for train in self.trains:
            pt.add_row(train)
        print(pt)


def cli():
    StartStation = input('出发地:')
    EndStation = input('目的地:')
    Data = input('出发日期:')
    from_station = stations[StartStation]
    to_station = stations[EndStation]
    date = Data
    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)

    urllib3.disable_warnings()
    r = requests.get(url, verify=False)
    available_trains = r.json()['data']['result']
    TrainsCollection(available_trains).pretty_print()

if __name__ == '__main__':
    print('Example:\r')
    print('出发地:南京\n目的地:北京\n出发日期:2017-07-07\n')
    while(True):
        cli()

效果如下图所示:

 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Auto FAE进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值