python查询12306余票_使用 Python 在 12306 查询火车票余票
实现原理比较简单,就是调用 12306 的查票接口获取 JSON 数据再重新组装,取出合适的数据。配合发送邮件模块,就能实现实时获取余票数据。
由于发现 12306 经常进行查票接口部分参数的更换,下面就以谷歌浏览器为例寻找一个查票接口:
如图,在谷歌浏览器的调试窗口 network 标签页下点击网页上的查询按钮可以看到一个 get 请求,其请求的数据就是我们需要的 JSON 数据。
看一下原生数据,在浏览器中打开这个链接:
可以看出需要我们传递三个参数:
查询日期,如:2018-10-17
出发地火车站电报码,如:BJP (北京)
到达地火车站电报码,如:KMM (昆明)
不知道电报码的话百度一下就 ok 了。
好,现在就处理数据,看代码:
我们需要循环遍历每辆车的信息,原始数据 result 中每一条就是一个车次信息,其间采用竖线分隔。
使用 python 取子串获取的信息如下:
item = {}
# 循环遍历每辆列车的信息
data_list = raw_train.split('|')
train_type = data_list[3][0]
print data_list
# 车次号码
item['train_no'] = data_list[3]
# 出发站
from_station_code = data_list[6]
item['from_station_name'] = stations_list[from_station_code]
# 终点站
to_station_code = data_list[7]
item['to_station_name'] = stations_list[to_station_code]
# 出发时间
item['start_time'] = data_list[8]
# 到达时间
item['arrive_time'] = data_list[9]
# 总耗时
item['time_fucked_up'] = data_list[10]
# 商务特等
item['business_class_seat'] = data_list[25] or '--'
# 一等座
item['first_class_seat'] = data_list[31] or '--'
# 二等座
item['second_class_seat'] = data_list[30] or '--'
print item['second_class_seat']
# 软卧
item['soft_sleep'] = data_list[23] or '--'
# 硬卧
item['hard_sleep'] = data_list[28] or '--'
# 硬座
item['hard_seat'] = data_list[29] or '--'
# 无座
item['no_seat'] = data_list[26] or '--'
代码就自己看吧,很简单的 python 基础。
经过简单的组装,就得到了简单的示例程序,下面是完整代码:
# coding=utf-8
from time import sleep
import datetime
import requests
import smtplib
from email.mime.text import MIMEText
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def query_trains(data):
url = 'https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(
data.date, data.form, data.to
)
jsondata = ""
#print requests.get(url).text
while jsondata=="" or jsondata==None:
try:
print(url)
print("try get json")
jsondata = requests.get(url).json()
# print jsondata
except:
jsondata = ""
print("get json error")
sleep(7)
return jsondata
def sort_trains(raw,data):
flag=0
for_sale = []
not_for_sale = []
raw_trains = raw['data']['result']
stations_list = raw['data']['map']
content = "有新的车票啦!!\r\n车票信息如下:\r\n-------------------------\r\n"
content+="运行区间:"+stations_list[data.form]+"---"+stations_list[data.to]+"---"+data.date+"\r\n"
for i in raw_trains:
train_data=i.split("|")
if int(str(train_data[8])[0:2])<18 and int(str(train_data[8])[0:2])>0: #查找下午18点以前的火车
if train_data[0]=="":
print str(train_data[3]+"--"+train_data[8]+"-"+train_data[10]+"-已售空")
else:
if train_data[26] != "" and train_data[26]!="无": # 无座
# print(str(train_data[3] + "--" + train_data[8] + "-" + train_data[10] + "-"+train_data[26])+ "-无座有票")
content+=(str(train_data[3] + "--" + train_data[8] + "-" + train_data[10] + "-"+train_data[26])+ "-无座有票"+"\r\n")
flag = 1
if train_data[29] != "" and train_data[29]!="无": # 硬座
# print(str(train_data[3] + "--" + train_data[8] + "-" + train_data[10] + "-"+train_data[29])+ "-硬座有票")
content +=(str(train_data[3] + "--" + train_data[8] + "-" + train_data[10] + "-"+train_data[29])+ "-硬座有票"+"\r\n")
flag = 1
if train_data[30]!="" and train_data[30]!="无": #二等座
# print(str(train_data[3]+"--"+train_data[8]+"-"+train_data[10]+ "-"+train_data[30]) + "-二等座有票")
content +=(str(train_data[3]+"--"+train_data[8]+"-"+train_data[10]+ "-"+train_data[30]) + "-二等座有票"+"\r\n")
flag = 1
content+="-------------------------\n"
content += "时间:"+datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S')+"\r\n"
content += "Powered By:xynling"
if flag==1:
print content
class TrainData:
def __init__(self,form,to,date):
self.form = form
self.to=to
self.date=date
def main():
while True:
if (int(datetime.datetime.now().strftime('%H'))>=6):
td=TrainData('BJP','KMM','2018-10-17')
sort_trains(query_trains(td),td)
sleep(30) #休眠30s继续执行
else:
print(int(datetime.datetime.now().strftime('%H')))
sleep(5)
if __name__ == '__main__':
main()
是循环 30 秒进行查询的。
查询结果如图:
结合邮箱进行微信提醒:
如果放在服务器上运行就能很方便的收到车票提醒啦!
实现原理部分摘自网络,文章原创,转载请注明转载自 ynlflixin 的个人博客!
python查询12306余票_使用 Python 在 12306 查询火车票余票相关推荐
- python12306买票_利用python代码写的12306订票代码
本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考. 具体实现方法如下: import datetime import json import re import sys im ...
- python快速排名seo代码_【python】seo必备排名一目了然,360搜索排名查询
[Python] 纯文本查看 复制代码#360搜索排名查询 # -*- coding=utf-8 -*- import requests from lxml import etree headers= ...
- python调用api应用接口_第三方免费快递物流查询接口平台(快递鸟)api接口调用...
随着网购的发展,快递业也随之壮大.快递查询接口对接的需求量也越来越大,下面是对免费快递接口做的整理,并附上调用流程,分享给大家. 项目开发中,有些需求难免会用到关于快递的一些Api接口:本篇主要介绍的 ...
- python编写抢座位软件_用Python抢到回家的车票,so easy!
" 盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票. 据悉,今年春运期间,全国铁路发送旅客人次同比将增长 8.0%.达到 4.4 亿人次. 20 ...
- python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...
2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...
- 简述python语言的主要领域_简述Python语言经验总结
Python语言是不被大多数人知道的东西,这里就简单概述下Python语言,顺便闲谈一 下Python 标准库."俗话"说:库即是语言,语言即是库.由此可见拥有一套高质量.具备良好 ...
- 有人用python抢到过吗_用Python抢到回家的车票,so easy!
# -*- coding=utf-8 -*- # 关于软件使用配置说明,一定要看!!! # ps: 如果是候补车票,需要通过人证一致性核验的用户及激活的"铁路畅行"会员可以提交候补 ...
- python中nomodulenamed怎么解决_关于 python ImportError: No module named 的问题
今天在 centos 下安装 python setup.py install 时报错:ImportError: No module named sysconfig, 当时急着用,就顺手直接源码编译了一 ...
- python处理数据的包_在Python中利用Into包整洁地进行数据迁移的教程
动机 我们花费大量的时间将数据从普通的交换格式(比如CSV),迁移到像数组.数据库或者二进制存储等高效的计算格式.更糟糕的是,许多人没有将数据迁移到高效的格式,因为他们不知道怎么(或者不能)为他们的工 ...
- python文本结构化处理_在Python中标记非结构化文本数据
python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...
最新文章
- jquery基础总结
- Ext.Net ASP.NET
- Visual Studio 2013 error MS8020 Build tools v140 cannot be found 解决系统 不同部分软件 所依赖编译器版本不同的矛盾
- 对php的感受100字_最新2020个人年终工作总结开头范文100字
- mysql基础之四:int(M)中M的含义
- Early Z Culling 优化
- 《回答sort一例》-linux命令五分钟系列之二十八
- mysql view 能和表关联吗_MySQL数分:复杂查询
- Smali语法汇总(二)
- UE4 骨骼重定向记录
- 路由器上下行测试软件,无线传输性能测试平台和测试方法
- 杭州好玩景点攻略198
- 数据抽取:增量与全量的区别
- [深度学习论文笔记]3D AGSE-VNet: An Automatic Brain Tumor MRI Data Segmentation Framework
- Pettitt突变点检测
- Java序列化,碰到serialVersionUID不一致怎么处理?
- 域名代购还需要关注到全方位宣传
- ps基础知识学习总结
- 语音信号处理初学者概念总结
- 软件开发时,比较好的辅助软件推荐