查询余票接口

打开12306官网,并进入余票查询页面,同时开启chrome浏览器F12控制台,以北京到上海为例,搜索2018年10月1日的余票信息,点击搜索按钮,可以在控制台发送了一条GET请求,请求结果以json字符串的形式放回,里面有查询到的余票信息。

通过python-requests来请求一下这个接口,比较意外的是这个接口并没有校验header信息,因此我们不用添加header。在测试中发现虽然12306官网主页提供了证书下载,但是这个https请求并不是必须校验证书,将requests方法中的verify参数设置为False取消校验也能正常返回结果。

import requests

url = 'https://kyfw.12306.cn/otn/leftTicket/queryA?leftTicketDTO.train_date=2018-10-01&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT'

requests.packages.urllib3.disable_warnings()

r = requests.get(url,verify=False).json()

yupiao = r['data']['result']

print(yupiao)

返回的json每一个元素就是一条火车线路,包含始发站代码,终点站代码,发车时间,每种座位的余票等信息,通过” | “分隔,需要注意的是每种座位的余票数量与网页展示的位置前后顺序并不是一一对应的,这个花了不少时间来确定每个对应关系。

将上一步返回结果放入循环中,每一个元素按照” | “符号分割,并从分割后的列表中依次取出需要的内容(城市代码,时间,车次,作为余票等信息)。

import requests

from tabulate import tabulate

#查询余票

def query():

url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2018-06-05&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT'

requests.packages.urllib3.disable_warnings()

r = requests.get(url,verify=False).json()

yupiao = r['data']['result']

table_header = ['车次','始发站','终点站','始发时间','到站时间','历时','商务特等座','一等座','二等座','高级软卧','软卧','动卧','硬卧','软座','硬座','无座'] #表格头

table_data = [] #数据添加至列表,作为表格的主体内容

for i in yupiao:

a = i.split('|') #分割字符串,a是个列表

is_null = a[0] #判断是否有票

train_code = a[3] #车次

start_city_code = a[4] #始发站城市代码

end_city_code = a[5] #终点站城市代码

start_time = a[8] #终点站开始时间

end_time = a[9] #终点站到达时间

total_time = a[10] #总共历时

shangwutedeng = a[32] #商务特等座

yideng = a[31] #一等座

erdeng = a[30] #二等座

gaojiruanwo = a[21] #高级软卧

ruanwo = a[23] #软卧

dongwo = a[33] #动卧

yingwo = a[28] #硬卧

ruanzuo = a[24] #软座

yingzuo = a[29] #硬座

wuzuo = a[26] #无座

#添加到元组

yupiao_tuple = (train_code,start_city_code,end_city_code,start_time,end_time,total_time,shangwutedeng,yideng,erdeng,gaojiruanwo,ruanwo,dongwo,yingwo,ruanzuo,yingzuo,wuzuo)

table_data.append(yupiao_tuple)

print(tabulate(table_data,headers=table_header,tablefmt='grid'))

在上面代码中使用了tabulate库,它可以把结果输出成易读的表格样式

参数化准备

再回头看之前请求的URL,这个GET请求有四个请求参数,分别代表如下:

leftTicketDTO.train_date --> 乘车日期

leftTicketDTO.from_station --> 始发站代码(例如北京北:VAP)

leftTicketDTO.to_station --> 终点站代码(例如上海虹桥:AOH)

purpose_codes --> 车票类型(普通票:ADULT,学生票:0X00)

第一个和第四个参数好填写,始发站和终点站代码我们现在并没有对应的表,不知道每个站点对应的代码,在网站上找一下。我们在页面上手动修改始发站和终点站的时候发现并没有发送新的https请求,可以猜测所有的站点信息应该是在一个js文件里面,然后通过页面的js方法来选择不同的站名,现在F12控制台切换至JS模块下,刷新这个余票查询页面。

python 发送邮件

import smtplib

from email.mime.text import MIMEText

# 第三方 SMTP 服务

mail_host = "smtp.163.com" # SMTP服务器

mail_user = "username" # 用户名

mail_pass = "passwd" # 密码

sender = 'user@163.com' # 发件人邮箱(最好写全, 不然会失败)

receivers = ['to_someone@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

content = '邮件内容!'

title = '邮件主题' # 邮件主题

message = MIMEText(content, 'plain', 'utf-8') # 内容, 格式, 编码

message['From'] = "{}".format(sender)

message['To'] = ",".join(receivers)

message['Subject'] = title

try:

smtpObj = smtplib.SMTP_SSL(mail_host, 465) # 启用SSL发信, 端口一般是465

smtpObj.login(mail_user, mail_pass) # 登录验证

smtpObj.sendmail(sender, receivers, message.as_string()) # 发送

print("mail has been send successfully.")

except smtplib.SMTPException as e:

print(e)

注意: 如果出现此以下报错信息,看下邮件主题是否为test,网易不允许这个也是奇葩

smtplib.SMTPDataError: (554, b'DT:SPM 163 smtp10,DsCowAA3h9_QbgZXI9_fCQ--.713S2 1460039376,please see http://mail.163.com/help/help_

python查询12306余票_12306火车票余票查询Python实现邮件发送相关推荐

  1. Python爬虫入门(一)火车票余票实时提醒

    Python爬虫入门(一)火车票余票实时提醒 火车票余票实时提醒 最近开始学习爬虫了,参考的教材是<Python网络爬虫从入门到精通>吕云翔,张扬,韩延刚等,机械工业出版社.本篇博客是实战 ...

  2. php写抢票脚本,火车票抢票python代码公开揭秘!

    市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单.下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事. 该代码仅供参考,主要用于大家沟通 ...

  3. 12306一直提示网络有问题_教你怎么在12306官网订购火车票 火车票查询12306订购...

    春运来了,快过年了, 又到一年中最一票难求的时候了,在外辛辛苦苦打拼了一年,为了让大家尽早的和亲朋好友家人团聚,本人今年很英勇的出来帮大家代抢火车票啦! 特地为大家建立了一个捡漏票微信群, 加微信qq ...

  4. (附源码)spring boot火车票订票系统 毕业设计171538

    火车票订票系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题 ...

  5. spring boot火车票订票系统 毕业设计-附源码171538

    火车票订票系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题 ...

  6. Python爬虫----12306火车票余票查询器

    12306火车票余票查询器 文章同步更新:http://www.riba2534.cn/?p=305 今天写了一个12306火车票余票查询器的爬虫,在这里记录一下过程. 首先先看一下最终效果: 比如想 ...

  7. python爬虫实现火车票余票查询

    python爬虫实现火车票余票查询 获取终端输入的命令行参数 重构请求url,解析返回的json数据 获取终端输入的命令行参数 例如:python3 tickets.py -dg 成都 南京 2016 ...

  8. 项目实战一 12306火车票余票查询软件

    1.安装docopt.urllib.requests 2.实现程序基础框架 # -*- coding:utf-8 -*-""" Train tickets query p ...

  9. Python之12306余票查询

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

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

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

最新文章

  1. mysql客户端指令_mysql command line client(mysql命令行客户端)
  2. Ogre 2011-11-30
  3. 一份来自28岁.NET老程序员的自白
  4. 工作30:加入git版本库
  5. java小球碰撞实验报告_20155317 《Java程序设计》实验五网络编程与安全实验报告...
  6. 【Elasticsearch】用ElasticSearch实现基于标签的兴趣推荐
  7. 随想录(cmake编译)
  8. 【cocos】无法启动程序“..\proj.win32\Debug.win32\libcocos2d.dll
  9. deepsort报错 No module named ‘sklearn.utils.linear_assignment_‘ 问题解决
  10. The King’s Problem 强连通
  11. 【图像评价】基于matlab无参考图像质量评价NIQE【含Matlab源码 681期】
  12. 那些令人喷饭的代码注释:仅以此代码献给...it's realy ?
  13. 警报:愚人节中国黑客可能发动史上最强病毒攻击
  14. 印刷机软件测试,印刷测控条与测试版
  15. 优化算法3--蚁群算法(原理)
  16. arduino智能闹钟_要写一个Arduino的电子闹钟程序,板子是Arduino UNO,和一个实时钟的芯片DS1307,开发环境是Arduino-1.0.2...
  17. 鸡脚蹬子生长秘籍 鸡脚蹬子短是缺乏什么营养
  18. Java生成png文件字体不清晰_将Graphics2D写入BufferedImage - 字体分辨率较差
  19. js刷新当前页的方法
  20. linux 网络函数调用链,Linux通知链机制及实例

热门文章

  1. 树莓派Pico开发板扩展ESP01S无线WiFi模块通信实践
  2. 分数计算机在线应用,在线连分数计算器
  3. c语言中要求五个数一行,c 语言中如何一行输出五个数
  4. SpringBoot+Vue 微信支付API V3
  5. Qt 绘制南丁格尔玫瑰图
  6. idea关闭html校验,怎么样关闭IntelliJ IDEA的javascript提示
  7. 数字翻译成英语JavaScript
  8. 【三环集团logo】用Python 小海龟实现~
  9. Git Branching基础操作学习笔记
  10. 高并发数据缓存池(基于EHcache)