最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来。(注意使用的是python3)

首先我将最终结果给展示出来:

在cmd命令行执行:python tickets.py -dk shanghai chengdu 20161007 > result.txt

意思是:查询 上海--成都 2016.10.07 的D和K开头的列车信息,并保存到 result.txt文件中;下面就是result.txt文件中的结果:

下面的将是实现步骤:

  1、安装第三方库 pip install 安装:requests,docopt,prettytable

2、docopt可以用来解析从命令行中输入的参数:

"""
Usage:test [-gdtkz] <from> <to> <date>Options:-h,--help   显示帮助菜单-g          高铁-d          动车-t          特快-k          快速-z          直达Example:tickets -gdt beijing shanghai 2016-08-25
"""import docoptargs = docopt.docopt(__doc__)
print(args)# 上面 """ """ 包含中的:
#Usage:
#   test [-gdtkz] <from> <to> <date>#是必须要的 test 是可以随便写的,不影响解析

最终打印的结果是一个字典,方便后面使用:

3、获取列车的信息

我们在12306的余票查询的接口:

url:https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=2016-10-05&from_station=CDW&to_station=SHH

方法为:get

传输的参数:queryDate:2016-10-05、from_station:CDW、to_station:SHH

其中城市对应简称是需要另外的接口查询得出

3.1  查询城市对应的简称:

这个接口的url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8968'

  方法是get,对返回结果利用正则表达式,取出城市名和简称的值(返回的值类似:7@cqn|重庆南|CRW|chongqingnan|cqn|,我们需要的就是:CRW、chongqingnan),代码如下parse_stations.py:

 1 #coding=utf-8
 2
 3 import requests
 4 import re
 5 from pprint import pprint
 6
 7
 8 def get_stations():
 9     # 7@cqn|重庆南|CRW|chongqingnan|cqn|
10     url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8968'
11     r = requests.get(url,verify=False)
12     patter = re.compile('([A-Z]+)\|([a-z]+)')
13     items = dict(re.findall(patter,r.text))
14     stations = dict(zip(items.values(),items.keys()))
15     # for key in stations:
16     #     print("{0}-->{1}".format(key,stations[key]))
17     pprint(stations,indent=4)
18
19 if __name__ == '__main__':
20     get_stations()

其中pprint这个模块能是打印出来的信息,更加方便阅读:

在cmd中运行:python parse_stations.py > stations.py

就会在当前目录下得到stations.py文件,文件中就是站点名字和简称,在stations.py文件中加入"stations = "这样就是一个字典,方便后面的取值,下面就是stations.py文件的内容:

3.2 现在获取列车信息的参数已经准备齐了,接下来就是拿到列车的返回值,解析出自己需要的信息,比如:车次号,一等座的票数等等。。,myprettytable.py

#coding=utf-8from prettytable import PrettyTableclass TrainCollection(object):"""解析列车信息"""# 显示车次、出发/到达站、 出发/到达时间、历时、一等坐、二等坐、软卧、硬卧、硬座header = '序号 车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 软卧 硬卧 硬座 无座'.split()def __init__(self,rows,traintypes):self.rows = rowsself.traintypes = traintypesdef _get_duration(self,row):"""获取车次运行的时间"""duration = row.get('lishi').replace(':','小时') + '分'if duration.startswith('00'):return duration[4:]elif duration.startswith('0'):return duration[1:]return duration@propertydef trains(self):result = []flag = 0for row in self.rows:if row['station_train_code'][0] in self.traintypes:flag += 1train = [# 序号
                    flag,# 车次row['station_train_code'],# 出发、到达站点'/'.join([row['from_station_name'],row['to_station_name']]),# 成功、到达时间'/'.join([row['start_time'],row['arrive_time']]),# duration 时间
                    self._get_duration(row),# 商务座row['swz_num'],# 一等座row['zy_num'],# 二等座row['ze_num'],# 软卧row['rw_num'],# 硬卧row['yw_num'],# 硬座row['yz_num'],# 无座row['wz_num']]result.append(train)return resultdef print_pretty(self):"""打印列车信息"""pt = PrettyTable()pt._set_field_names(self.header)for train in self.trains:pt.add_row(train)print(pt)if __name__ == '__main__':t = TrainCollection()

prettytable 这个库是能打印出类似mysql查询数据显示出来的格式,

4、接下来就是整合各个模块:tickets.py

 1 """Train tickets query via command-line.
 2
 3 Usage:
 4     tickets [-gdtkz] <from> <to> <date>
 5
 6 Options:
 7     -h,--help   显示帮助菜单
 8     -g          高铁
 9     -d          动车
10     -t          特快
11     -k          快速
12     -z          直达
13
14 Example:
15     tickets -gdt beijing shanghai 2016-08-25
16 """
17 import requests
18 from docopt import docopt
19 from stations import stations
20 # from pprint import pprint
21 from myprettytable import TrainCollection
22
23 class SelectTrain(object):
24
25     def __init__(self):
26         """
27         获取命令行输入的参数
28         """
29         self.args = docopt(__doc__)#这个是获取命令行的所有参数,返回的是一个字典
30
31
32     def cli(self):
33         """command-line interface"""
34         # 获取 出发站点和目标站点
35         from_station = stations.get(self.args['<from>']) #出发站点
36         to_station = stations.get(self.args['<to>']) # 目的站点
37         leave_time = self._get_leave_time()# 出发时间
38
39         url = 'https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate={0}&from_station={1}&to_station={2}'.format(
40             leave_time,from_station,to_station)# 拼接请求列车信息的Url
41
42         # 获取列车查询结果
43         r = requests.get(url,verify=False)
44         traindatas = r.json()['data']['datas'] # 返回的结果,转化成json格式,取出datas,方便后面解析列车信息用
45
46         # 解析列车信息
47         traintypes = self._get_traintype()
48         views = TrainCollection(traindatas,traintypes)
49         views.print_pretty()
50
51     def _get_traintype(self):
52         """
53         获取列车型号,这个函数的作用是的目的是:当你输入 -g 是只是返回 高铁,输入 -gd 返回动车和高铁,当不输参数时,返回所有的列车信息
54         """
55         traintypes = ['-g','-d','-t','-k','-z']
56         # result = []
57         # for traintype in traintypes:
58         #     if self.args[traintype]:
59         #         result.append(traintype[-1].upper())
60
61         trains = [traintype[-1].upper() for traintype in traintypes if self.args[traintype]]
62         if trains:
63             return trains
64         else:
65             return ['G','D','T','K','Z']
66
67     def _get_leave_time(self):
68         """
69         获取出发时间,这个函数的作用是为了:时间可以输入两种格式:2016-10-05、20161005
70         """
71         leave_time = self.args['<date>']
72         if len(leave_time) == 8:
73             return '{0}-{1}-{2}'.format(leave_time[:4],leave_time[4:6],leave_time[6:])
74
75         if '-' in leave_time:
76             return leave_time
77
78
79 if __name__ == '__main__':
80     cli = SelectTrain()
81     cli.cli()

好了,基本上就结束了,按照开头的哪样,就能查询你想要的车次信息了

转载于:https://www.cnblogs.com/xiaoshitoutest/p/5923813.html

12306火车票查询--python相关推荐

  1. 12306火车票查询——Python

    欢迎加入Python学习交流QQ群:535993938  禁止闲聊 ! 名额有限 ! 非喜勿进 ! 最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详 ...

  2. python实现火车票查询_python实现12306火车票查询器

    12306火车票购票软件大家都用过,怎么用Python写一个命令行的火车票查看器,要求在命令行敲一行命令来获得你想要的火车票信息,下面通过本文学习吧. Python火车票查询器 接口设置 先给这个小应 ...

  3. python作业火车票订购系统_Python实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  4. python作业火车票订购系统_Python脚本实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都具体给共享出来.(注重使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  5. python实现火车票查询_Python脚本实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  6. python查询12306余票_Python脚本实现12306火车票查询系统

    最近我看到看到使用python实现火车票查询,我自己也实现了,感觉收获蛮多的,下面我就把每一步骤都详细给分享出来.(注意使用的是python3) 首先我将最终结果给展示出来: 在cmd命令行执行:py ...

  7. 12306火车票查询api调用文档

    在即将到来的双十二,在聚合数据平台上的12306火车票查询api将参与活动,首先我们将分享下12306火车票查询api代码文档及返回示例,可查询实时火车票余票,包括车次.车次始发站.车次终点站.出发时 ...

  8. Python爬虫实现12306火车票查询

    昨天早上,突发奇想想要给基友弄一个火车票查询工具,顺便熟悉一下html.json.js格式,为之后制作微信小程序做准备,于是便开始了爬虫的道路. 12306网站想要爬跟之前爬静态网页并不一样,首先由于 ...

  9. 使用Python和Splinter实现12306火车票查询与抢票

    有一段时间没有使用Python了,前几天经朋友提起一篇关于用Python实现抢火车票的文章,百度了实现抢火车票的技术细节,网上却有不少资料,也不是新鲜的东西.在了解了一些技术手段,阅读了一些大神的博文 ...

  10. 聚合数据Android SDK 12306火车票查询订票演示示例

    1.聚合SDK是聚合数据平台,为移动开发者提供的免费数据接口.使用前请先到聚合平台(http://www.juhe.cn/)注册,申请相关数据. 2.下载聚合数据SDK,将开发包里的juhe_sdk_ ...

最新文章

  1. [JavaWeb基础] 007.Struts2的配置和简单使用
  2. Ocelot中文文档-缓存
  3. 【基环树DP】[NOI2012]迷失游乐园
  4. 黑科技教你一招如何解除 生活中烦人的验证码问题
  5. linux新建备份数据库的脚本文件,Linux下shell脚本:自动每日备份网站文件和数据库上传FTP空间...
  6. LinkedHashSet集合
  7. repeated call of attachBrowserEvent
  8. [转]Install Windows Server 2012 in VMware Workstation
  9. wamp惯用的php框架_wamp集成环境php多版本搭建(php5.5,php5.6,php7.0.6)
  10. 石河子大学计算机学院宿舍,对于那些想去211石河子大学的同学给你一点建议
  11. 洛谷 P1558 色板游戏
  12. lock concurrence
  13. 小米游戏本bios更新_小米笔记本电脑bios升级方法图文步骤
  14. 为计算机快捷方式是什么原因,为什么我的电脑界面上的东西都变成快捷方式??...
  15. 安卓APP应用启动流程详解
  16. Qt编写的SMTP客户端(库)
  17. 手机怎样识别图片中的文字?
  18. AUTOCAD——弧长标注命令、半径标注命令
  19. KCL 论文被 SETTA 2022 会议录用
  20. 良知VS野心,苹果为何要翻新手机?

热门文章

  1. 在VT上搜索恶意软件
  2. 计算机输入法切换用户登录,在电脑上如何设置输入法全局切换的功能
  3. php计算距离元旦还有多少天,2020年元旦顺口溜
  4. arXiv | FedPer:带个性化层的联邦学习
  5. u盘linux反应好慢,识别U盘很缓慢怎么办的八种解决方法
  6. 解决TortoiseSVN不显示状态图标(图文步骤详解)
  7. 北大沙龙 | 技术大咖为大家讲解什么是UTXO
  8. STM32,仿照LL库,编写FLASH的LL库(内有完成代码)(STM32F0)
  9. 支付对接常用:关于asp rsa加密
  10. 两年后再次遇到的Oracle启动报错,ORA-01012:not logged