Python3火车票信息查询(2)

良辰美景奈何天

前一篇文章记录了利用Python查询火车票的的代码,本篇文章记录一下其中的一些知识点:
1、docopt
2、抓取数据requests
3、pprint、prettytable、colorama模块
4、Python类

1、docopt模块

首先介绍一下docopt:
docopt根据你写的文档描述,可以自动为你生成解析器,
可以非常容易的为你的python程序创建命令行界面(Command Line Interface,CLI)。
docopt的安装和一般的库没有什么区别 pip install docopt
他的使用方法是这样的:
由三个双引号括起来(当然是成对的),作为文档的标识,内容包括四部分:
1、脚本的功能解释
2、usage 是使用方法,第一个参数是脚本的名称,在[]内的是可选参数,<>是必选的参数
3、参数的说明
4、使用举例
可以看一下之前的代码:

"""命令行火车票查看器

Usage:
    tickets [-dgktz]   

Options:
    -h, --help 查看帮助
    -d         动车
    -g         高铁
    -k         快速
    -t         特快
    -z         直达

Examples:
    tickets 上海 安阳 2016-10-10
    tickets -dg 上海 安阳 2016-10-10
"""
接下来就是代码中获取参数,使用起来也是比较简单的
arguments = docopt(__doc__)
from_station = stations.get(arguments[''])
to_station = stations.get(arguments[''])
date = arguments['']

2、获取123306网站数据

第二个是获取12306的余票信息,通过requests的get函数
先是定义URL地址,然后通过requests.get(url)获取数据,
在本次的代码中,verify=False,忽略对SSL证书的验证,
获取的数据转换为json格式
通过r.json().keys() 可以查看都有哪些数据
dict_keys(['httpstatus', 'data', 'status', 'validateMessagesShowId', 'messages', 'validateMessages'])

3、pprint、prettytable、colorama模块

第三个是pprint模块的打印函数pprint
这个模块提供了一些比较好的打印函数,如果和json模块配合使用,对于输出结构化数据比较好

下面一段内容是从官方文档拷贝的,对这个函数进行了详细的说明:
pprint.pprint(object, stream=None, indent=1, width=80, depth=None)

Prints the formatted representation of object on stream, followed by a newline. If stream is None, sys.stdout is used. This may be used in the interactive interpreter instead of the print() function for inspecting values (you can even reassign print = pprint.pprint for use within a scope). indent, width and depth will be passed to the PrettyPrinter constructor as formatting parameters.

这部分的第二个内容是prettytable,这个模块不是Python的内置模块,需要自己安装
在上一篇文章中我们看到了prettytable的使用方法:
def pretty_print(self):
        pt = PrettyTable()
        pt._set_field_names(self.header)
        for train in self.trains:
            pt.add_row(train)
        print(pt)
这里先定义了一个prettytable的类pt,然后通过_set_fiel_names设置了表头,之后在循环里面依次添加行记录,然后打印出来

另外还看到了一种用法,增加了一些设置参数
x = PrettyTable(["name", "age", "sex", "money"])
x.align["name"] = "l" # 对齐方式
x.padding_width = 0 # 每个字段中的内容距离边界的距离,可以修改这个参数看看效果
x.add_row(["Rocky",20, "male", 8000])
x.add_row(["Alex",21, "male", 5000])
x.add_row(["Helen",22, "Female", 3000])
print x

这部分的最后一个内容是colorama,这个模块是用来对输出内容的颜色进行控制的
init(autoreset=True) 
 #通过使用autoreset参数可以让变色效果只对当前输出起作用,输出完成后颜色恢复默认设置
Fore.GREEN + raw_train['from_station_name'] # 输出绿色字符

4、Python的类知识

在本次的代码实现过程中,作者定义了一个类,用来将获取的车次信息整理为良好的输出格式,
对于Python类的信息在书上、网上可以查到好多资料,这里就不记录了,
刚刚开始的时候对类中的self不是很熟悉,用起来感觉很别扭,要勤加练习
面向对象技术简介
类(Class): 用来描述具有相同的属性和方法的对象的集合。
          它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。
           类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,
          可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量:定义在方法中的变量,只作用于当前实例的类。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。
          继承也允许把一个派生类的对象作为一个基类对象对待。          
          例如,有这样一个设计:一个Dog类型的对象派生自Animal类,
          这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

参考资料:
http://cn.python-requests.org/zh_CN/latest/user/advanced.html
http://hao.jobbole.com/docopt/
https://docs.python.org/3.2/library/pprint.html
https://github.com/dprince/python-prettytable
http://www.runoob.com/python/python-object.html
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820062641f3bcc60a4b164f8d91df476445697b9e000

你可能感兴趣的:(Python3火车票信息查询(2))