美文网首页
Python查询12306余票

Python查询12306余票

作者: 测试老杨 | 来源:发表于2018-01-27 00:18 被阅读83次

    一、requests等库的介绍

    requests:发送请求,获取响应内容

    docopt:命令行解析工具,可以根据自定义的语法格式,自动生成解析器

    prettytable:使用表格形式打印数据

    colorama:命令行着色

    二、开发环境搭建

    下载Python2的安装文件[windows版]

    https://www.python.org/

    安装Python2

    此处省略N个字

    配置环境变量

    修改环境变量Path,追加Python2的安装路径[C:\Python27]

    image

    检查环境是否正常

    image

    给eclipse工具安装Aptana插件

    image

    配置eclipse

    设置python解释器的路径[C:\Python27\python.exe]

    image

    三、安装相关的库

    安装requests库

    image

    安装docopt库

    pip install docopt

    安装prettytable库

    pip install prettytable

    安装colorama库

    pip install colorama

    四、创建一个python工程

    在eclipse里面创建一个python工程,如下图:

    image

    五、设计一个字典stations

    stations字典里面的数据为:站点和对应编码

    代码如下:

    # coding:utf-8
    
    stations = {   'ZhenJiang': 'ZJH',     #镇江
        'ZhenJiangNan': 'ZEH',             #镇江南
        'ShangHai':  'SHH'}                #上海
    
    

    附截图(代码文件名为stations.py):

    image

    六、编写查询余票的程序

    代码如下:

    # coding:utf-8
    
    """命令行火车票查看器
    
    Usage:
        tickets [-gdtkz] <from> <to> <date>
    
    """
    
    from docopt import docopt
    from stations import stations
    import requests
    from prettytable import PrettyTable
    from colorama import init, Fore
    
    init()
    
    
    class TrainsCollection:
        header = '车次  车站  时间  经历时  一等座  二等座  高级软卧  软卧  硬卧  硬座  无座'.split()
    
        def __init__(self, available_trains,available_place, options):
            """查询的火车班次集合
            :param available_trains: 一个列表, 包含可获得的火车班次, 每个
                                     火车班次是一个字典
            :param options: 查询的选项, 如高铁, 动车, etc...
            """
            self.available_trains = available_trains
            self.available_place = available_place
            self.options = options
    
        @property
        def trains(self):
            for raw_train in self.available_trains:
                raw_train_list = raw_train.split('|')
                train_no = raw_train_list[3]
                initial = train_no[0].lower()
                duration = raw_train_list[10]
                if initial in self.options:
                    train = [
                        train_no,
                        '\n'.join([Fore.LIGHTGREEN_EX + self.available_place[raw_train_list[6]] + Fore.RESET,
                                   Fore.LIGHTRED_EX + self.available_place[raw_train_list[7]] + Fore.RESET]),
                        '\n'.join([Fore.LIGHTGREEN_EX + raw_train_list[8] + Fore.RESET,
                                   Fore.LIGHTRED_EX + raw_train_list[9] + Fore.RESET]),
                        duration,
                        raw_train_list[-6] if raw_train_list[-6] else '--',
                        raw_train_list[-7] if raw_train_list[-7] else '--',
                        raw_train_list[-12] if raw_train_list[-12] else '--',
                        raw_train_list[-14] if raw_train_list[-14] else '--',
                        raw_train_list[-9] if raw_train_list[-9] else '--',
                        raw_train_list[-8] if raw_train_list[-8] else '--',
                        raw_train_list[-11] if raw_train_list[-11] else '--',
                    ]
                    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():
        """command-line interface"""
        arguments = docopt(__doc__) 
        
        from_station = stations.get(arguments['<from>'])   
        
        to_station = stations.get(arguments['<to>'])
        
        date = arguments['<date>']
    
        url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(
            date, from_station, to_station)    
        
        r = requests.get(url, verify=False)
    
        available_trains = r.json()['data']['result']
        available_place = r.json()['data']['map']
        options = ''.join([
            key for key, value in arguments.items() if value is True
        ])
        TrainsCollection(available_trains,available_place, options).pretty_print()
    
    
    if __name__ == '__main__':
        cli()
    
    

    附截图(代码文件名为tickets.py):

    image

    七、设置出发站、目的站等参数

    Eclipse里面设置相关的参数,参数列表内容如下:

    -gd ShangHai ZhenJiang 2018-01-28

    附截图:

    image

    八、执行查询余票的脚本

    在eclipse里运行该脚本

    附截图:

    image

    相关文章

      网友评论

          本文标题:Python查询12306余票

          本文链接:https://www.haomeiwen.com/subject/ioegaxtx.html