为方便查询12306的火车票信息,在此用python写了一个小工具,主要用到了docopt、requests、re、prettytable几个模块。其中:

docopt模块作用是创建一个简洁漂亮的命令行交互界面,区别于sys.argv;

requests模块作用是实现http请求,区别于urllib、urllib2等模块;

re模块作用是正则表达匹配,用于匹配中文字符;

prettytable模块作用是创建一个简单直视的表格,用于打印火车票信息。

1.docopt命令行交互

""" Usage: 12306.py 12306.py (-h|--help) Options: -h,--help show this help Example: 12306.py 青岛 苏州北 2016-10-05 """

from docopt import docopt

if __name__ == "__main__":

argu = docopt(__doc__)

print argu

以上就是我们脚本的命令行交互信息,当执行命令格式有误时,会打印此信息。

如:

root@yanggd-OptiPlex-380:~/python# python 12306.py 青岛

Usage:

12306.py

12306.py (-h|--help)

root@yanggd-OptiPlex-380:~/python# python 12306.py -h

Usage:

12306.py

12306.py (-h|--help)

Options:

-h,--help show this help

Example:

12306.py 青岛 苏州北 2016-10-05

注意:

(1).Usage和Options之间必须有空行,否则Options中的内容会全部当做变量

(2).Usage中命令行格式必须是此命令的全部运行方式,否则当运行到没有定义的格式时会打印help信息

(3).Options中的可选参数后面应该用2个以上的空格,不要用tab,否则会报错

(4).Options中的可选参数应该空2个格,否则会有问题

因此,我们需要先获得每个站点对应的代码信息:

station_code_url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8955"

#去除https访问的警告信息

requests.packages.urllib3.disable_warnings()

r = requests.get(station_code_url, verify=False)

station_code_html = r.text

station_code = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', station_code_html)

station_code_dict = dict(station_code)

source = station_code_dict.get(argu[''].decode("utf-8"))

des = station_code_dict.get(argu[''].decode("utf-8"))

其中,我们利用re,通过中文字符对应的unicode字符为’([\u4e00-\u9fa5]+)|([A-Z]+)’来正则匹配站点对应代码的中文字符,然后将站点、代码初始化成字典的格式。

注意:由于站点以unicode字符存于字典中,因此当我们从命令行中读取到中文站点时,需要先decode成unicode的格式,才能在字典中匹配到对应的站点,进而得到站点的代码。

3.打印车票信息

由于查询到的数据以json格式输出,因此我们需要requests模块获取到json串,然后通过prettytable来格式化输出车票信息,方便我们能够直视

query_url = "https://kyfw.12306.cn/otn/leftTicket/queryT?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(date, source, des)

table = PrettyTable(["车次", "出发站", "到达站", "出发时间", "到达时间", "历时", "商务座", "特等座", "一等座", "二等座", "高级软卧", "软卧", "硬 卧", "软座", "硬座", "无座", "其他"])

r2 = requests.get(query_url, verify=False)

for info in r2.json()["data"]:

detail = info["queryLeftNewDTO"]

table.add_row([detail["station_train_code"], detail["start_station_name"], detail["to_station_name"], detail["start_time"], detail["arrive_time"], detail["lishi"], detail["swz_num"], detail["tz_num"], detail["zy_num"], detail["ze_num"], detail["gr_num"], detail["rw_num"], detail["yw_num"], detail["rz_num"], detail["yz_num"], detail["wz_num"], detail["qt_num"]])

#打印车次信息

print table

最后的代码为:

#!/usr/bin/env python

#-*- coding: utf-8 -*-

""" Usage: 12306.py 12306.py (-h|--help) Options: -h,--help show this help Example: 12306.py 青岛 苏州北 2016-10-05 """

import re

import requests

from docopt import docopt

from prettytable import PrettyTable

if __name__ == "__main__":

argu = docopt(__doc__)

station_code_url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8955"

#去除https访问的警告信息

requests.packages.urllib3.disable_warnings()

r = requests.get(station_code_url, verify=False)

station_code_html = r.text

#过滤中文字符

station_code = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', station_code_html)

station_code_dict = dict(station_code)

#获取站点的代码

source = station_code_dict.get(argu[''].decode("utf-8"))

des = station_code_dict.get(argu[''].decode("utf-8"))

date = argu['']

query_url = "https://kyfw.12306.cn/otn/leftTicket/queryT?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(date, source, des)

table = PrettyTable(["车次", "出发站", "到达站", "出发时间", "到达时间", "历时", "商务座", "特等座", "一等座", "二等座", "高级软卧", "软卧", "硬 卧", "软座", "硬座", "无座", "其他"])

r2 = requests.get(query_url, verify=False)

for info in r2.json()["data"]:

detail = info["queryLeftNewDTO"]

table.add_row([detail["station_train_code"], detail["start_station_name"], detail["to_station_name"], detail["start_time"], detail["arrive_time"], detail["lishi"], detail["swz_num"], detail["tz_num"], detail["zy_num"], detail["ze_num"], detail["gr_num"], detail["rw_num"], detail["yw_num"], detail["rz_num"], detail["yz_num"], detail["wz_num"], detail["qt_num"]])

#打印车次信息

print table

查询结果为:

root@yanggd-OptiPlex-380:~/python# python 12306.py 青岛 北京 2016-10-10

+------+--------+--------+----------+----------+-------+--------+--------+--------+--------+----------+------+------+------+------+------+------+

| 车次 | 出发站 | 到达站 | 出发时间 | 到达时间 | 历时 | 商务座 | 特等座 | 一等座 | 二等座 | 高级软卧 | 软卧 | 硬卧 | 软座 | 硬座 | 无座 | 其他 |

+------+--------+--------+----------+----------+-------+--------+--------+--------+--------+----------+------+------+------+------+------+------+

| G178 | 青岛 | 北京南 | 07:02 | 11:51 | 04:49 | 4 | -- | 无 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G180 | 青岛 | 北京南 | 07:10 | 12:01 | 04:51 | 1 | -- | 无 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G182 | 青岛 | 北京南 | 08:20 | 12:58 | 04:38 | 8 | -- | 无 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G184 | 青岛 | 北京南 | 09:29 | 14:18 | 04:49 | 5 | -- | 有 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G186 | 青岛 | 北京南 | 10:22 | 15:14 | 04:52 | 13 | -- | 有 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G188 | 青岛 | 北京南 | 11:27 | 16:22 | 04:55 | 2 | -- | 无 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G190 | 青岛 | 北京南 | 12:14 | 17:05 | 04:51 | 6 | -- | 12 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G192 | 青岛 | 北京南 | 12:32 | 17:17 | 04:45 | 17 | -- | 有 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G194 | 青岛 | 北京南 | 14:30 | 19:18 | 04:48 | 18 | -- | 有 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G196 | 青岛 | 北京南 | 16:00 | 20:40 | 04:40 | 有 | -- | 有 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G198 | 青岛 | 北京南 | 17:11 | 22:02 | 04:51 | 20 | -- | 有 | 有 | -- | -- | -- | -- | -- | -- | -- |

| G200 | 青岛 | 北京南 | 18:35 | 23:38 | 05:03 | 3 | -- | 14 | 有 | -- | -- | -- | -- | -- | -- | -- |

| Z8 | 青岛北 | 北京 | 21:00 | 06:10 | 09:10 | -- | -- | -- | -- | -- | 有 | -- | 无 | -- | -- | -- |

+------+--------+--------+----------+----------+-------+--------+--------+--------+--------+----------+------+------+------+------+------+------+

python识别火车票二维码_python实现12306查询火车票相关推荐

  1. python识别发票二维码_Python 实现二维码生成和识别

    今天突然想给自己自己做个头像,然后还是二维码的形式,这样只要扫一扫就可以访问我的主页.然后就开始自己的苦逼之路... 其实实现二维码java,c#,C++等都可以实现:由于自己正在学python,所以 ...

  2. python识别发票二维码_python如何实现二维码的生成和识别

    安装: pip install myqr pip install pyzbr pip install pil 报错请切换 pip install pillow # 扫描二维码,直接访问words指定的 ...

  3. python识别火车票二维码_python实现的一个火车票转让信息采集器

    好吧,我承认我是对晚上看到一张合适的票转让但打过电话去说已经被搞走了这件事情感到蛋疼.直接上文件吧. #coding: utf-8'''春运查询火车票转让信息Author: piglei2007@gm ...

  4. 用python识别条形码,二维码并且定位标注

    原理很简单用OpenCV处理图片pyzbar识别条形码 python里面有一个包pyzbar可以用识别二维码和条形码,我们再结合OpenCV处理图片的功能就可以标注出二维码位置内容 我们生活中的常见的 ...

  5. python制作微信二维码_Python提取支付宝和微信支付二维码的示例代码

    支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件 ...

  6. 用python生成个性二维码_python生成个性二维码学习笔记

    在linux环境下进行编码 1.先进家目录,自行创建Code文件夹 cd Code 2.下载MyQR库 sudo pip3 install MyQR 3.下载所需资源文件并解压 Code/ $ wge ...

  7. 用python生成个性二维码_Python 生成个性二维码

    1.1 实验内容 本课程通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小.是否在现有图片的基础上生成.是否生成动态二维码. 本课程主要面向Python3初学者. 1.2 知识点 P ...

  8. python识别火车票二维码_Python 实现火车票查询工具

    一.实验简介 当你想查询一下火车票信息的时候,你还在上 12306 官网吗?或是打开你手机里的 APP? 下面让我们来用 Python 写一个命令行版的火车票查看器, 只要在命令行敲一行命令就能获得你 ...

  9. python识别火车票二维码_Python实现查询12306火车票信息

    例子来源于马哥的公众号,看了几遍,有些地方存在些疑问,然后就自己查找些资料,重写的一下,但是对于获取到的信息,并不能有效的解析出来,而且对于中文字符处理,并不是很好,请大神指教下!谢过! 1.接口设置 ...

  10. python实现二维码识别软件_OpenCV和Zbar两个Python模块实现二维码和条形码识别

    在我们的日常生活中,处处可见条形码和二维码. 在以前,我们去逛书店时,或者你现在随手拿起你身边的一本书,你肯定能看到书本的封页后面印有一排黑色线条组成的标签,也就是条形码:你去你们学校的自助机上借书还 ...

最新文章

  1. 在Ubuntu 14.04 64bit上安装下载管理器FlareGet 4.2.92
  2. 黄聪:VS2010开发T4模版引擎之基础入门
  3. 如何写好注释,让同事赞不绝口?
  4. 模拟投掷硬币100次
  5. matplotlib画散点图
  6. 解决报表部署时数据源存在不能替换的问题
  7. OSChina 周六乱弹 —— 这个版本的小红帽听说过吗?
  8. 数据湖,已成为海量数据存储与分析的重要承载方式
  9. 2.Flask-jinjia2模板
  10. 收款码合并有什么弊端_为什么明明有个人收款码了,还要申请微信收款商业版?...
  11. Docker学习总结(17)——学会使用Dockerfile
  12. 第一范式转化为第二范式_深度解读《中国智能经济发展白皮书》:AI为核心驱动力,百度给出智能范式...
  13. 15.Linux 高性能服务器编程 --- 进程池和线程池
  14. Intel酷睿前世今生(二)
  15. android开源进度条,Android github开源进度条类框架SmoothProgressBar的使用
  16. python-回文字符串
  17. android关机铃声代码,android系统添加关机铃声
  18. PhantomReference虚引用
  19. 【格式化文档】ISO27001控制措施+ISO27002实施指南 【上】
  20. IDEA中连接MySQL时报错:Server returns invalid timezone

热门文章

  1. 摄氏度和开氏度的换算_摄氏温度和华氏、开氏温度_温度表示符号及单位换算...
  2. 任正非讲话稿400篇_伟大背后是苦难!任正非“思想之路”:400+讲话稿合集
  3. PHP外包简易加密后门
  4. linux无线网卡ucod文件,基于Linux的无线网卡驱动程序
  5. vue 获取HTML源码
  6. Hulu热招 | ADI广告数据和算法团队
  7. 青年计算机技术专家,院士专家热议推动计算机技术自立自强
  8. 那些年你用过最好的键盘
  9. Linux 字体存放位置及字体安装
  10. Java实现OPC通信