一、requests等库的介绍
requests:发送请求,获取响应内容
docopt:命令行解析工具,可以根据自定义的语法格式,自动生成解析器
prettytable:使用表格形式打印数据
colorama:命令行着色
二、开发环境搭建
下载Python2的安装文件[windows版]
安装Python2
此处省略N个字
配置环境变量
修改环境变量Path,追加Python2的安装路径[C:\Python27]
检查环境是否正常
给eclipse工具安装Aptana插件
配置eclipse
设置python解释器的路径[C:\Python27\python.exe]
三、安装相关的库
安装requests库
安装docopt库
pip install docopt
安装prettytable库
pip install prettytable
安装colorama库
pip install colorama
四、创建一个python工程
在eclipse里面创建一个python工程,如下图:
五、设计一个字典stations
stations字典里面的数据为:站点和对应编码
代码如下:
# coding:utf-8
stations = { 'ZhenJiang': 'ZJH', #镇江
'ZhenJiangNan': 'ZEH', #镇江南
'ShangHai': 'SHH'} #上海
附截图(代码文件名为stations.py):
六、编写查询余票的程序
代码如下:
# 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):
七、设置出发站、目的站等参数
Eclipse里面设置相关的参数,参数列表内容如下:
-gd ShangHai ZhenJiang 2018-01-28
附截图:
八、执行查询余票的脚本
在eclipse里运行该脚本
附截图: