周董演唱会为什么总是抢不到票?教你用Python做一个自动抢票脚本
相信想去周董演唱会的大家都用过大麦网抢票吧?
可是
抢不到啊
但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票
那么,今天带大家用Python来制作一个自动抢票的脚本小程序!
知识点:
- 面向对象编程
- selenium 操作浏览器
- pickle 保存和读取Cookie实现免登陆
- time 做延时操作
- os 创建文件,判断文件是否存在
开发环境:
- 版 本:anaconda5.2.0(python3.6.5)
- 编辑器:pycharm
先导入本次所需的模块
import os
import time
import pickle
from time import sleep
from selenium import webdriver
第一步,实现免登录
确定目标,设置全局变量
# 大麦网主页
damai_url = "https://www.damai.cn/"
# 登录页
login_url = "https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F"
# 抢票目标页
target_url = 'https://detail.damai.cn/item.htm?spm=a2oeg.search_category.0.0.77f24d15RWgT4o&id=654534889506&clicktitle=%E5%A4%A7%E4%BC%97%E7
初始化加载
class Concert:def __init__(self):self.status = 0 # 状态,表示如今进行到何种程度self.login_method = 1 # {0:模拟登录,1:Cookie登录}自行选择登录方式self.driver = webdriver.Chrome(executable_path='chromedriver.exe') # 默认Chrome浏览器
登录调用设置cookie
def set_cookie(self):self.driver.get(damai_url)print("###请点击登录###")while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:sleep(1)print('###请扫码登录###')while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':sleep(1)print("###扫码成功###")pickle.dump(self.driver.get_cookies(), open("cookies.pkl", "wb"))print("###Cookie保存成功###")self.driver.get(target_url)
获取cookie
def get_cookie(self):try:cookies = pickle.load(open("cookies.pkl", "rb")) # 载入cookiefor cookie in cookies:cookie_dict = {'domain':'.damai.cn', # 必须有,不然就是假登录'name': cookie.get('name'),'value': cookie.get('value')}self.driver.add_cookie(cookie_dict)print('###载入Cookie###')except Exception as e:print(e)
登录
def login(self):if self.login_method==0:self.driver.get(login_url) # 载入登录界面print('###开始登录###')elif self.login_method==1:if not os.path.exists('cookies.pkl'): # 如果不存在cookie.pkl,就获取一下self.set_cookie()else:self.driver.get(target_url)self.get_cookie()
打开浏览器
def enter_concert(self):"""打开浏览器"""print('###打开浏览器,进入大麦网###')# self.driver.maximize_window() # 最大化窗口# 调用登陆self.login() # 先登录再说self.driver.refresh() # 刷新页面self.status = 2 # 登录成功标识print("###登录成功###")# 后续德云社可以讲if self.isElementExist('/html/body/div[2]/div[2]/div/div/div[3]/div[2]'):self.driver.find_element_by_xpath('/html/body/div[2]/div[2]/div/div/div[3]/div[2]').click()
第二步,抢票并下单
判断元素是否存在
def isElementExist(self, element):flag = Truebrowser = self.drivertry:browser.find_element_by_xpath(element)return flagexcept:flag = Falsereturn flag
选票操作
def choose_ticket(self):if self.status == 2: #登录成功入口print("="*30)print("###开始进行日期及票价选择###")while self.driver.title.find('确认订单') == -1: # 如果跳转到了订单结算界面就算这步成功了,否则继续执行此步try:buybutton = self.driver.find_element_by_class_name('buybtn').textif buybutton == "提交缺货登记":# 改变现有状态self.status=2self.driver.get(target_url)print('###抢票未开始,刷新等待开始###')continueelif buybutton == "立即预定":self.driver.find_element_by_class_name('buybtn').click()# 改变现有状态self.status = 3elif buybutton == "立即购买":self.driver.find_element_by_class_name('buybtn').click()# 改变现有状态self.status = 4# 选座购买暂时无法完成自动化elif buybutton == "选座购买":self.driver.find_element_by_class_name('buybtn').click()self.status = 5except:print('###未跳转到订单结算界面###')title = self.driver.titleif title == '选座购买':# 实现选座位购买的逻辑self.choice_seats()elif title == '确认订单':while True:# 如果标题为确认订单print('waiting ......')if self.isElementExist('//*[@id="container"]/div/div[9]/button'):self.check_order()break
选择座位
def choice_seats(self):while self.driver.title == '选座购买':while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):# 座位手动选择 选中座位之后//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img 就会消失print('请快速的选择您的座位!!!')# 消失之后就会出现 //*[@id="app"]/div[2]/div[2]/div[2]/divwhile self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):# 找到之后进行点击确认选座self.driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[2]/button').click()
下单操作
def check_order(self):if self.status in [3,4,5]:print('###开始确认订单###')try:# 默认选第一个购票人信息self.driver.find_element_by_xpath('//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()except Exception as e:print("###购票人信息选中失败,自行查看元素位置###")print(e)# 最后一步提交订单time.sleep(0.5) # 太快会影响加载,导致按钮点击无效self.driver.find_element_by_xpath('//div[@class = "w1200"]//div[2]//div//div[9]//button[1]').click()
抢票完成,退出
def finish(self):self.driver.quit()
测试代码是否成功
if __name__ == '__main__':try:con = Concert() # 具体如果填写请查看类中的初始化函数con.enter_concert() # 打开浏览器con.choose_ticket() # 开始抢票except Exception as e:print(e)con.finish()
最后看下效果如何
对于本篇文章有疑问的同学也可以点这里
周董演唱会为什么总是抢不到票?教你用Python做一个自动抢票脚本相关推荐
- 周杰伦演唱会总是抢不到票?教你用Python做一个自动抢票脚本!
相信想去周董演唱会的大家都用过大麦网抢票吧? 可是 抢不到啊 该说不说 我抢到了 那么,今天带大家用Python来制作一个自动抢票的脚本小程序! 知识点: 面向对象编程 selenium 操作浏览器 ...
- 周杰伦演唱会总是抢不到票?教你用Python做一个自动抢票脚本
相信想去周董演唱会的大家都用过大麦网抢票吧? 可是 抢不到啊 该说不说 我抢到了 那么,今天带大家用Python来制作一个自动抢票的脚本小程序! 知识点: 面向对象编程 selenium 操作浏览器 ...
- 想去看演唱却总是抢不到票?教你用Python制作一个自动抢票脚本
前言 嗨喽!大家好,这里是魔王!! 大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域. 但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票 ...
- 【python实战】拒绝黄牛!我要用python原价冲周董演唱会~Python自动秒杀抢票脚本
前言 大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域. 但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票 那么,今天带大家用Python ...
- 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)
前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...
- 如何写一个自动抢微信红包的程序
春节临近,为避免错失土豪们的红包,动手写了一个自动抢微信红包的小程序,试了一下效果还不错.本程序适用于安卓4.1版本以上手机,不需要ROOT权限.现将程序的设计要点记录如下,供有兴趣的同行参考. 一. ...
- python抢券代码_抢券抢不到生气了,准备写一个自动抢券的东东,时间成本最低的 web 方案是什么?...
京东 199-150 的牛奶券,昨天晚上 400 多人兑换,今天 720 人,也不知道什么时候放的券,说好 10 点放,结果点了 5 分钟也没有影,生气了,准备写一个自动抢券机,需求就是填入从 Chr ...
- python 抢券_抢券抢不到生气了,准备写一个自动抢券的东东,时间成本最低的 web 方案是什么?...
京东 199-150 的牛奶券,昨天晚上 400 多人兑换,今天 720 人,也不知道什么时候放的券,说好 10 点放,结果点了 5 分钟也没有影,生气了,准备写一个自动抢券机,需求就是填入从 Chr ...
- python必背100源代码-100行Python代码实现自动抢火车票(附源码)
前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...
- 12306订票候补是个坑_12306实现自动抢票了,候补购票功能在哪里,怎么用?
2019年春运火车票已于2018年12月23日正式开售,你在为一年一度的抢票大战感到慌张吗?以往每到春运期间,网络上总会出现很多抢票软件,这些抢票工具有真有假难以辨认.今年12306官方推出了&quo ...
最新文章
- Android-TCPDump for Android(抓TCP数据包工具)
- 从Powershell 入侵脚本学到的如何执行后台runspace~
- 交换机接口的access与trunk
- Redis集群~StackExchange.redis连接Twemproxy代理服务器
- oracle segment undo_71_UNDO扩展学习
- 为什么长视频没有强算法推荐的产品
- 【项目管理】项目管理的三项约束
- thinkphp调用mysql存储过程_ThinkPHP执行调用存储过程怎么添加日志
- vagrant 网络三种模式
- HAWQ取代传统数仓实践(一)——为什么选择HAWQ
- 07到09程序员对自己工资的态度···
- PreferenceScreen移除菜单项
- EasyBoot常用的命令
- 托管服务器ip绑定域名_如何在一台服务器上托管多个域名和项目
- 多年来被互联网深深洗脑
- 计算机基础与知识点总结,计算机基础知识点总结
- Python温度转换程序
- 三维重建方法--激光or视觉
- 利用油猴脚本显示扇贝网真实打卡日记
- 6个有效激励合作伙伴和促进推荐的小技巧
热门文章
- WCDMA物理层--信道整体结构流程
- 洛谷p5369[PKUSC2018]最大前缀和
- 【Matlab综合设计】开环Buck-Boost升压-降压式变换器Simulink仿真(含仿真模块选择和参数计算过程)
- 奇异矩阵及广义逆矩阵
- 北京智能机器人为游客指路;日本研发出可识别背影的人工智能
- android系统解锁,android 调用系统解锁方法
- 利用第三方软件识别图片文字并转换为文本
- python如何筛选数据_Python如何用filter函数筛选数据
- t’触发器真值表和状态方程_T触发器的特性方程是
- 图像检索:颜色聚合向量(CCV)及matlab实现