python自动查询12306余票并发送邮箱提醒脚本


Posted in Python onMay 21, 2018

由于车票难抢,有时需要的车票已经售空,而我们需要捡漏,便可使用这个脚本。

具体实现了,自动查询某一车票的余票数量,当数量产生变化时,将自动发送QQ邮件到对于的邮箱进行提醒。

其中,发送邮箱的部分详情可参考我上一篇博文:Python 发送邮件 (smtp) QQ邮箱

脚本使用了python + selenium + chrome webdriver,需要先配置好三者的环境

具体使用时候,需自行改变代码中的

邮箱信息、出发站、到达站、车次、日期、以及到相应查询页面中找到对应车票的html id:

在相应查询页面中按F12,弹出开发者模式,点击python自动查询12306余票并发送邮箱提醒脚本按钮,再点击对应车票的框,python自动查询12306余票并发送邮箱提醒脚本python自动查询12306余票并发送邮箱提醒脚本,复制相应的id号到代码中对应处。

代码如下:

#coding:utf8 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
 
import time 
from smtplib import SMTP_SSL 
from email.header import Header 
from email.mime.text import MIMEText 
 
from_station = 'SH' 
to_station = 'NJ' 
train_num = 'G14' 
train_date = '2018-02-14' 
 
ZYid = 'ZY_5l00000G1441' #通过浏览器找到要查询车票的三个id 
ZEid = 'ZE_5l00000G1441' 
WZid = 'WZ_5l00000G1441' 
 
def send_email(train_date, train_num, one_num, two_num, wz_num): #函数中邮箱信息改为自己的 
 email_from = "123456@qq.com" 
 email_to = "654321@qq.com" 
 hostname = "smtp.qq.com" 
 login = "123456@qq.com" 
 password = "xddflwjfkkfkbidf" 
 subject = "train_tickets" 
 text = ("日期:%s 车次:%s 一等座:%s 二等座:%s 无座:%s "%(train_date, train_num, one_num, two_num, wz_num)) 
   
 smtp = SMTP_SSL(hostname) 
 smtp.login(login, password) 
 
 msg = MIMEText(text, "plain", "utf-8") 
 msg["Subject"] = Header(subject, "utf-8") 
 msg["from"] = email_from 
 msg["to"] = email_to 
 
 smtp.sendmail(email_from, email_to, msg.as_string()) 
 smtp.quit() 
 
driver = webdriver.Chrome() 
driver.get('https://kyfw.12306.cn/otn/index/init') 
 
elem = driver.find_element_by_id("fromStationText") 
elem.clear() 
elem.send_keys(from_station) 
elem.send_keys(Keys.ENTER) #写入始发站 
 
elem = driver.find_element_by_id("toStationText") 
elem.clear() 
elem.send_keys(to_station) 
elem.send_keys(Keys.ENTER) #写入终点站 
 
js = "document.getElementById('train_date').removeAttribute('readonly')" #去除日期栏只读属性 
driver.execute_script(js) 
 
elem=driver.find_element_by_id("train_date") 
elem.clear() 
elem.send_keys(train_date) #写入乘车日期 
elem.click() 
 
elem=driver.find_element_by_id("dc") #选择单程 
elem.click() 
 
elem=driver.find_element_by_id("a_search_ticket") #开始查询 
try: 
 elem.click()  
except Exception: 
 time.sleep(2) 
 
query_times = 0 
onetickets_last = 0 
twotickets_last = 0 
wztickets_last = 0 
 
time.sleep(2)  
while(1): 
 query_times = query_times+1 
 text="" 
 try: 
  driver.find_element_by_id("query_ticket").click() #根据查询键是否可以找到,以判断页面显示正确与否 
 except Exception: 
  driver.refresh() 
  time.sleep(5); 
  print("bug"); 
  continue 
 
 print("第%d次查询:"%(query_times)) 
 time.sleep(5) 
 
 try: 
  text = driver.find_element_by_id(ZYid).text 
 except Exception: 
  driver.refresh() 
  time.sleep(5); 
  print("bug") 
  continue 
 if not(driver.find_element_by_id(ZYid).text): 
  driver.find_element_by_id("query_ticket").click() 
  
 text = driver.find_element_by_id(ZYid).text #查询一等座余票 
 if(text == "有" or text == "无"): 
  onetickets_now = text 
  print("%s 一等座 : %s"%(train_num, onetickets_now)) 
  if(onetickets_now != onetickets_last): 
   onetickets_last = onetickets_now 
   #send_email(train_date, train_num, onetickets_last, twotickets_last, wztickets_last) 
 else: 
  onetickets_now = text 
  print("%s 一等座剩余票数 : %s"%(train_num, onetickets_now)) 
  if(onetickets_now != onetickets_last): 
   onetickets_last = onetickets_now 
   #send_email(train_date, train_num, onetickets_last, twotickets_last, wztickets_last) 
 
 text = driver.find_element_by_id(ZEid).text #查询二等座余票 
 if(text == "有" or text == "无"): 
  twotickets_now = text 
  print("%s 二等座 : %s"%(train_num, twotickets_now)) 
  if(twotickets_now != twotickets_last): 
   twotickets_last = twotickets_now 
   send_email(train_date, train_num, onetickets_last, twotickets_last, wztickets_last) 
 else: 
  twotickets_now = text 
  print("%s 二等座剩余票数 : %s"%(train_num,twotickets_now)) 
  if(twotickets_now != twoticketstwotickets_old): 
   twotickets_last = twotickets_now 
   send_email(train_date, train_num, onetickets_last, twotickets_last, wztickets_last) 
 
 text = driver.find_element_by_id(WZid).text #查询无座余票 
 if(text == "有" or text == "无"): 
  wztickets_now = text 
  print("%s 无座 : %s"%(train_num, wztickets_now)) 
  if(wztickets_now != wztickets_last): 
   wztickets_last = wztickets_now 
   send_email(train_date, train_num, onetickets_last, twotickets_last, wztickets_last) 
 else: 
  wztickets_now = text 
  print("%s 无座剩余票数 : %s"%(train_num, wztickets_now)) 
  if(wztickets_now != wztickets_last): 
   wztickets_last = wztickets_now 
   send_email(train_date, train_num, onetickets_last, twotickets_last, wztickets_last) 
 print("")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
Python编程之字符串模板(Template)用法实例分析
Jul 22 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
Jul 24 Python
pandas数据分组和聚合操作方法
Apr 11 Python
Django 多语言教程的实现(i18n)
Jul 07 Python
python实现简单名片管理系统
Nov 30 Python
python修改txt文件中的某一项方法
Dec 29 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
python的Jenkins接口调用方式
May 12 Python
深入浅析Python代码规范性检测
Jul 31 Python
python实现文件分片上传的接口自动化
Nov 19 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 #Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 #Python
Python读取本地文件并解析网页元素的方法
May 21 #Python
详解Python中的四种队列
May 21 #Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 #Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 #Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 #Python
You might like
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
python赋值操作方法分享
2013/03/23 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
python实现简单http服务器功能
2018/09/17 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
地球一小时倡议书
2014/04/15 职场文书
工商企业管理应届生求职信
2014/05/04 职场文书
体育口号大全
2014/06/18 职场文书
主题党日活动总结
2014/07/08 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
2014年终工作总结范本
2014/12/15 职场文书
给病人的慰问信
2015/03/23 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
详解Python常用的魔法方法
2021/06/03 Python