最新Python实现火车票查询工具.docx

上传人:b****2 文档编号:1393147 上传时间:2022-10-22 格式:DOCX 页数:14 大小:2.63MB
下载 相关 举报
最新Python实现火车票查询工具.docx_第1页
第1页 / 共14页
最新Python实现火车票查询工具.docx_第2页
第2页 / 共14页
最新Python实现火车票查询工具.docx_第3页
第3页 / 共14页
最新Python实现火车票查询工具.docx_第4页
第4页 / 共14页
最新Python实现火车票查询工具.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

最新Python实现火车票查询工具.docx

《最新Python实现火车票查询工具.docx》由会员分享,可在线阅读,更多相关《最新Python实现火车票查询工具.docx(14页珍藏版)》请在冰豆网上搜索。

最新Python实现火车票查询工具.docx

最新Python实现火车票查询工具

Python-实现火车票查询工具

Python实现火车票查询

工程简介

当你想查询一下火车票信息的时候,你还在上12306官网吗?

或是翻开你手机里的APP?

下面让我们来用Python写一个命令行版的火车票查看器,只要在命令行敲一行命令就能获得你想要的火车票信息!

如果你刚掌握了Python根底,这将是个不错的小练习。

1.1知识点

∙Python根底知识的综合运用

∙docopt、requests、colorama 及 prettytable 库的使用

∙setuptools的使用

1.2效果截图

二、接口设计

一个应用写出来最终是要给人使用的,哪怕只是给你自己使用。

所以,首先应该想想你希望怎么使用它?

让我们先给这个小应用起个名字吧,既然及查询票务信息,那就叫它 tickets 好了。

我们希望用户只要输入出发站,到达站以及日期就让就能获得想要的信息,比方要查看10月30号上海-北京的火车余票,我们只需输入:

$pythontickets.py上海北京2022-10-30

注意:

上面的日期〔包括后面的〕是笔者写文章时确定的日期,当你在做这个工程的时候可能要根据当前时间做适当调整。

转化为程序语言就是:

$pythontickets.pyfromtodate

另外,火车有各种类型,高铁、动车、特快、快速和直达,我们希望可以提供选项只查询特定的一种或几种的火车,所以,我们应该有下面这些选项:

∙-g高铁

∙-d动车

∙-t特快

∙-k快速

∙-z直达

这几个选项应该能被组合使用,所以,最终我们的接口应该是这个样子的:

$pythontickets.py[-gdtkz]fromtodate

接口已经确定好了,剩下的就是实现它了。

三、代码实现

首先安装一下实验需要用到的库:

$sudopip3installrequestsprettytabledocoptcolorama

∙requests,使用Python访问HTTP资源的必备库。

∙docopt,Python3命令行参数解析工具。

∙prettytable,格式化信息打印工具,能让你像MySQL那样打印数据。

arguments=docopt(__doc__)

print(arguments)

if__name__=='__main__':

cli()

上面的程序中, docopt 会根据我们在 docstring 中的定义的格式自动解析出参数并返回一个字典,也就是 arguments,我们打印出了这个字典的内容。

下面我们运行一下这个程序,比方查询一下10月30号从成都到南京的动车和高铁:

$pythontickets.py-dg成都南京2022-10-10

我们得到下面的参数解析结果:

3.2获取数据

参数已经解析好了,下面就是如何获取数据了,这也是最主要的局部。

首先我们用实验楼环境的Firefox浏览翻开 12306,进入余票查询页面,按下 F12 翻开开发者工具,选中 Network 一栏,在查询框中随便查询一次,我们在调试工具观察下请求和响应:

注意到上面的请求URL,它是由基URL  加四个参数构成的,这四个参数分别代表,查询的类型〔成人?

学生?

〕,日期,出发车站,到达车站:

再来看看响应:

返回的是JSON格式的数据!

我们翻开返回的数据看看:

可以看到一列火车的数据用Python的语言说就是一个字典。

接下来问题就简单了,我们只需要利用这个接口,构建请求URL然后解析返回的JSON数据就可以了。

但是我们发现,URL里面参数 from_station 和 to_station 并不是汉字,而是一个代号,而我们想要输入的是汉字,我们要如何获取代号呢?

我们翻开网页源码看看有没有什么发现。

果然,这里有个关于station的文件,翻开看看:

station_names 是一个很长的字符串,这里面貌似是包含了所有车站的中文名,拼音,简写和代号等信息。

但是这些信息挤在一起,而我们只想要车站的拼音和大写字母的代号信息,怎么办呢?

正那么表达式!

我们写个小脚本来匹配提取出想要的信息吧,在parse_station.py中:

importre

importrequests

frompprintimportpprint

url='

response=requests.get(url,verify=False)

stations=re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)',response.text)

pprint(dict(stations),indent=4)

 

我们运行这个脚本,它将以字典的形式返回所有车站和它的大写字母代号,我们将结果重定向到 stations.py 中,

$python3parse_station.py>stations.py

我们为这个字典加名字,stations,最终,stations.py文件是这样的:

现在,用户输入车站的中文名,我们就可以直接从这个字典中获取它的字母代码了:

fromstationsimportstations

defcli():

arguments=docopt(__doc__)

from_station=stations.get(arguments[''])

to_station=stations.get(arguments[''])

date=arguments['']

#构建URL

url='

date,from_station,to_station

万事俱备,下面我们来请求这个URL获取数据吧!

这里我们使用 requests 这个库,它提供了非常简单易用的接口,

importrequests

defcli():

#添加verify=False参数不验证证书

r=requests.get(url,verify=False)

print(r.json())

从结果中,我们可以观察到,与车票有关的信息需要进一步提取:

defcli():

...r=requsets.get(url);print(r.json())

我们已经知道该请求返回的是JSON数据,使用 requests 提供的 r.json() 可以将JSON数据转化为Python字典,上面我们打印了这个字典,运行程序,我们看到:

图中方框是一个字典,字典中的数据也就是一班列车的信息,也就是说所有列车的信息都在一个包含多个字典的列表中,而这个列表又嵌套了2个字典,就是图中的2个椭圆,所以,我们需要的信息应该这样来提取:

available_trains=r.json()['data']['datas']

3.3解析数据

我们封装一个简单的类来解析数据:

classTrainsCollection:

header='车次车站时间历时一等二等软卧硬卧硬座无座'.split()

def__init__(self,available_trains,options):

"""查询到的火车班次集合

:

paramavailable_trains:

一个列表,包含可获得的火车班次,每个

火车班次是一个字典

:

paramoptions:

查询的选项,如高铁,动车,etc...

"""

self.available_trains=available_trains

self.options=options

def_get_duration(self,raw_train):

duration=raw_train.get('lishi').replace(':

','小时')+'分'

ifduration.startswith('00'):

returnduration[4:

]

ifduration.startswith('0'):

returnduration[1:

]

returnduration

@property

deftrains(self):

forraw_traininself.available_trains:

train_no=raw_train['station_train_code']

initial=train_no[0].lower()

ifnotself.optionsorinitialinself.options:

train=[

train_no,

'\n'.join([raw_train['from_station_name'],

raw_train['to_station_name']]),

'\n'.join([raw_train['start_time'],

raw_train['arrive_time']]),

self._get_duration(raw_train),

raw_train['zy_num'],

raw_train['ze_num'],

raw_train['rw_num'],

raw_train['yw_num'],

raw_train['yz_num'],

raw_train['wz_num'],

]

yieldtrain

defpretty_print(self):

pt=PrettyTable()

pt._set_field_names(self.header)

fortraininself.trains:

pt.add_row(train)

print(pt)

 

3.4显示结果

最后,我们将上述过程进行汇总并将结果输出到屏幕上:

...

classTrainCollection:

...

...

defcli():

"""Command-lineinterface"""

arguments=docopt(__doc__)

from_station=stations.get(arguments[''])

to_station=stations.get(arguments[''])

date=arguments['']

url=('

'purpose_codes=ADULT&queryDate={}&'

'from_station={}&to_station={}').format(

date,from_station,to_station

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1