最近我看到看到使用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] 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] #是必须要的 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:

#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()

其中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

'''Train tickets query via command-line.Usage:tickets [-gdtkz] Options:-h,--help 显示帮助菜单-g 高铁-d 动车-t 特快-k 快速-z 直达Example:tickets -gdt beijing shanghai 2016-08-25'''import requestsfrom docopt import docoptfrom stations import stations# from pprint import pprintfrom myprettytable import TrainCollectionclass SelectTrain(object):def __init__(self):'''获取命令行输入的参数'''self.args = docopt(__doc__)#这个是获取命令行的所有参数,返回的是一个字典def cli(self):'''command-line interface'''# 获取 出发站点和目标站点from_station = stations.get(self.args['']) #出发站点to_station = stations.get(self.args['']) # 目的站点leave_time = self._get_leave_time()# 出发时间url = 'https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate={0}&from_station={1}&to_station={2}'.format(leave_time,from_station,to_station)# 拼接请求列车信息的Url# 获取列车查询结果r = requests.get(url,verify=False)traindatas = r.json()['data']['datas'] # 返回的结果,转化成json格式,取出datas,方便后面解析列车信息用# 解析列车信息traintypes = self._get_traintype()views = TrainCollection(traindatas,traintypes)views.print_pretty()def _get_traintype(self):'''获取列车型号,这个函数的作用是的目的是:当你输入 -g 是只是返回 高铁,输入 -gd 返回动车和高铁,当不输参数时,返回所有的列车信息''' traintypes = ['-g','-d','-t','-k','-z']# result = []# for traintype in traintypes:# if self.args[traintype]:# result.append(traintype[-1].upper())trains = [traintype[-1].upper() for traintype in traintypes if self.args[traintype]]if trains:return trainselse:return ['G','D','T','K','Z']def _get_leave_time(self):'''获取出发时间,这个函数的作用是为了:时间可以输入两种格式:2016-10-05、20161005'''leave_time = self.args['']if len(leave_time) == 8:return '{0}-{1}-{2}'.format(leave_time[:4],leave_time[4:6],leave_time[6:])if '-' in leave_time:return leave_timeif __name__ == '__main__':cli = SelectTrain()cli.cli()

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

以上所述是小编给大家介绍的Python脚本实现12306火车票查询系统,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

python火车票查询系统_Python脚本实现12306火车票查询系统相关推荐

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

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

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

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

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

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

  4. Python脚本实现12306火车票自动抢票回家or旅游

    最近在学Python,所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正.话不多说,进入正题: 这个脚本目前只能刷一趟车的,人数可以是多个,支持 ...

  5. python手机屏幕控制_Python脚本利用adb进行手机控制的方法

    一.  adb 相关命令: 1. 关闭adb服务:adb kill-server 2. 启动adb服务  adb start-server 3. 查询当前运行的所有设备  adb devices 4. ...

  6. python刷网易云_Python脚本用于定时关闭网易云音乐PC客户端

    本文主要讲述如何使用Python在指定的秒数后关闭Windows上运行的程序(此程序以网易云音乐为例).本文的背景是昨晚发现网易云音乐的PC客户端没有定时关闭的功能,可以使用Python编写一个简单的 ...

  7. python成绩查询系统_Python爬虫实战:登录教务系统查成绩

    本文记录我用Python登录教务系统查询成绩的过程.手动输入验证码,简单获取成绩页面.后续将可能更新自动识别验证码登录查询 前期准备 本爬虫用到了Python的Requests库和BeautifulS ...

  8. 用Python实现一个简单好用的12306查票系统

    春节快到了,又要到一年中紧张刺激的时候了! 买票回家! 今天教大家想做一个简单好用的查票系统! 本次用到环境和模块 环境: Python 3.6 Pycharm 模块 requests pandas ...

  9. python 实现简单查询页面_python web 实现简易天气查询

    本文记录使用 Flask 快速完成一个 简易天气查询 MVP 程序的探索,学习过程.程序采用Flask+Jinja2实现,其中Flask扩展包括:1.flask-bootstrap,2.Flask-W ...

  10. python excel模板 插件_python脚本——自动推送txt,EXCEL等文件模板

    #!/usr/bin/python # -*- coding: utf-8 -*- #此处支持中文字符一定要放在前两行,置后的话不生效,脚本报错 #!/usr/bin/env python impor ...

最新文章

  1. linux上如何主指定的静态路由永久有效
  2. 数字双胞胎技术和物联网如何帮助企业取得成功
  3. 分享HTML5 canvas 的总结
  4. 未来的数据中心(三)
  5. python3的3D实战 -基于panda3d(3)
  6. 工艺流程计算机仿真设计,450kt/a合成氨反应器及生产过程计算机仿真设计
  7. Android加速度传感器实现“摇一摇”,带手机振动
  8. 王元院士漫谈哥德巴赫猜想
  9. 推荐两款 GTD 工具
  10. JDK 8 新特性- 学习中
  11. 在sqlServer中把数据导出为insert脚本
  12. 涵盖农业、可再生能源、酒店、金融服务、创意服务、科技、林业和建筑业的20家新公司加入《气候宣言》
  13. Go程序设计语言 练习题
  14. 不错的离线IP地址定位库
  15. 手把手教你在自己的扫描器中,集(bai)成(piao)大名鼎鼎的漏扫描工具nuclei
  16. 知乎上 40 个有趣回复,很精辟很提神
  17. 金庸在浙江大学招博士生的考卷
  18. vue电商后台管理系统--订单管理篇
  19. Building designing
  20. 支付宝网商贷是雪中送炭么?

热门文章

  1. workbench表头可以是中文_超简单:Python 5步去中国式报表表头
  2. vb杨辉三角代码编写_杨辉三角怎样用VB写杨辉三角的完整代码 – 手机爱问
  3. treeset java api_JAVAAPI学习值TreeSet类
  4. 请检查 mysql 模块是否正确加载_mysql_connect() 不支持 请检查 mysql 模块是否正确加载...
  5. 懒人用日志分析-awstats的docker应用
  6. How to Create and Drop database in MongoDB
  7. 月入5000,你有什么资格谈生活
  8. 部署单台zookeeper
  9. IIS添加对ashx文件的支持
  10. IIS架设FTP服务器图文教程