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中的strftime()方法的使用
May 22 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
python实现雨滴下落到地面效果
Jun 21 Python
Python将多个list合并为1个list的方法
Jun 27 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
Python设计模式之状态模式原理与用法详解
Jan 15 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 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
PHP5 安装方法
2006/10/09 PHP
PHP新手上路(四)
2006/10/09 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
PHP实现验证码校验功能
2017/11/16 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
给我一面国旗 python帮你实现
2019/09/30 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
公司拓展活动方案
2014/02/13 职场文书
土木工程专业推荐信
2014/02/19 职场文书
消防安全责任书范本
2014/04/15 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
邀请函怎么写
2015/01/30 职场文书
车辆管理制度范本
2015/08/05 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS