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实现问号表达式(?)的方法
Nov 27 Python
Python读写unicode文件的方法
Jul 10 Python
解析Python中while true的使用
Oct 13 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
对python添加模块路径的三种方法总结
Oct 16 Python
django 使用全局搜索功能的实例详解
Jul 18 Python
Python文件路径名的操作方法
Oct 30 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 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
Linux下ZendOptimizer的安装与配置方法
2007/04/12 PHP
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
jquery对table做排序操作的实例演示
2017/08/10 jQuery
js实现省市级联效果分享
2017/08/10 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
vue实现表格过滤功能
2019/09/27 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
python写xml文件的操作实例
2014/10/05 Python
python numpy格式化打印的实例
2018/05/14 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
django实现将后台model对象转换成json对象并传递给前端jquery
2020/03/16 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
使用Python实现批量ping操作方法
2020/05/06 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
浅谈Python __init__.py的作用
2020/10/28 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
职业生涯规划怎么写
2013/12/29 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
打架检讨书范文
2015/01/27 职场文书
鸡毛信观后感
2015/06/11 职场文书
高三化学教学反思
2016/02/22 职场文书