Python3实现火车票查询工具
Python 实现火车票查询工具
一. 实验介绍
通过python3实现一个简单的命令行版本的火车票查询工具,用实际中的例子会更感兴趣,不管怎么样,既练习了又可以自己使用。
1. 知识点:
- Python 基础知识的综合运用
- docopt, requests, colorama, prettytable 库的使用
- setuptools 的使用
2. 效果截图:
二. 接口设计
接口我们就按照12306官网的查询格式如下:
程序名: pickets
查询方式: 程序名 出发地 目的地 出发日
火车类型:
-g 高铁
-d 动车
-t 特快
-k 快速
-z 直达
最终组合接口为:
python pickets.py [-gdtkz] from to date
三. 代码实现
根据接口设计需要安装的库:
G:\Python项目实战\pickets>pip3 install requests prettytable docopt colorama
requests: 使用Python访问HTTP资源的必备库
详细使用请访问:http://www.cnblogs.com/python-nameless/p/6013647.html
prettytable: 可以将打印内容格式化为像MySQL一样的输出
详细使用请访问:http://www.cnblogs.com/python-nameless/p/6013698.html
docopt:命令行参数解析工具
详细使用请访问:https://github.com/docopt/docopt
colorama: 命令行着色工具
1. 解析参数
docopt模块可以按照我们自己在文档字符串定义的格式来解析参数,如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# __Author__: Hong """火车票查询工具 Usage:
tickets [-gdtkz] <from> <to> <date> 注意:Usage为固定词汇,其他报错。 Options:
-h,--help 显示帮助菜单
-g 高铁
-d 动车
-t 特快
-k 快速
-z 直达 Example:
tickets 北京 大同 2016-08-28
tickets -t 北京 大同 2016-08-28
"""
from docopt import docopt
from requests import request
import prettytable
import colorama def cli():
"""command-line interface""" arguments = docopt(__doc__)
print(arguments) if __name__ == '__main__':
cli()
由上面的程序中,docopt会根据我们在docstring中定义的格式解析参数并返回一个字典(arguments),例如查询北京到大同的特快如下:
G:\Python项目实战\pickets>python pickets.py -tk 北京 大同 --
参数解析结果:
G:\Python项目实战\pickets>python pickets.py -tk 北京 大同 --
{'-d': False,
'-g': False,
'-k': True,
'-t': True,
'-z': False,
'<date>': '2016-10-30',
'<from>': '北京',
'<to>': '大同'}
2. 获取数据
参数解析好以后,我们可以通过12306官网获取我们需要的数据,IE浏览器打开12306官网的查票系统,输入出发地,目的地,日期,查询,通过F12开发者模式找到请求地址(刷新一次):

通过此请求URL,我们可以看到有我们需要的信息,或者直接点击参数查看:
可以看到参数为:出发地 查询类型(成人,学生) 日期 目的地

通过正文可以看到:返回一个json格式的数据,即一个字典,里边包括了各个站点的中文名和站点代号,我们可以利用这个接口来获取。

打开此页的源码(在页面右击选择查看源码):

查看一下具体内容:
复制此链接前边需要加一级域名https://kyfw.12306.cn打开, 如下:
https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971

station_names是一个很长的字符串,里边包括了所有车站中文名,拼音,简写,代号等,这里可以看到有很多信息,我们提取我们需要的信息中文字母和代号信息,我们用正则表达式来提取:
写一个简单的脚本抓取(parse_station.py):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# __Author__: hong import re
import requests
from pprint import pprint
# pprint: 格式化输出
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971'
#获取URL
response = requests.get(url, verify=False)
#正则提取中文字母和代号
stations = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text)
# indent:定义打印信息的缩进为4个空格
pprint(dict(stations), indent=4)
提出数据为一个dict 重定向到一个文件里(stations.py)定义字典名如下:

注意:
字典前边定义函数名为stations,默认使用utf-8中文显示乱码,可以切换为GBK。
Python3实现火车票查询工具的更多相关文章
- Python 实现火车票查询工具
注意:由于 12306 的接口经常变化,课程内容可能很快过期,如果遇到接口问题,需要根据最新的接口对代码进行适当修改才可以完成实验. 一.实验简介 当你想查询一下火车票信息的时候,你还在上 12306 ...
- 小工具:天气查询 Vs自定义设置 DevGridControl中GridView排序问题 小工具:火车票查询 小工具:邮件发送 小工具:截图&简单图像处理
小工具:天气查询 开发一个天气查询的工具主要由两步构成,一是数据的获取,二是数据的展示. 一.数据获取 数据获取又可以分为使用其它公司提供的API和手动抓取其它网站数据. 1. 某公司提供的AP ...
- 12306火车票查询--python
最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...
- 微信小程序--火车票查询
微信小程序--火车票查询 写在最前面 微信小程序自九月份推出内测资格以来,经历了舆论热潮到现在看似冷清,但并不意味着大家不那么关注或者不关注了.我想不管是否有内测资格,只要是感兴趣的开发者已经进入潜心 ...
- 出行服务类API调用的代码示例合集:长途汽车查询、车型大全、火车票查询等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 长途汽车查询:全国主要城市的长途汽车时刻查询,汽车站查询 车型大全 ...
- 域名解析服务查询工具dnstracer
域名解析服务查询工具dnstracer 在访问网站过程中,当用户输入网址后,通常是先解析域名,获取该网站的IP地址.然后,根据IP地址访问对应的网站服务器.所以,域名解析服务器保证域名指向正确的网 ...
- 利用百度API Store接口进行火车票查询
火车票查询 项目源码下载链接: Github:https://github.com/VincentWYJ/TrainTicketQuery 博客文件:http://files.cnblogs.com/ ...
- dig 常用的域名查询工具
dig 命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. 语法: dig (选项) (参数) 选项: @<服务器地址>: 指定进行域名解析的域名服务器: -b: 当主机具有多个 ...
- 第三方br查询工具害人不浅
第三方br查询工具害人不浅,查询的时候会大批量调用百度的数据库,为什么说是大批量查询呢? 首先是自己查询,心急的站长恨不得下一次刷新br时数值会有所提高,不是那么急的也会一天查一次或几天一次,记录网站 ...
随机推荐
- 自己封装的常用NPOI文件导出源码
示例: 1. 2.示例2 源码下载地址:https://github.com/aa1356889/NPOICode
- supervisor监管进程max file descriptor配置不生效的问题
配置了 sudo vim /etc/security/limits.conf * soft nofile * hard nofile 单独起进程没问题, 放到supervisor下监管启动,则报错 ...
- CGI, FastCGI, WSGI, uWSGI, uwsgi简述
CGI 通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据.CGI描述了服务器和请求处理程 ...
- Python环境配置安装
2016年12月20日14:15:23 -------------- 参考菜鸟教程: Python 环境搭建 | 菜鸟教程 http://www.runoob.com/python/python-i ...
- bzoj2330: [SCOI2011]糖果
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友 ...
- iOS - 滑屏方案
参考自:iOS开发- 通过ChildViewCotroller ViewController容器 产品增加新的版面,类似于网易新闻,百度新闻,腾讯新闻等新闻客户端首页多屏幕滑屏切换,找了一些开源代码研 ...
- JAVA源码分析-HashMap源码分析(一)
一直以来,HashMap就是Java面试过程中的常客,不管是刚毕业的,还是工作了好多年的同学,在Java面试过程中,经常会被问到HashMap相关的一些问题,而且每次面试都被问到一些自己平时没有注意的 ...
- Jmeter响应内容为文件
最近测试一个接口是文档转换的接口,比如说把rtf文件转换为PDF,这样的接口调用通过结果树只能查看接口响应是否成功,但是看不到转换后的文档.通过Jmeter监听中的Save Responses to ...
- 【原创】PageAdminCMS 前台SQL注入漏洞(3)
之前根据公司的要求找了几个web程序的漏洞提交CNVVD,发现漏洞提交上去两个月了,CNVVD却没有任何回应,我提交的这几个漏洞却悄悄的修补掉了. 文章作者:rebeyond 受影响版本:V3.0 漏 ...
- ig WebDataGrid清除选中行
EnableViewState="false" gridID.Behaviors.Selection.SelectedRows.Clear();