由于车票难抢,有时需要的车票已经售空,而我们需要捡漏,便可使用这个脚本。
具体实现了,自动查询某一车票的余票数量,当数量产生变化时,将自动发送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("")
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】