当你想查询一下火车票信息的时候,你还在上 12306 官网吗?或是打开你手机里的 APP?下面让我们来用 Python 写一个命令行版的火车票查看器, 只要在命令行敲一行命令就能获得你想要的火车票信息!如果你刚掌握了 Python 基础,这将是个不错的小练习。(注意:由于 12306 的接口经常变化,课程内容可能很快过期,如果遇到接口问题,需要根据最新的接口对代码进行适当修改才可以完成实验。)
1、知识点:
Python 基础知识的综合运用
Urllib,urllib2,json,cookielib库的使用
setuptools 的使用
2、效果截图:
3、部分代码(查询功能):
“2效果图”运用docopt、requests、colorama 及 prettytable 库,而今晚我们将为你讲述Urllib,urllib2,json,cookielib库的使用
# coding: utf-8
'''命令行火车票查看器 Usage: tickets [-dgktz] Options: -h, --help 查看帮助 -d 动车 -g 高铁 -k 快速 -t 特快 -z 直达 Examples: tickets 上海 北京 2017-5-10 tickets -dg 成都 南京 2017-5-10 '''
import requests from docopt import docopt from prettytable import PrettyTable from colorama import init, Fore from stations import stations init() class TrainsCollection: header = '车次 车站 时间 历时 一等 二等 软卧 硬卧 硬座 无座'.split() def __init__(self, available_trains, options):
'''查询到的火车班次集合 :param available_trains: 一个列表, 包含可获得的火车班次, 每个 火车班次是一个字典 :param options: 查询的选项, 如高铁, 动车, etc...
''' self.available_trains = available_trains self.options = options def _get_duration(self, raw_train): duration = raw_train.get('lishi').replace(':', '小时') + '分'
if duration.startswith('00'): return duration[4:] if duration.startswith('0'): return duration[1:] return duration @property
def trains(self):
for raw_train in self.available_trains: train_no = raw_train['station_train_code'] initial = train_no[0].lower() if not self.options or initial in self.options: train = [ train_no, '\n'.join([Fore.GREEN + raw_train['from_station_name'] + Fore.RESET, Fore.RED + raw_train['to_station_name'] + Fore.RESET]), '\n'.join([Fore.GREEN + raw_train['start_time'] + Fore.RESET, Fore.RED + raw_train['arrive_time'] + Fore.RESET]), self._get_duration(raw_train), raw_train['zy_num'], raw_train['ze_num'], raw_train['rw_num'], raw_train['yw_num'], raw_train['yz_num'], raw_train['wz_num'], ] 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['' ]) to_station = stations.get(arguments['' ]) date = arguments['' ] url = ('https://kyfw.12306.cn/otn/lcxxcx/query?' 'purpose_codes=ADULT&queryDate={}&' 'from_station={}&to_station={}').format( date, from_station, to_station ) options = ''.join([ key for key, value in arguments.items() if value is True ]) r = requests.get(url, verify=False) available_trains = r.json()['data']['datas'] TrainsCollection(available_trains, options).pretty_print() if __name__ == '__main__': cli()
查询实现思路及预定功能如何实现,就在今晚(2017.4.28星期五) 20:30 - 23:00 在线免费直播课,为你讲述。
联系客服