前一篇–>docopt实现参数的输入—–查询任意时间任意车站余票

票价的查询根据前面result的解析是无法获取的,票价需要另外发送请求获取。


请求链接:
https://kyfw.12306.cn/otn/leftTicket/queryTicketPrice?train_no=88000K131008&from_station_no=12&to_station_no=27&seat_types=1413&train_date=2018-01-30
关注train_no、from_station_no、to_station_no、seat_types、train_date这几个参数。

有了前面教程解析车票信息result的基础解析车票也是大同小异罢了,找出对应车票类型对应的票价对应的位置就行。

实现获取车票票价的函数:

#pricesDic用于存放票价信息
pricesDic = {'A': '','B': '','C': '','D': '','E': '','F': '','G': '','H': '','I': '','J': ''}def getPrice(threadname,train_no, from_station_no, to_station_no, seat_types, date,pricesDic):while 1:try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}moneyUrl = "https://kyfw.12306.cn/otn/leftTicket/queryTicketPrice?train_no={}&from_station_no={}&to_station_no={}&seat_types={}&train_date={}".format(train_no, from_station_no, to_station_no, seat_types, date)req = urllib.request.Request(url=moneyUrl, headers=headers)r_price = urllib.request.urlopen(req).read().decode('utf-8')if r_price.startswith(u'\ufeff'):r_price = r_price.encode('utf8')[3:].decode('utf-8')# print(r_price)r_price = json.loads(r_price)breakexcept:continueprice = r_price['data']price = dict(price)#获取data字典,票价信息在字典中A = ('A9' in price.keys())#商务座票价对应key是A9或者Pif A == False:A = ('P' in price.keys())if A == False:A = ''else:A = price['P']else:A = price['A9']B = ('M' in price.keys())#一等座对应key为Mif B == False:B = ''else:B = price['M']C = ('O' in price.keys())#二等座对应key为Oif C == False:C = ''else:C = price['O']D = ('A6' in price.keys())if D == False:D = ''else:D = price['A6']E = ('A4' in price.keys())if E == False:E = ''else:E = price['A4']F = ('F' in price.keys())if F == False:F = ''else:F = price['F']G = ('A3' in price.keys())if G == False:G = ''else:G = price['A3']H = ('A2' in price.keys())if H == False:H = ''else:H = price['A2']I = ('A1' in price.keys())if I == False:I = ''else:I = price['A1']J = ('WZ' in price.keys())if J == False:J = ''else:J = price['WZ']pricesDic['A'] = ApricesDic['B'] = BpricesDic['C'] = CpricesDic['D'] = DpricesDic['E'] = EpricesDic['F'] = FpricesDic['G'] = GpricesDic['H'] = HpricesDic['I'] = IpricesDic['J'] = J

我实现查询票价使用了Python中的线程,另外开启一个线程去查询票价:

import threadingthreadLock = threading.Lock()
class myThread (threading.Thread):def __init__(self, threadID, threadName, train_no, from_station_no, to_station_no, seat_types, date,pricesDic):threading.Thread.__init__(self)self.threadID = threadIDself.threadName = threadNameself.train_no = train_noself.from_station_no = from_station_noself.to_station_no = to_station_noself.seat_types = seat_typesself.date = dateself.pricesDic = pricesDicdef run(self):#print ("开始线程:" + self.threadName)# 获取锁,用于线程同步threadLock.acquire()getPrice(self.threadName, self.train_no, self.from_station_no, self.to_station_no, self.seat_types, self.date, self.pricesDic)# 释放锁,开启下一个线程threadLock.release()#print ("退出线程:" + self.threadName)

在resolveData函数中开启线程查询票价,并且将票价加入余票信息中:
再次修改resolveData函数,观察变化:

def resolveData(from_station, to_station, date):#拼接出查询链接url = 'https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(date, stations2CODE[from_station], stations2CODE[to_station])#获取数据while 1:try:data = getData(url)lists = json.loads(data)["data"]["result"]# if data['status'] == False:#     print('获取失败!请检查网络')#     breakbreakexcept:continuecont = []name = ["station_train_code","from_station_name",'start_time',"lishi","swz_num","zy_num","ze_num","gr_num","rw_num","dw_num","yw_num","rz_num","yz_num","wz_num","qt_num","note_num"]color = Colored()for items in lists:data = {"station_train_code": '',"from_station_name": '',"to_station_name": '','start_time': '','end': '',"lishi": '',"swz_num": '',"zy_num": '',"ze_num": '',"dw_num": '',"gr_num": '',"rw_num": '',"yw_num": '',"rz_num": '',"yz_num": '',"wz_num": '',"qt_num": '',"note_num": ''}item = items.split('|')data['station_train_code'] = item[3]data['from_station_name'] = item[6]data['to_station_name'] = item[7]data['start_time'] = item[8]data['arrive_time'] = item[9]data['lishi'] = item[10]data['swz_num'] = item[32] or item[25]# 商务座在32或25位置data['zy_num'] = item[31]data['ze_num'] = item[30]data['gr_num'] = item[21]data['rw_num'] = item[23]data['dw_num'] = item[27]data['yw_num'] = item[28]data['rz_num'] = item[24]data['yz_num'] = item[29]data['wz_num'] = item[26]data['qt_num'] = item[22]if item[0] == 'null':data['note_num'] = item[1]else:data['note_num'] = color.white(item[1])#解析出查询票价需要的参数train_no = item[2]from_station_no = item[16]to_station_no = item[17]types = item[35]getPriceThread = myThread(1, "Thread-1", train_no, from_station_no, to_station_no, types, date, pricesDic)getPriceThread.start()#开启查询车票的线程for pos in name:if data[pos] == '':data[pos] = '-'threadLock.acquire()#必须加锁,这是为了线程同步for pos in priceName:#将票价添加进余票信息中if pos == 'swz_num':data['swz_num'] = data['swz_num'] +'\n'+ color.blue(pricesDic['A'])if pos == 'zy_num':data['zy_num'] = data['zy_num'] +'\n'+ color.blue(pricesDic['B'])if pos == 'ze_num':data['ze_num'] = data['ze_num'] +'\n'+ color.blue(pricesDic['C'])if pos == 'gr_num':data['gr_num'] = data['gr_num'] +'\n'+ color.blue(pricesDic['D'])if pos == 'rw_num':data['rw_num'] = data['rw_num'] +'\n'+ color.blue(pricesDic['E'])if pos == 'dw_num':data['dw_num'] = data['dw_num'] +'\n'+ color.blue(pricesDic['F'])if pos == 'yw_num':data['yw_num'] = data['yw_num'] +'\n'+ color.blue(pricesDic['G'])if pos == 'rz_num':data['rz_num'] = data['rz_num'] +'\n'+ color.blue(pricesDic['H'])if pos == 'yz_num':data['yz_num'] = data['yz_num'] +'\n'+ color.blue(pricesDic['I'])if pos == 'wz_num':data['wz_num'] = data['wz_num'] +'\n'+ color.blue(pricesDic['J'])threadLock.release()cont.append(data)color = Colored()tickets = []for x in cont:tmp = []for y in name:if y == "from_station_name":s = color.green(stations2CN[x[y]]) + '\n' + color.red(stations2CN[x["to_station_name"]])tmp.append(s)elif y == "start_time":s = color.green(x[y]) + '\n' + color.red(x["arrive_time"])tmp.append(s)elif y == "station_train_code":s = color.yellow(x[y])tmp.append(s)else:tmp.append(x[y])tickets.append(tmp)return tickets#返回所有车次余票信息

最终测试:

成功获取票价!

到这来为止我们就结束了DOS界面的开发。源代码:
链接:https://pan.baidu.com/s/1c1Gdxra 密码:6xpz

我在此基础上实现了连续多天的查询,并且实现了列车类型的过滤,
源代码在此:链接:https://pan.baidu.com/s/1jI2Ak4Y 密码:02gu
不懂得地方欢迎交流。
代码有BUG看看能不能您解决

(五)Python查询12306余票:添加票价信息相关推荐

  1. (六)Python查询12306余票:升级版-----图形化界面代码

    上一篇–>添加票价信息 实现效果: 主要代码观看 12306.py: from tkinter import * import re import tkinter.messagebox as m ...

  2. python查询12306余票_Python脚本实现12306火车票查询系统

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

  3. (四)Python查询12306余票:docopt实现参数的输入-----查询任意时间任意车站余票

    前一篇–>漂亮的输出-–prettytable和colorama的使用       在前面的文章中我们能实现很漂亮的输出了,可是只是固定时间固定车站之间的车票信息,在本次中我们使用docopt来 ...

  4. (三)Python查询12306余票:漂亮的输出-----prettytable和colorama的使用

    前一篇–>联网查询余票信息并解析 在前面的代码中我们已经实现了对result结果的解析,并且能把车票信息打印出来了.可是输出的格式很不好控制,这时我们需要使用prettytable来实现将车票信 ...

  5. (二)、Python查询12306余票:联网查询余票信息并解析

    前一篇–>实现始发站.终点站和出发日期的合法性检验 以下如果有的变量不明白说明在前面的文章已经介绍了,切记! 首先我们来看看每查询一条信息12306网站返回的信息: 请求链接: https:// ...

  6. 项目:用Python查询12306余票

    项目最终效果: 成功查询出2018-01-10西安至北京的所有列车. 该项目环境安装: - Python3.6.4环境 ; - pip install requests; - pip install ...

  7. (一)Python查询12306余票:实现始发站、终点站和出发日期的合法性检验

    项目介绍首页 1.创建字典info存放查询信息(始发站.终点站.出发日期): info = {'from_station': '','to_station': '','from_date': '' } ...

  8. Python之12306余票查询

    简单的Python学习,用Python完成一个12306余票查询- Python之12306余票查询 参考资料来自Python 实现火车票查询工具 需要用到的第三方库 requests,使用 Pyth ...

  9. python实现12306余票

    今天就和大家一起来讨论一下python实现12306余票查询(pycharm+python3.7),一起来感受一下python爬虫的简单实践 我们说先在浏览器中打开开发者工具(F12),尝试一次余票的 ...

最新文章

  1. MySQL更新命令_UPDATE
  2. OpenCV学习笔记2---命名规约
  3. IT工作十年总结之3个图表与统计查询对象
  4. Intel Realsense D435 USB线长、光纤线长测试(使用普通USB3.0数据线最长不能超过4M,使用普通USB3.0数据线+USB3.0光纤数据线,不能超过1+5=6M)
  5. 做事用人 用人做事_做事:构建我的第一个Web应用程序的经验教训
  6. java activity生命周_关于Activity的生命周期和任务栈的理解
  7. 微软低代码工具 Power Apps 配置不当,暴露3800万条数据记录
  8. Java开发框架!高级java工程师简历模板
  9. CMSIS RTOS API,内核通用API接口
  10. 【Python】利用tkinter开发AI对战井字棋游戏
  11. HUAWER 华为5G无线数据终端 和 TP-LINK路由器AX6000连接及注意事项
  12. 2022年自动化专业、电气工程及其自动化专业大学生可以参加哪些专业相关的竞赛?
  13. 今天凌晨,AWS一口气又双叒叕发布了N个新服务
  14. 基于单片机的踢球智能车系统设计
  15. 机械原理复习试题及答案
  16. 程序员必备技能之Markdown
  17. Linux mmap 详解
  18. Python下进程同步之互斥锁、信号量、事件机制
  19. 多易教育KAFKA实战(1)-KAFKA集群安装和shell客户端
  20. 印欧语系及文化(Indo-European and Culture)英汉双语本(中译本,中文版)

热门文章

  1. java遍历多层map_Java遍历Map对象的四种方式
  2. HDOJ 5621 KK's Point
  3. 掌握玩家“最大公约数”,趣丸集团以TT语音为矛解码电竞新经济
  4. Java容器坐标起点_Java的屏幕坐标是以像素为单位, 容器的左下角被确定为坐标的起点。...
  5. 有喜无惊 2013苹果秋季发布会6亮点4遗憾
  6. 1.word2019
  7. xps9360换硬盘_戴尔新一代XPS13-9360的升级真的划算吗?
  8. c语言直角梯形图案,html – 带有直角梯形的盒子形状
  9. jQuery全屏滚动插件 Fullpage.js 及 move.js
  10. Spring事务管理-超时时间