实现原理比较简单,就是调用 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 查询火车票余票相关推荐

  1. python12306买票_利用python代码写的12306订票代码

    本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考. 具体实现方法如下: import datetime import json import re import sys im ...

  2. python快速排名seo代码_【python】seo必备排名一目了然,360搜索排名查询

    [Python] 纯文本查看 复制代码#360搜索排名查询 # -*- coding=utf-8 -*- import requests from lxml import etree headers= ...

  3. python调用api应用接口_第三方免费快递物流查询接口平台(快递鸟)api接口调用...

    随着网购的发展,快递业也随之壮大.快递查询接口对接的需求量也越来越大,下面是对免费快递接口做的整理,并附上调用流程,分享给大家. 项目开发中,有些需求难免会用到关于快递的一些Api接口:本篇主要介绍的 ...

  4. python编写抢座位软件_用Python抢到回家的车票,so easy!

    " 盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票. ​ 据悉,今年春运期间,全国铁路发送旅客人次同比将增长 8.0%.达到 4.4 亿人次. ​ 20 ...

  5. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  6. 简述python语言的主要领域_简述Python语言经验总结

    Python语言是不被大多数人知道的东西,这里就简单概述下Python语言,顺便闲谈一 下Python 标准库."俗话"说:库即是语言,语言即是库.由此可见拥有一套高质量.具备良好 ...

  7. 有人用python抢到过吗_用Python抢到回家的车票,so easy!

    # -*- coding=utf-8 -*- # 关于软件使用配置说明,一定要看!!! # ps: 如果是候补车票,需要通过人证一致性核验的用户及激活的"铁路畅行"会员可以提交候补 ...

  8. python中nomodulenamed怎么解决_关于 python ImportError: No module named 的问题

    今天在 centos 下安装 python setup.py install 时报错:ImportError: No module named sysconfig, 当时急着用,就顺手直接源码编译了一 ...

  9. python处理数据的包_在Python中利用Into包整洁地进行数据迁移的教程

    动机 我们花费大量的时间将数据从普通的交换格式(比如CSV),迁移到像数组.数据库或者二进制存储等高效的计算格式.更糟糕的是,许多人没有将数据迁移到高效的格式,因为他们不知道怎么(或者不能)为他们的工 ...

  10. python文本结构化处理_在Python中标记非结构化文本数据

    python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...

最新文章

  1. jquery基础总结
  2. Ext.Net ASP.NET
  3. Visual Studio 2013 error MS8020 Build tools v140 cannot be found 解决系统 不同部分软件 所依赖编译器版本不同的矛盾
  4. 对php的感受100字_最新2020个人年终工作总结开头范文100字
  5. mysql基础之四:int(M)中M的含义
  6. Early Z Culling 优化
  7. 《回答sort一例》-linux命令五分钟系列之二十八
  8. mysql view 能和表关联吗_MySQL数分:复杂查询
  9. Smali语法汇总(二)
  10. UE4 骨骼重定向记录
  11. 路由器上下行测试软件,无线传输性能测试平台和测试方法
  12. 杭州好玩景点攻略198
  13. 数据抽取:增量与全量的区别
  14. [深度学习论文笔记]3D AGSE-VNet: An Automatic Brain Tumor MRI Data Segmentation Framework
  15. Pettitt突变点检测
  16. Java序列化,碰到serialVersionUID不一致怎么处理?
  17. 域名代购还需要关注到全方位宣传
  18. ps基础知识学习总结
  19. 语音信号处理初学者概念总结
  20. 软件开发时,比较好的辅助软件推荐

热门文章

  1. 探索MapReduce过程及分组详解
  2. Excel转换成VCF
  3. Echarts模板(一):南丁格尔玫瑰图
  4. Pytorch Gradient Checkpoint使用示例
  5. 轨道交通——信号知识——6202电气集中设备
  6. 计算机科学感言,计算机专业学生毕业感言
  7. 橡皮筋框QRubberBand Class
  8. uni-app中view和text组件和动画的使用
  9. 3DMax2014试用结束后激活教程
  10. flashfxp连接后文件名乱码问题