最近春运高峰,本人从12月开始买过年回家的火车票,然鹅~现实总是那么残酷,放票时间记不住,要么就是不能实时盯着刷票,外面的软件也不知道靠不靠谱,反正是没买到票,所以一怒之下,自己做一个12306余票查询系统,可以实现以下一些功能:

1. 设置目标位置进行查询余票
2. 通过设定条件监控到余票后进行12306账号登录
3. 12306登录及图片识别(自动登录功能)
4. 自动下单功能
5. 邮件通知付款功能

ok,整个博客内容包括以上代码实现,我们按照惯例,循序渐进,先讲第一篇【实现12306余票查询】

-----------------------------------------------------我是分割线、

第一步:查看12306查询接口

通过截图我们可以看到,查询接口是:

https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2020-01-16&leftTicketDTO.from_station=SZQ&leftTicketDTO.to_station=SHH&purpose_codes=ADULT

https://kyfw.12306.cn/otn/leftTicket/queryZ + data + from_station + to_station + purpose_codes
这样一个连接拼接而成,那我们要做的就是按照他这种格式,传入参数进去即可。

第一步:定义类并对接口参数进行设置和组装

class LeftTicketDTO:"""查询余票参数信息"""def __init__(self, train_date=datetime.date.today().strftime('%Y-%m-%d'), from_station='SZQ',to_station='GZQ', purpose_codes='ADULT'):self.train_date = train_dateself.from_station = from_stationself.to_station = to_stationself.purpose_codes = purpose_codesdef encode_url_para(self):paras = ['train_date=' + self.train_date,'from_station=' + self.from_station,'to_station=' + self.to_station]p = '&'.join(['leftTicketDTO.' + v for v in paras])return p + '&purpose_codes=' + self.purpose_codes

第二步:我们把所需要的车次信息捞出来,进行初始化

class Train:"""车次信息"""def __init__(self, item):"""使用列表顺序初始化火车信息:param item: 12306火车信息列表:return:"""# self.field_0 = item[0]# 状态self.status = item[1]# 车票号self.train_no = item[2]# 车次self.station_train_code = item[3]# 起始站代号self.start_station_code = item[4]# 终点站代号self.end_station_code = item[5]# 出发站代号self.from_station_code = item[6]# 到达站代号self.to_station_code = item[7]# 出发时间self.start_time = item[8]# 到达时间self.arrive_time = item[9]# 运行时长self.run_time = item[10]# 是否可买self.can_buy = item[11]self.yp_info = item[12]# 出发日期self.start_train_date = item[13]self.train_seat_feature = item[14]self.location_code = item[15]self.from_station_no = item[16]self.to_station_no = item[17]self.is_support_card = item[18]self.controlled_train_flag = item[19]self.gg_num = item[20]self.gr_num = item[21]self.qt_num = item[22]# 软卧self.rw_num = item[23]# 软座self.rz_num = item[24]self.tz_num = item[25]# 无座self.wz_num = item[26]self.yb_num = item[27]# 硬卧self.yw_num = item[28]self.yz_num = item[29]# 二等座self.edz_num = item[30]# 一等座self.ydz_num = item[31]# 商务特等座self.swz_num = item[32]# 动卧self.dw_num = item[33]self.yp_ex = item[34]self.seat_types = item[35]self.exchange_train_flag = item[36]@propertydef key_info(self):"""获取车次的关键信息:return:"""return {'状态': self.status,'车次': self.station_train_code,'起始站代号': self.start_station_code,'终点站代号': self.end_station_code,'出发站代号': self.from_station_code,'到达站代号': self.to_station_code,'出发时间': self.start_time,'到达时间': self.arrive_time,'运行时长': self.run_time,'是否可买': self.can_buy,'出发日期': self.start_train_date,'软卧': self.rw_num,'软座': self.rz_num,'无座': self.wz_num,'硬卧': self.yw_num,'二等座': self.edz_num,'一等座': self.ydz_num,'商务特等座': self.swz_num,'动卧': self.dw_num}

第三步:请求12306地址,进行查询

def get_trains(dto):"""获取余票信息:param dto::return:"""# 余票查询链接地址可能会变,其中结尾处的Z可能会被替换为[A-Z],注意!!!url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ'url = url + '?' + dto.encode_url_para()# 请求头hds = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/74.0.3729.157 Safari/537.36','Cookie': 'JSESSIONID=F8909A46584B13B74DE18535CC9DFE4;'}try:trains = []print('正在查询余票信息:', url)# 访问请求链接rsp = requests.get(url, headers=hds)text = json.loads(rsp.content.decode())# 检查返回码if text['httpstatus'] != 200:print('获取余票信息异常,', text)return# 获取想要的数据result = text['data']['result']print('共获取到{0}趟车次信息:'.format(len(result)))for v in result:item = [f for f in v.split('|')]t = Train(item)trains.append(t)except Exception as e:print('获取数据异常, {0} -> {1}'.format(Exception, e))return trains

第四步:传参并进行查询

备注:如何看站点唯一标识,可以通过以下接口看:https://kyfw.12306.cn/otn/resources/js/framework/station_name.js
或者直接在12306页面请求,

def test():"""测试代码:return:"""import prettytable# 获取票信息para = LeftTicketDTO(from_station='IOQ', to_station='SNH', train_date='2020-01-15')trains = get_trains(para)if not trains:print('未找到符合条件的车次信息')return# 组装信息tab = prettytable.PrettyTable()# 标题头tab.field_names = trains[0].key_info.keys()# 组装车次信息for t in trains:tab.add_row(t.key_info.values())# 表格显示车次信息print(tab)

完整代码如下:

# -*- coding: utf-8 -*-
import json
import requests
import datetimeclass Train:"""车次信息"""def __init__(self, item):"""使用列表顺序初始化火车信息:param item: 12306火车信息列表:return:"""# self.field_0 = item[0]# 状态self.status = item[1]# 车票号self.train_no = item[2]# 车次self.station_train_code = item[3]# 起始站代号self.start_station_code = item[4]# 终点站代号self.end_station_code = item[5]# 出发站代号self.from_station_code = item[6]# 到达站代号self.to_station_code = item[7]# 出发时间self.start_time = item[8]# 到达时间self.arrive_time = item[9]# 运行时长self.run_time = item[10]# 是否可买self.can_buy = item[11]self.yp_info = item[12]# 出发日期self.start_train_date = item[13]self.train_seat_feature = item[14]self.location_code = item[15]self.from_station_no = item[16]self.to_station_no = item[17]self.is_support_card = item[18]self.controlled_train_flag = item[19]self.gg_num = item[20]self.gr_num = item[21]self.qt_num = item[22]# 软卧self.rw_num = item[23]# 软座self.rz_num = item[24]self.tz_num = item[25]# 无座self.wz_num = item[26]self.yb_num = item[27]# 硬卧self.yw_num = item[28]self.yz_num = item[29]# 二等座self.edz_num = item[30]# 一等座self.ydz_num = item[31]# 商务特等座self.swz_num = item[32]# 动卧self.dw_num = item[33]self.yp_ex = item[34]self.seat_types = item[35]self.exchange_train_flag = item[36]@propertydef key_info(self):"""获取车次的关键信息:return:"""return {'状态': self.status,'车次': self.station_train_code,'起始站代号': self.start_station_code,'终点站代号': self.end_station_code,'出发站代号': self.from_station_code,'到达站代号': self.to_station_code,'出发时间': self.start_time,'到达时间': self.arrive_time,'运行时长': self.run_time,'是否可买': self.can_buy,'出发日期': self.start_train_date,'软卧': self.rw_num,'软座': self.rz_num,'无座': self.wz_num,'硬卧': self.yw_num,'二等座': self.edz_num,'一等座': self.ydz_num,'商务特等座': self.swz_num,'动卧': self.dw_num}class LeftTicketDTO:"""查询余票参数信息"""def __init__(self, train_date=datetime.date.today().strftime('%Y-%m-%d'), from_station='SZQ',to_station='GZQ', purpose_codes='ADULT'):self.train_date = train_dateself.from_station = from_stationself.to_station = to_stationself.purpose_codes = purpose_codesdef encode_url_para(self):paras = ['train_date=' + self.train_date,'from_station=' + self.from_station,'to_station=' + self.to_station]p = '&'.join(['leftTicketDTO.' + v for v in paras])return p + '&purpose_codes=' + self.purpose_codesdef get_trains(dto):"""获取余票信息:param dto::return:"""# 余票查询链接地址可能会变,其中结尾处的Z可能会被替换为[A-Z],注意!!!url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ'url = url + '?' + dto.encode_url_para()# 请求头hds = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/74.0.3729.157 Safari/537.36','Cookie': 'JSESSIONID=F8909A46584B13B74DE18535CC9DFE4;'}try:trains = []print('正在查询余票信息:', url)# 访问请求链接rsp = requests.get(url, headers=hds)text = json.loads(rsp.content.decode())# 检查返回码if text['httpstatus'] != 200:print('获取余票信息异常,', text)return# 获取想要的数据result = text['data']['result']print('共获取到{0}趟车次信息:'.format(len(result)))for v in result:item = [f for f in v.split('|')]t = Train(item)trains.append(t)except Exception as e:print('获取数据异常, {0} -> {1}'.format(Exception, e))return trainsdef test():"""测试代码:return:"""import prettytable# 获取票信息para = LeftTicketDTO(from_station='IOQ', to_station='SNH', train_date='2020-01-15')trains = get_trains(para)if not trains:print('未找到符合条件的车次信息')return# 组装信息tab = prettytable.PrettyTable()# 标题头tab.field_names = trains[0].key_info.keys()# 组装车次信息for t in trains:tab.add_row(t.key_info.values())# 表格显示车次信息print(tab)if __name__ == '__main__':test()

测试结果:

ok 以上就是12306余票查询第一篇实现,下一篇将介绍自动登录12306账号并进行下单操作,敬请期待哦~~~

创作不易,喜欢的话给喵喵赏点吧~(可怜眼神)

火车票查询系统(一)——利用python实现监控12306余票查询相关推荐

  1. Python之12306余票查询

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

  2. python123判断火车票座位_【Python】实现12306余票监控

    首先我们打开12306余票查询窗口 上图红色框的地方,就是表示列车有无车票的地方,我们需要根据这里边的数据来判断. 这里边有一些需要注意的就是,里边表示有票的有字符串"有"和数字& ...

  3. 最新Python实现12306余票查询系统

    首先感谢这篇博客的引导,但是这篇文章已经比较旧了,12306进行了改版,源码编排方式有了变化.12306源码获取的方法可以从这篇博客中学习,我在这里主要贴出对于目前最新的12306的Python余票查 ...

  4. 12306 余票查询API浅探索

    12306 余票查询API浅探索 余票查询请求分析 响应数据解密代码查找调试 数据说明 余票查询请求分析 点击查询,F12进入控制台,进入NetWork面板,查看发送的请求: 点入请求查看详情,很明显 ...

  5. 返乡之路不容易之12306余票查询并给出备选方案v2

    在第一版的返乡之路不容易之12306余票查询并给出备选方案中,给出了余票查询和备选方案推荐,但当时有两个问题: 没有备选排名:虽然给出了备选,但哪个备选好没有给出排序 没有座位信息(商务/一等/二等/ ...

  6. 12306余票查询(爬虫)

    经常因为忙而忘记给妹子订票. 每次结果不言而喻. 登个12306查下余票其实很简单,但不知道为什么就是不想登. 所以弄了个爬虫脚本直接查询余票.希望下个女票不会这样尴尬,哈哈哈哈哈哈 12306首页为 ...

  7. 铁路局12306余票查询的实现

    离上次写的类似于铁道部12306城市选择框的实现过了都快一个月了,最近一直在忙,在学习sharepoint2013,虽然早就实现了12306的余票查询,但是一直没抽出时间来写,刚好这几天也快放假了,抽 ...

  8. 使用c#中的HttpWebRequest实现12306余票查询

    准备工作 下载用于解析JSON的类库(Newtonsoft.Json.dll)(下载地址:Newtonsoft.Json.dll): 在C#项目中添加对其的引用. 在程序中导入命名空间: 1 2 3 ...

  9. php 12306余票查询,PHP火车余票查询的API,12306官方的API

    我在做自己微信的时候需要的火车票查询的东西,注册的东西等等太多了,今天就简单的做了下测试看能获取到不,数据怎么样处理速度怎么样,因为是个人做所以就没有去其他网站上找接口,就自己做了下!下边把方法放出来 ...

最新文章

  1. nginx配置参数详解
  2. [C#]统计文本文件txt中的行数(快速读取)
  3. 5添加一块盘_win系统,Linux系统,重装系统后,添加盘简易教程
  4. android编译产生的apk或so不安装 .
  5. boseqc35能不能连电脑_连win7都用不了?轻量级LXLE系统,只要10分钟,旧电脑也能运行如飞!...
  6. 微信小程序view动态长度_微信小程序实现动态获取元素宽高的方法分析
  7. python在材料模拟中的应用_材料模拟python_模拟-python模拟-在不妨碍实现的情况下修补方法...
  8. python全栈要学什么_python全栈要学什么 python全栈学习路线
  9. 案例-旋转木马(CSS3)
  10. numpy的array和matrix
  11. php算数组内值的总和,怎样使用array_sum() 计算数组元素值总和
  12. cart算法 java_决策树学习笔记(三):CART算法,决策树总结
  13. java8接口可以实现方法目的_Java8 collector接口的定制实现
  14. Android地图—— Mapbox 10.3.0 接入与基础使用
  15. 一氧化碳(CO)荧光探针cas855751-82-5,二氧化硫荧光探针 激发波长653 nm,发射波长836 nm-齐岳介绍
  16. 【第126期】游戏策划:给@毛毛团的简历分析
  17. 有限元编程示例matlab + C++
  18. 使用SCI-HUB下载论文
  19. BibTex中参考文献种类
  20. 微信订阅号获取openid

热门文章

  1. 《植物大战僵尸》网页脚本版
  2. 如何简单地理解泊松分布
  3. 河南巴旦木生态农业:巴旦木品种介绍丨怎么选择好的巴旦木树苗品种?
  4. eyoucms 1.5.5任意命令执行漏洞(0day)
  5. Android颜色透明度16进制表
  6. docker-comose搭建openldap + jenkins
  7. 中登公司统计数据好像有问题,看不懂。
  8. (MM)物料BOM与生产BOM对比表
  9. autojs做小游戏-连连看
  10. 模拟CMOS集成电路设计入门学习(3)