最近我看到看到使用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 docopt

args = 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-8

from prettytable import PrettyTable

class TrainCollection(object):

"""

解析列车信息

"""

# 显示车次、出发/到达站、 出发/到达时间、历时、一等坐、二等坐、软卧、硬卧、硬座

header = '序号 车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 软卧 硬卧 硬座 无座'.split()

def __init__(self,rows,traintypes):

self.rows = rows

self.traintypes = traintypes

def _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

@property

def trains(self):

result = []

flag = 0

for row in self.rows:

if row['station_train_code'][0] in self.traintypes:

flag += 1

train = [

# 序号

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 result

def 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-8

from prettytable import PrettyTable

class TrainCollection(object):

"""

解析列车信息

"""

# 显示车次、出发/到达站、 出发/到达时间、历时、一等坐、二等坐、软卧、硬卧、硬座

header = '序号 车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 软卧 硬卧 硬座 无座'.split()

def __init__(self,rows,traintypes):

self.rows = rows

self.traintypes = traintypes

def _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

@property

def trains(self):

result = []

flag = 0

for row in self.rows:

if row['station_train_code'][0] in self.traintypes:

flag += 1

train = [

# 序号

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 result

def 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 requests

from docopt import docopt

from stations import stations

# from pprint import pprint

from myprettytable import TrainCollection

class 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 trains

else:

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_time

if __name__ == '__main__':

cli = SelectTrain()

cli.cli()

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

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

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

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

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

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

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

  3. JAVA实现查询系统_基于jsp的车辆查询系统-JavaEE实现车辆查询系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的车辆查询系统, 该项目可用各类java课程设计大作业中, 车辆查询系统的系统架构分为前后台两部分, 最终实现在线上 ...

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

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

  5. python商品监控系统_Python写的一个简单监控系统

    市面上有很多开源的监控系统:Cacti.nagios.zabbix.感觉都不符合我的需求,为什么不自己做一个呢 用Python两个小时徒手撸了一个简易的监控系统,给大家分享一下,希望能对大家有所启发 ...

  6. java城市公交查询系统案例_013JAVA.JSP城市公交查询系统.zip

    [实例简介] 本人上传的资源大多是工作学习时的积累, 大部分上传的资源具有 源码+论文+答辩PPT+运行视频 四部分组成. 仅供学习参考,不得用于商业途径,希望能够帮助到大家,谢谢. [实例截图] [ ...

  7. 列车售票系统源代码c语言,火车站售票查询系统 C语言 源代码

    C语言写的一个火车站售票查询系统 Journey Planer 原始程序 #define TRAIN struct journey /*#define _CRT_SECURE_NO_DEPRECATE ...

  8. 基于html5的城市公交查询系统,基于WEB的智能公交查询系统的研究与设计

    摘要: 我国城市公交查询系统的发展处于一个较落后的水平,广大乘客可以获得信息的方式很少,为了解决这种问题,加快发展城市公交信息化,设计了这个城市公交出行线路查询系统.公交换乘查询系统是MAS技术和We ...

  9. 触摸查询系统服务器秒退怎么回事,触摸查询系统为我们生活带来什么作用

    随着触摸技术的发展,触摸软件能够更好的带来全新的互动展示体验.触摸查询系统也获得人们的青睐,触控系统拥有强大的功能,为人们提供各种便捷高效的服务体验,能够有效地提升新时代社会发展的价值.触摸查询系统通 ...

最新文章

  1. 上周我面了个三年 Javaer,这几个问题都没答出来
  2. C++中引用的用法和应用实例
  3. Facebook开源AI硬件 联手NVIDIA开发人工智能
  4. 解决Eclipse里Maven工程报 An error occurred while filtering resources错误
  5. php5.4以下,json_encode不转义实现方法
  6. linux桌面下雪,Ubuntu添加下雪效果
  7. 三星突然发布Galaxy S10 Lite和Note 10 Lite:有不同也有所同
  8. mybatis多数据源配置_随笔:springboot+mybatis 配置双数据源
  9. SQL 被当成代码?谷歌的理由绝了!
  10. Weka开发[11]—J48源代码介绍
  11. Bert模型冻结指定参数
  12. 初入职场,你够聪明不?
  13. 安卓帧数监测软件_安卓查看帧数的软件
  14. 手柄xinput模式_让你的普通手柄变成360手柄(XInputEmulator)
  15. 微圈社群助手到底是什么?怎么用?
  16. 应用宝成腾讯王卡官方应用商店 全部APP下载免流量
  17. 论文笔记(二十二):Soft Tracking Using Contacts for Cluttered Objects to Perform Blind Object Retrieval
  18. Python 爬虫、抓包
  19. ExtJS中Grid分页
  20. 使用appium桌面版在win平台连接逍遥模拟器(以梦幻西游手游为例)

热门文章

  1. 查看Linux服务器公网内网IP地址
  2. 通过Canvas画布制作黑客帝国背景
  3. 火绒真的比360安全卫士好吗?
  4. 国内申请NewBing账号【不排队】
  5. 驱动精灵2014网卡版 v8.0.515.1101 扩展版
  6. UVALive 4997 ABCD Tiles --DFS
  7. 指划王孔小兵:Testin云测助益亲子类APP实现年轻家庭和谐
  8. 手机浏览器加载不出来css,如何解决浏览器不加载css文件的问题
  9. 解决IDEA的HTML文件格式的显示问题
  10. 使用reCAPTCHA实现验证码