Advertisement

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

阅读量:

最近我了解到利用Python开发一个火车票查询系统,在这过程中我也成功编写了相关代码并获得了不少收获。在接下来的文章中我会将整个开发过程详细记录下来。

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

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

意思是:检索出发车次编号以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的余票查询的接口:

该网页提供了关于框架资源的具体实现细节,并包含用于构建站名功能的JavaScript代码文件。其中包含用于构建站名功能的JavaScript代码文件,并指定版本号为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中

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 的 Python 文件。
其中包含站点名称及其对应的缩略形式。
为了方便后续操作,在生成的 stations.py 文件中定义变量 stations 为一个字典对象。
下面就是 stations.py 文件的内容:

3.2 当前准备齐全的是获取列车信息所需的所有参数。下一步是需要获取列车返回的数据。通过解析这些数据资源来获得所需信息:如车次编号、一等席位数量等。

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

train datas = 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())

该列表相当于由满足以下条件的所有元素组成:对于每个属于 traintypes 的 traintype,在 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实现12306火车票查询系统相关文章请关注PHP中文网!

本篇文章源自网络平台发布的技术资讯内容,请您在此处点击反馈并投诉

本文系统来源:php中文网

全部评论 (0)

还没有任何评论哟~