12306火车票余票查询&Python实现邮件发送
查询余票接口
打开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_
12306火车票余票查询&Python实现邮件发送的更多相关文章
- 火车车次查询-余票查询--Api接口
1.来自12306的火车车次数据 使用12306网站的接口,查询余票.此接口采集自 这里. 全国火车站代号字典,下载 . 火车票余票查询 http://dynamic.12306.cn/otsquer ...
- Python大法之从火车余票查询到打造抢Supreme神器
本文作者:i春秋作家——阿甫哥哥 系列文章专辑:https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid=9 ...
- 12306微信小程序上线 提供余票查询暂不支持购票
12306微信小程序正式上线,如图所示,目前小程序提供余票查询.时刻表查询和正晚点查询三大功能,用户可在这里随时查看剩余车票以及列车时刻表.而且小程序支持用户添加行程,方便出行. 目前这款小程序还不支 ...
- 用Python实现邮件发送Hive明细数据
代码地址如下:http://www.demodashi.com/demo/12673.html 一.需求描述 客户需要每周周一接收特定的活动数据,生成Excel或是CSV文件,并通过邮件发送给指定接收 ...
- Python 基于Python实现邮件发送
基于Python实现邮件发送 by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7 注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分 ...
- java抓取12306火车余票信息
最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样 ...
- python SMTP邮件发送(转载)
Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...
- python实现邮件发送完整代码(带附件发送方式)
实例一:利用SMTP与EMAIL实现邮件发送,带附件(完整代码) __author__ = 'Administrator'#coding=gb2312 from email.Header import ...
- python实现邮件发送
实例补充: #**************************利用STMP自动发送邮件******************************import smtplibsmtp = smtp ...
随机推荐
- C语言基础语法之指向函数的指针
指针是C语言的精髓,对于初学者来讲,指针是C语言语法学习中比较难的知识点,而这里面指向函数的指针更是不太容易理解. 下面给大家讲下怎样学习理解C语言中指向函数的指针及编程方法和使用例子. 注意:这是一 ...
- ie8中使用ajax总是进入error解决办法
试过很多种方法有的说是因为要把cache:false,但是本人遇到的情况可能不同最终结局的办法是 引用的是<script src="js/jquery-1.4.2.min.js&quo ...
- flask 第九篇 蓝图 Blueprint
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- webstorm设置babel,使用es6
原文链接:https://blog.csdn.net/peade/article/details/76522177 网上有很多关于如何设置babel的.我学习着设置,但总差那么几步,没能满足我的需求. ...
- linux下如何基于已有容器创建image并运行?
1. 通过docker ps命令先找到容器id,示例如下,123456789012就是我们要找的 jello@~$ docker ps CONTAINER ID IMAGE COMMAND CREAT ...
- DB2 SQL 错误(SQLCODE:-964,SQLSTATE:57011)处理方法
故障现象描述: 执行 SQL 语句时,出现类似如下错误消息. 指令 SQL:insert into t_stat_file_temp SQLSTATE:57011,供应商错误代码:-964 DB2 S ...
- ps在psd格式图片里面切图流程
第一. 第二. xx的地方自己重新命名 第三. 第四.
- backupAgent节点
在<application>节点中有一个非常重要的属性,那就是backupAgent. 1.backupAgent简介 Androidd:backupAgent用来设置备份代理.对于大部分 ...
- Java注解(Annotation)详解
转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...
- Java并发包concurrent——ConcurrentHashMap
转: Java并发包concurrent——ConcurrentHashMap 2018年07月19日 20:43:23 Bill_Xiang_ 阅读数 16390更多 所属专栏: Java Conc ...