一、概述

妹子工作时需要大量地查询火车车次至南京的信息,包括该车次到达站(南京站or南京南站)、到达时间、出发时间等,然后根据这些信息做下一步工作。

版本结束,趁着间歇期,帮她弄了个简易的批量查询工具,粉色的按钮是给她用的~哈哈哈! (๑*◡*๑)

大概80行代码,主要是:

界面读取待查询车次 - - - - 调用车次信息接口- - - - 解析返回数据 - - - - 组装结果 - - - - 封装到界面(tkinter)

最终效果图:

二、实现

1.界面读取待查询车次

2.调用车次信息接口

题外话,之前是做的从界面读取待查询车次信息,然后构造成携程的查询url,取到数据后筛选信息;

但后续在取到页面数据后,decode时发现总抛解码异常,百度之,原因是页面源码中编码格式有多样,decode时需要加个错误跳过参数。。

但车次信息恰巧在跳过之列。。。

但是已经跟妹子说很快就能搞好(装b),于是就直接申请了某第三方平台的接口 QAQ

网上查了下,免费的接口基本都不提供服务了。于是用的某第三方平台的接口(某速数据),注册赠1000条,续费5元1W条(暂时没续=。=)

#调用车次信息接口,获取车次信息

def getTrainScheduleInfo(self,trainSchedule):

trainBaseInfo = ""

#拼接URL

url = "http://api.xxxx.com/train/line?appkey=xxxxxx&trainno=" + trainSchedule

#print(url)

#获取数据

try:

trainBaseInfo = self.send_GET_request(url)  #发送GET请求,python3.X是用urllib.request库,网上很多

except:

print("ERROR:FUNC getTrainScheduleInfo select_items_from_url failed.url = %s ,flag = %s"%(trainSchedule))

return trainBaseInfo

3.解析返回数据

返回数据为json类型的字符串,直接json.loads后,解析即可

#获取所有待查询车次信息

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.组装结果、界面输出

#组装结果界面输出

self.result_data_Text.delete(1.0, END)

head = "车次 南京到达站 到站时间 离站时间 类型"

self.result_data_Text.insert(1.0, head)

for train in allTrainResultDic.keys():

outMsg = "\n" + "-" * 52 + "\n" + "%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实现火车车次信息查询功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

python火车票查询工具tkinter_python 3.6 tkinter+urllib+json实现火车车次信息查询功能...相关推荐

  1. 12306火车车次票价查询api

    12306订票接口-火车车次票价查询api代码文档及返回示例分享,可查询查询车次返回的车次信息查询票价,支持列次编号.出发站名称.到达站名称等查询. 接口名称:火车车次票价查询api 接口平台:聚合数 ...

  2. python火车票查询工具tkinter_Python 实现一个火车票查询的工具

    原标题:Python 实现一个火车票查询的工具 主要功能: 输入出发车站,到达车站,时间,然后返回所有的车次信息,和余票信息 支持输入附加选项查询不同的火车的类型,比如高铁,动车. #查询上海到北京2 ...

  3. python 12306查询不到车次_python爬取12306火车车次信息

    #-*- coding:utf-8 -*- importrequestsimportreimportjson#关闭https证书验证警告 requests.packages.urllib3.disab ...

  4. 安卓 spinner下拉框 做模糊查询_用图表控件做一个简单的员工信息查询系统

    前几天在上课的时候有同学说在做人员的信息查询的时候,经常的要去做查找搜索很麻烦,能不能做一个简单的人员信息查询系统,只需要选择人员的编号就可以查询到这个员工的信息.其实要实现这个同学的需求在EXCEL ...

  5. python爬取12306_python爬取12306火车车次信息

    #-*- coding:utf-8 -*- importrequestsimportreimportjson#关闭https证书验证警告 requests.packages.urllib3.disab ...

  6. excel制作录入和查询系统_叮咚!您有一份Excel人员信息查询系统,请您查收~

    叮咚!您有一份Excel人员信息查询系统,请您查收~ 打开中-- 1 2 3 open! 哦豁,瞅着还不错哦~ 下面介绍如何制作一个简易的人员信息查询系统. 数据源准备 第一步当然是准备数据源,数据源 ...

  7. c语言招生信息查询系统,《C语言程序设计》课程设计报-招生信息查询系统.docx...

    <C语言程序设计>课程设计报-招生信息查询系统 课程设计报告题目:招生信息查询系统课程名称:C语言程序设计专业班级:信息安全1302学号:姓名:指导教师:报告日期:2014年9月17日计算 ...

  8. 查询oracle表序列,Oracle查询表、视图、序列等信息查询

    Oracle查询表.视图.序列等信息查询以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这几天做性能优化 网上找了些资料 ...

  9. python爬取微博热门消息(三)—— 爬取微博热门信息的功能函数

    微博的热搜榜对于研究大众的流量有非常大的价值. 今天的教程就来说说如何爬取微博的热搜榜. 感兴趣的小伙伴可以 收藏 + 关注 哦! 另外,关于本项目的效果展示,以及教程,点击一下链接即可. pytho ...

最新文章

  1. 【 karle 专栏 】Android 初探底层知识系列
  2. 解决安装mysql的”A Windows service with the name MySQL already exists.“问题
  3. canal能监控多个mysql_learning-mysql-canal
  4. opencv第一课 打开一个图片
  5. 农发行:BI数据平台建设
  6. python中json模块博客园_Python中的Json模块详解
  7. MongoDB实战(7)索引与性能
  8. python partition by函数_python – 避免Spark窗口函数中单个分区模式的性能影响
  9. oracle windows server 2008,Node.js 在 Windows Server 2008 X64 连接Oracle 数据库
  10. 进入快速通道的委托(深入理解c#)
  11. Centos6.8 搭建Lvs+Keepalived
  12. 飞天茅台也可以在天猫上购买了,售价1499元!
  13. Unity API学习笔记(2)-GameObject的3种Message消息方法
  14. SQL注入环境搭建及多种注入类型测试实验
  15. why elmlang:最简最安全的full ola stack的终身webappdev语言选型
  16. 病毒+蠕虫+bot+rootkit
  17. Win10 安装 PySC2 环境 -- DeepMind联合战网开发的《星际争霸 II》强化学习环境
  18. 有什么发音真实自然有感情的配音软件吗?
  19. 设置MAC地址和动态IP
  20. 有什么变音视频软件?这些软件值得收藏

热门文章

  1. WRF模式的运行(三)
  2. win10中谷歌浏览器输入任何字符导致浏览器崩溃的解决方法
  3. Ubuntu全盘备份和恢复记录
  4. 离线文件服务器,qq离线文件服务器上的离线文件能保留几天(一般7天)?
  5. 期望值(Expect value)
  6. 2022焊工(初级)特种作业证考试题库及模拟考试
  7. 4.3 C语言的高级用法以及易错点
  8. css利用什么xhtml标记构建网页布局,css是利用什么XHTML标记构建网页布局
  9. oracle 配置sde,配置多个Oracle实例的sde服务
  10. 【技术白皮书】第二章:OCR智能文字识别回顾——自然语言文本发展历程