最近我看到看到使用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/resources/js/framework/station_name.js?station_version=1.8968'

方法为: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火车票查询系统,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对PHP中文网的支持!

更多Python实现12306火车票查询系统相关文章请关注PHP中文网!

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

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

  1. python查天气预报_Python编写一个天气预报查询系统

    Python编写一个天气预报查询系统 学了Python这么久 可以用它来做许多好玩的小程序哦! 这里给 大家做了个查询天气预报的小程序! 可以查询未来几天的天气! 需要大家自己修改下代码即可! 首先我 ...

  2. python查题_python 数据库连表查询习题

    # 多表查询 # 连表查 # 内连接 必须左表和右表中条件互相匹配的项才会被显示出来 # 表1 inner join 表2 on 条件 # 外链接 会显示条件不匹配的项 # left join 左表显 ...

  3. python身份证号掩盖出生日期的代码_利用Python制作全国身份证号验证及查询系统!就问你吊不吊!...

    大家好哇,又是一个愉快的周末,今天本鸟给大家分享1个有趣的实战项目,用python制作"全国身份证号验证及查询系统",成品界面如下图: 本系统可以实现身份证号真伪验证,年龄.性别及 ...

  4. 查分吧(chafenba)通用成绩查询系统免费下载

    他虽小巧,但你可别小看他哦 1. 灵活通用 别看源码体积极小,它无需设计数据库,可以快速用于各种二维表查询. 成绩查询.水电费物业费查询.录取.分班.分宿舍.考场分配查询等通用. 2. 小巧易拓展 整 ...

  5. python身份证验证系统_利用Python制作全国身份证号验证及查询系统!就问你吊不吊!...

    大家好哇,又是一个愉快的周末,今天本鸟给大家分享1个有趣的实战项目,用python制作"全国身份证号验证及查询系统",成品界面如下图: 本系统可以实现身份证号真伪验证,年龄.性别及 ...

  6. 用python制作全国身份证号验证及查询系统

    ​ 大家好哇,又是一个愉快的周末,今天本鸟给大家分享1个有趣的实战项目,用python制作"全国身份证号验证及查询系统",成品界面如下图: 本系统可以实现身份证号真伪验证,年龄.性 ...

  7. 【趣味案例】用python制作全国身份证号验证及查询系统

    今天给大家分享1个有趣的实战项目,用python制作"全国身份证号验证及查询系统",成品界面如下图: 本系统可以实现身份证号真伪验证,年龄.性别及发证地查询,看起来是不是很高大上, ...

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

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

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

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

  10. 用python写12306系统_Python实现12306火车票抢票系统

    Python实现12306火车票抢票系统 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  Python实现12306火车票抢票系统.txt ] (友情提示:右键点 ...

最新文章

  1. python测试代理IP地址
  2. PyTorch开源物体检测工具包
  3. linux线程学习初步02
  4. spoj839 Optimal Marks(最小割,dinic)
  5. add p4 多个文件_绘图技巧01:继承特性创建对象之神器ADD
  6. 一致性哈希算法及其应用
  7. Vscode 如何使用内置浏览器?
  8. 我的java学习之旅班刊_我的java学习路程
  9. LSTM api的介绍
  10. 精确选择识别png图片有像素的区域(使用方法)
  11. 手机中的传感器及其应用场景
  12. 计算机术语中bug指的是,你知道电脑漏洞为什么叫bug吗?
  13. Android系统架构及生态链
  14. ros2中vcs import src < ros2.repos 命令
  15. 版本控制之最佳实践(Git版)
  16. okhttp使用总结
  17. 关于dnw驱动安装失败的问题解决
  18. [ESP8266]刷MQTT固件以及连接服务器失败的问题解决
  19. 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
  20. 批量下载抖音快手视频

热门文章

  1. git commit 提交信息写错,怎么更改?
  2. 机器学习方法三要素理解:模型、策略、算法
  3. 解决Xcode 13.2 不兼容 ios15.4 问题
  4. 【vscode简单入门(四)】vscode精美UI主题推荐 (~」还你一个花里胡哨的vscode「~)
  5. 离散元 python_开源离散元软件YADE的安装与编译(基于ubuntu18.04) | 望天博客
  6. 学习笔记(2):模拟登陆抽屉网(ajax)
  7. 最好用的论文数据搜索网站,搜索容易让写论文变轻松!
  8. autojs各种插件以及教程模板
  9. 2 年前端面试心路历程(字节跳动、YY、虎牙、BIGO)
  10. maven deploy jar包和源码包到私服