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

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

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

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

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

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

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

在相应查询页面中按F12,弹出开发者模式,点击按钮,再点击对应车票的框,,复制相应的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("")

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

(0)

相关推荐

  • 实例分析python3实现并发访问水平切分表

    场景说明 假设有一个mysql表被水平切分,分散到多个host中,每个host拥有n个切分表. 如果需要并发去访问这些表,快速得到查询结果, 应该怎么做呢? 这里提供一种方案,利用python3的asyncio异步io库及aiomysql异步库去实现这个需求. 代码演示 import logging import random import asynciofrom aiomysql import create_pool # 假设mysql表分散在8个host, 每个host有16张子表 TBLE

  • python批量读取文件名并写入txt文件中

    本文实例为大家分享了python批量读取文件名并写入txt中的具体代码,供大家参考,具体内容如下 先说下脚本使用的环境吧,在做项目的过程中需要动态加载图片,使用Unity的Resources.Load方法,但是百十张图片怎么能一 一写下他们的名字作为加载的路径呢?总不能一个一个编辑后存到数组中吧,(虽然我最初是这么做的).所以必须有一个批量的工具,必须的. 于是乎激发了我的灵感,下面看代码.备注少,不动的给我留言,我会及时回复的. #coding=utf-8 import sys import

  • python3+selenium实现126邮箱登陆并发送邮件功能

    本文实例为大家分享了python3实现126邮箱登陆并发送邮件的具体代码,供大家参考,具体内容如下 基于selenium,使用chrome浏览器,完成126邮箱登陆并发送发邮件功能,暂时未封装. from selenium import webdriver # 导入显示等待类 from selenium.webdriver.support.ui import WebDriverWait # 导入期望场景类 from selenium.webdriver.support import expect

  • Python3实现并发检验代理池地址的方法

    本文实例讲述了Python3实现并发检验代理池地址的方法.分享给大家供大家参考,具体如下: #encoding=utf-8 #author: walker #date: 2016-04-14 #summary: 用协程/线程池并发检验代理有效性 import os, sys, time import requests from concurrent import futures cur_dir_fullpath = os.path.dirname(os.path.abspath(__file__

  • python3+selenium实现qq邮箱登陆并发送邮件功能

    本文实例为大家分享了python3实现qq邮箱登陆并发送邮件功能的具体代码,供大家参考,具体内容如下 基于selenium,使用chrome浏览器,完成qq邮箱登陆并发送发邮件功能,暂时未封装.qq邮箱和126邮箱登陆还是有一些区别的. #encoding=utf-8 from selenium import webdriver import time #启动chrome浏览器 driver = webdriver.Chrome() #进入qq邮箱登陆首页 driver.get("https:/

  • Python3并发写文件与Python对比

    这篇文章主要介绍了Python3并发写文件原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用python2在进行并发写的时候,发现文件会乱掉,就是某一行中间会插入其他行的内容. 但是在使用python3进行并发写的时候,无论是多进程,还是多线程,都没有出现这个问题,难道是python3的特性吗? import time import os import multiprocessing from multiprocessing.dumm

  • python配置文件写入过程详解

    python配置文件有.conf,.ini,.txt等多种 python集成的 标准库的 ConfigParser 模块提供一套 API 来读取和操作配置文件 我的配置文件如下 [MOTOR] comnum = 3 baud = 19200 m1slowstep = 10 m1faststep = 100 m1origin = 5 m2slowstep = 10 m2faststep = 50 m2origin = 5 [CoarseAdjust] standardx = 0.000000 st

  • python config文件的读写操作示例

    本文实例讲述了python config文件的读写操作.分享给大家供大家参考,具体如下: 1.设置配置文件 [mysql] host = 1234 port = 3306 user = root password = Zhsy08241128 database = leartd 2.读取配置文件 import configparser import os conf= configparser.ConfigParser() def readConf(): '''读取配置文件''' root_pat

  • python写入数据到csv或xlsx文件的3种方法

    本文实例为大家分享了三种方式使用python写数据到csv或xlsx文件,供大家参考,具体内容如下 第一种:使用csv模块,写入到csv格式文件 # -*- coding: utf-8 -*- import csv with open("my.csv", "a", newline='') as f: writer = csv.writer(f) writer.writerow(["URL", "predict", "

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

    由于车票难抢,有时需要的车票已经售空,而我们需要捡漏,便可使用这个脚本. 具体实现了,自动查询某一车票的余票数量,当数量产生变化时,将自动发送QQ邮件到对于的邮箱进行提醒. 其中,发送邮箱的部分详情可参考我上一篇博文:Python 发送邮件 (smtp) QQ邮箱 脚本使用了python + selenium + chrome webdriver,需要先配置好三者的环境. 具体使用时候,需自行改变代码中的 邮箱信息.出发站.到达站.车次.日期.以及到相应查询页面中找到对应车票的html id:

  • 教你用python实现12306余票查询

    python实现12306余票查询 我们说先在浏览器中打开开发者工具(F12),尝试一次余票的查询,通过开发者工具查看发出请求的包 余票查询界面 可以看到红框框中的URL就是我们向12306服务器发出的请求,那么具体是什么呢?我们来看看 [ https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-01-21&leftTicketDTO.from_station=CDW&leftTicketDTO.t

  • python自动登录12306并自动点击验证码完成登录的实现源代码

    以下代码可自动登录12306 - 包括输入用户名密码以及自动识别验证码并点击验证码登陆.该源码需要稍作修改: 把  username.send_keys('xxxxxxx')  中的  xxxxxx 改为 你自己的12306账号. 把  password.send_keys('yyyyyy')     中的 yyyyy 改为自己的 12306 密码. 即可运行. 该源码把自动抢票的核心功能:识别验证码并点击验证码登陆实现了. 把代码稍作加工,即可变为自己的自动抢票代码. 运行环境 - 需要安装p

  • 如何使用Python自动生成报表并以邮件发送

    数据分析师肯定每天都被各种各样的数据数据报表搞得焦头烂额,老板的,运营的.产品的等等.而且大部分报表都是重复性的工作,这篇文章就是帮助大家如何用Python来实现报表的自动发送,解放你的劳动力,可以让你有时间去做更有意思的事情. 首先来介绍下实现自动报表要使用到的Python库: pymysql 一个可以连接MySQL实例并且实现增删改查功能的库 datetime Python标准库中自带的关于时间的库 openpyxl 一个可以读写07版以后的Excel文档(.xlsx格式也支持)的库 smt

  • python+Splinter实现12306抢票功能

    本文实例为大家分享了python实现12306抢票功能的具体代码,供大家参考,具体内容如下 源码记录如下: #!/usr/bin/env python # _*_ coding:utf-8 _*_ #!/usr/bin/env python # _*_ coding:utf-8 _*_ from splinter.browser import Browser from time import sleep import os # from selenium.webdriver.chrome.opt

  • php实现12306余票查询、价格查询示例

    复制代码 代码如下: <?php/** * 车票接口类 *  * @author chepiao100 * */class chepiao100{  /**  * 接口地址  * @var string  */ private $_apiurl = 'http://www.chepiao100.com/api/'; /**   * 返回接口数据   *    * @param string $method 接口方法   * @param array $param 请求参数   * @return

  • java抓取12306信息实现火车余票查询示例

    最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样就可以得到火车票的信息.这里就随笔记一下获取12306余票的过程. 首先,我用firefox浏览器上12306查询余票.打开firefox的Web控制台,选上网络中的"记录请求和响应主体" 然后输入地址日期信息之后点击网页上的查询按钮,就能在Web控制台下看到网页请求的地址了: 就是图片中

  • Python爬虫 12306抢票开源代码过程详解

    今天就和大家一起来讨论一下python实现12306余票查询(pycharm+python3.7),一起来感受一下python爬虫的简单实践 我们说先在浏览器中打开开发者工具(F12),尝试一次余票的查询,通过开发者工具查看发出请求的包 可以看到红框框中的URL就是我们向12306服务器发出的请求,那么具体是什么呢?我们来看看 https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-01-21&leftT

  • Python爬虫实战之12306抢票开源

    今天就和大家一起来讨论一下python实现12306余票查询(pycharm+python3.7),一起来感受一下python爬虫的简单实践 我们说先在浏览器中打开开发者工具(F12),尝试一次余票的查询,通过开发者工具查看发出请求的包 余票查询界面 可以看到红框框中的URL就是我们向12306服务器发出的请求,那么具体是什么呢?我们来看看 https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-01-2

  • python爬虫实现最新12306抢票

    1.环境 python 3.7谷歌浏览器chromedriver.exe(浏览器驱动程序,要与浏览器版本对应,并将其添加到环境变量或放到当前py文件所在目录下) 2.相关模块 time (用于某些地方对程序的强制等待)datatime (用于获取当前时间)selenium 3.1 自动化测试模块,这里用于操作浏览器) 3.思路 首先进行登录(支持手机扫码),登录完成进入页面之后,我们会看到有“温馨提示”的弹窗,即当前界面,我们需要处理第一次弹窗, 然后进入到菜单栏车票下的单程中(鼠标移动触发事件

随机推荐