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 相关文章推荐
使用python解析xml成对应的html示例分享
Apr 02 Python
Python中的jquery PyQuery库使用小结
May 13 Python
使用Python的Treq on Twisted来进行HTTP压力测试
Apr 16 Python
matplotlib设置legend图例代码示例
Dec 19 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
对python列表里的字典元素去重方法详解
Jan 21 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
Pandas中resample方法详解
Jul 02 Python
Python 导入文件过程图解
Oct 15 Python
Django1.11自带分页器paginator的使用方法
Oct 31 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
python实现商品进销存管理系统
May 30 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
php设计模式 Facade(外观模式)
2011/06/26 PHP
9个PHP开发常用功能函数小结
2011/07/15 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
2011/11/21 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
浅谈Node.js:Buffer模块
2016/12/05 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
JS中数据结构之栈
2019/01/01 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
python3下pygame如何实现显示中文
2020/01/11 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
python 录制系统声音的示例
2020/12/21 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
银行实习生自我鉴定范文
2013/09/19 职场文书
法律专业个人实习自我鉴定
2013/09/23 职场文书
《寓言两则》教学反思
2014/02/27 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
英雄儿女观后感
2015/06/09 职场文书
virtualenv隔离Python环境的问题解析
2022/06/21 Python