一、概述
妹子工作时需要大量地查询火车车次至南京的信息,包括该车次到达站(南京站or南京南站)、到达时间、出发时间等,然后根据这些信息做下一步工作。
版本结束,趁着间歇期,帮她弄了个简易的批量查询工具,粉色的按钮是给她用的~哈哈哈! (๑*◡*๑)
大概80行代码,主要是:
界面读取待查询车次 - - - - 调用车次信息接口- - - - 解析返回数据 - - - - 组装结果 - - - - 封装到界面(tkinter)
python+tkinter实现界面,详见之前的学习笔记:http://www.zzvips.com/article/126792.html
最终效果图:
二、实现
1.界面读取待查询车次
之前总结过使用tkinter实现GUI,详见之前的笔记:http://www.zzvips.com/article/126792.html
2.调用车次信息接口
题外话,之前是做的从界面读取待查询车次信息,然后构造成携程的查询url,取到数据后筛选信息;
但后续在取到页面数据后,decode时发现总抛解码异常,百度之,原因是页面源码中编码格式有多样,decode时需要加个错误跳过参数。。
但车次信息恰巧在跳过之列。。。
但是已经跟妹子说很快就能搞好(装b),于是就直接申请了某第三方平台的接口 QAQ
网上查了下,免费的接口基本都不提供服务了。于是用的某第三方平台的接口(某速数据),注册赠1000条,续费5元1W条(暂时没续=。=)
1
2
3
4
5
6
7
8
9
10
11
12
|
#调用车次信息接口,获取车次信息
def getTrainScheduleInfo( self ,trainSchedule):
trainBaseInfo = ""
#拼接URL
url = "http://api.xxxx.com/train/line?appkey=xxxxxx&trainno=" + trainSchedule
#print(url)
#获取数据
try :
except :
print ( "ERROR:FUNC getTrainScheduleInfo select_items_from_url failed.url = %s ,flag = %s" % (trainSchedule))
return trainBaseInfo
|
3.解析返回数据
返回数据为json类型的字符串,直接json.loads后,解析即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#获取所有待查询车次信息
allTrainResultDic = {} #车次查询结果集合
for trainSchedule in trainScheduleList:
trainBaseInfo = self .getTrainScheduleInfo(trainSchedule) #json string
# #----测试----
# trainBaseInfo = '''{"status":"0","msg":"ok","result":{"trainno":"G8","type":"高铁","list":[{"sequenceno":"1","station":"上海虹桥","day":"1","arrivaltime":"----","departuretime":"19:00","stoptime":"0","costtime":"0","distance":"0","isend":"0","pricesw":"","pricetd":"","pricegr1":"","pricegr2":"","pricerw1":"0","pricerw2":"0","priceyw1":"0","priceyw2":"0","priceyw3":"0","priceyd":"0.0","priceed":"0.0"},{"sequenceno":"2","station":"南京南","day":"1","arrivaltime":"20:00","departuretime":"20:02","stoptime":"2","costtime":"60","distance":"295","isend":"0","pricesw":"429.5","pricetd":"0","pricegr1":"0","pricegr2":"0","pricerw1":"0","pricerw2":"0","priceyw1":"0","priceyw2":"0","priceyw3":"0","priceyd":"229.5","priceed":"134.5"},{"sequenceno":"3","station":"济南西","day":"1","arrivaltime":"21:59","departuretime":"22:01","stoptime":"2","costtime":"179","distance":"0","isend":"0","pricesw":"1263.5","pricetd":"","pricegr1":"","pricegr2":"","pricerw1":"0","pricerw2":"0","priceyw1":"0","priceyw2":"0","priceyw3":"0","priceyd":"673.5","priceed":"398.5"},{"sequenceno":"4","station":"天津南","day":"1","arrivaltime":"22:59","departuretime":"23:01","stoptime":"2","costtime":"239","distance":"0","isend":"0","pricesw":"1603.5","pricetd":"","pricegr1":"","pricegr2":"","pricerw1":"0","pricerw2":"0","priceyw1":"0","priceyw2":"0","priceyw3":"0","priceyd":"853.5","priceed":"508.5"},{"sequenceno":"5","station":"北京南","day":"1","arrivaltime":"23:34","departuretime":"23:34","stoptime":"0","costtime":"274","distance":"0","isend":"1","pricesw":"1748","pricetd":"","pricegr1":"","pricegr2":"","pricerw1":"0","pricerw2":"0","priceyw1":"0","priceyw2":"0","priceyw3":"0","priceyd":"933.0","priceed":"553.0","costtimetxt":"4时34分"}]}}'''
# #----测试----
print ( "trainBaseInfo =" ,trainBaseInfo)
#解析
if trainBaseInfo:
try :
trainBaseInfo_loads = json.loads(trainBaseInfo)
if trainBaseInfo_loads[ "status" ] = = "0" :
resultNodeValue = trainBaseInfo_loads[ "result" ]
trainnoNodeValue = resultNodeValue[ "trainno" ] #查询车次代码
typeNodeValue = resultNodeValue[ "type" ] #车次类型
listNodeValue = resultNodeValue[ "list" ] #途径站点信息集合 list
#筛选出途经南京、南京南
for trainInfo in listNodeValue:
if (cityName1 in trainInfo.values()) or (cityName2 in trainInfo.values()):
#解析数据
arrivedStation = trainInfo[ "station" ] #到达站
arrivedTime = trainInfo[ "arrivaltime" ] #到站时间
leaveTime = trainInfo[ "departuretime" ] #离站时间
if arrivedStation = = "南京" :
arrivedStation = "南京站"
# 存储该车次查询结果
trainResult = []
trainResult.append(arrivedStation)
trainResult.append(arrivedTime)
trainResult.append(leaveTime)
trainResult.append(typeNodeValue)
allTrainResultDic[trainSchedule] = trainResult
else :
#self.write_log_to_Text("ERROR:车次: %s 无途径南京站信息,跳过" % trainSchedule)
continue
else :
self .write_log_to_Text( "ERROR:车次: %s 检查返回数据状态码不为0,跳过" % trainSchedule)
continue
except :
self .write_log_to_Text( "ERROR:车次:%s 返回的json串失败 " % trainSchedule)
else :
self .write_log_to_Text( "ERROR:车次: %s 查询接口返回信息为空,已跳过" % trainSchedule)
continue
print (allTrainResultDic)
|
4.组装结果、界面输出
1
2
3
4
5
6
7
8
|
#组装结果界面输出
self .result_data_Text.delete( 1.0 , END)
head = "车次 南京到达站 到站时间 离站时间 类型"
self .result_data_Text.insert( 1.0 , head)
for train in allTrainResultDic.keys():
outMsg = " " + "-" * 52 + " " + "%4s" % train + "%9s" % allTrainResultDic[train][ 0 ] + "%13s" % allTrainResultDic[train][ 1 ] + "%12s" % allTrainResultDic[train][ 2 ] + "%8s" % allTrainResultDic[train][ 3 ]
self .result_data_Text.insert(END,outMsg)
self .write_log_to_Text( "INFO:获取火车至南京信息完成" )
|
总结
以上所述是小编给大家介绍的python 3.6 tkinter+urllib+json实现火车车次信息查询功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/chenyuebai/p/8064835.html