查询python版本命令_python命令行查询12306火车票

程序很简单,主要是调用了12306的api。用法也很简单:输入出发地、目的地、乘车时间,将查询到的结果在命令行打印出来。对了,这个是我以前参照了:Python3 实现火车票查询工具_Python_实验楼 - 实验楼 ,现在我把简单修改了一下,适合新人练练手!

有两点需要注意:

1.from stations import stations这个是stations是个存储城市和代码的字典{},譬如南京,对应的城市代码是NKH,这个就是在stations里查找得出的。

2.主要用到了colorama,docopt,prettytable可以将命令行的查询结果以彩色表格形式打印。

3.用到了while True....这样可以保证程序一直循环,查询一次,输出结果以后,再次开始新一轮的查询。如果需要中断程序可以用ctrl+c。

使用方法如下:

"""
Usage:
    输入要查询的火车类型可以多选(动车d,高铁g,特快t,快速k,直达z)
    输入出发地、目的地、出发日期。
    查询结果以命令行形式自动呈现。

Examples:
    Please input the trainType you want to search :dgz
    Please input the city you want leave :南京
    Please input the city you will arrive :北京
    Please input the date(Example:2017-09-27) :2018-03-01
"""

程序截图如下:

7f7e89db67653f70ff6a559376f406b2.png

动态效果如下:

dc57d02f74143786ec5cd392cadbcd6f.png
https://www.zhihu.com/video/949055366730874880

程序源代码,包含两部分:1.stations.py 2.searchTrain.py

1.stations.py

import re
import requests
from pprint import pprint

url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9018'
requests.packages.urllib3.disable_warnings()#如果不加此句会有:InsecureRequestWarning: Unverified HTTPS request is being made
html = requests.get(url,verify=False)
station = re.findall(u'([u4e00-u9fa5]+)|([A-Z]+)', html.text)
stations = dict(station)
pprint(stations,indent = 4)

2.searchTrain.py

"""
Usage:
    输入要查询的火车类型可以多选(动车d,高铁g,特快t,快速k,直达z)
    输入出发地、目的地、出发日期。
    查询结果以命令行形式自动呈现。

Examples:
    Please input the trainType you want to search :dgz
    Please input the city you want leave :南京
    Please input the city you will arrive :北京
    Please input the date(Example:2017-09-27) :2018-03-01
"""
#coding = utf-8
#author = Lyon
#date = 2017-12-17
import json
import requests
from docopt import docopt
from prettytable import PrettyTable
from colorama import init,Fore
from stations import stations

class searchTrain:
    def __init__(self):
        self.trainOption = input('-d动车 -g高铁 -k快速 -t特快 -z直达,Please input the trainType you want to search :')
        self.fromStation = input('Please input the city you want leave :')
        self.toStation = input('Please input the city you will arrive :')
        self.tripDate = input('Please input the date(Example:2017-09-27) :')
        self.headers = {
            "Cookie":"自定义",
            "User-Agent": "自定义",
            }
        self.available_trains,self.options = self.searchTrain()

    @property
    def trains(self):
        for item in self.available_trains:
            cm = item.split('|')
            train_no = cm[3]
            initial = train_no[0].lower()
            if not self.options or initial in self.options:
                train = [
                train_no,
                'n'.join([Fore.GREEN + cm[6] + Fore.RESET,
                          Fore.RED + cm[7] + Fore.RESET]),
                'n'.join([Fore.GREEN + cm[8] + Fore.RESET,
                          Fore.RED + cm[9] + Fore.RESET]),
                cm[10],
                cm[32],
                cm[25],
                cm[31],
                cm[30],
                cm[21],
                cm[23],
                cm[28],
                cm[24],
                cm[29],
                cm[26],
                cm[22]   ]
                yield train

    def pretty_print(self):
        pt = PrettyTable()
        header = '车次 车站 时间 历时 商务座 特等座 一等 二等 高级软卧 软卧 硬卧 软座 硬座 无座 其他'.split()
        pt._set_field_names(header)
        for train in self.trains:
            pt.add_row(train)
        print(pt)

    def searchTrain(self):
        arguments = {
        'option':self.trainOption,
        'from':self.fromStation,
        'to':self.toStation,
        'date':self.tripDate
        }
        options = ''.join([item for item in arguments['option']])
        from_station, to_station, date = stations[arguments['from']] , stations[arguments['to']] , 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)
        requests.packages.urllib3.disable_warnings()
        html = requests.get(url,headers = self.headers,verify=False)
        available_trains = html.json()['data']['result']
        return available_trains,options

if __name__ == '__main__':
    while True:
        asd = searchTrain()
        asd.pretty_print()

后续:其实查询还是很简单的,就是调用API接口,输入查询关键词就OK了,但是要想完整地实现购买火车票的流程,还是一个比较复杂的项目,Github上有完整的项目,喜欢的童鞋可以上去看看~testerSunshine/12306

彩蛋:

下一篇文章:Python命令行实现—查全国7天天气

下下篇文章:Python—itchat实现微信自动回复

下下下篇文章:Python实现微信查天气+火车+飞机+快递!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值