赞
踩
大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。
但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票
那么,今天带大家用Python来制作一个自动抢票的脚本小程序
- 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
- ~~~python
- 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
- ~~~python
- def get_cookie(self):
- try:
- cookies = pickle.load(open("cookies.pkl", "rb")) # 载入cookie
- for 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 = True
- browser = self.driver
- try:
- browser.find_element_by_xpath(element)
- return flag
-
- except:
- flag = False
- return 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').text
- if buybutton == "提交缺货登记":
- # 改变现有状态
- self.status=2
- self.driver.get(target_url)
- print('###抢票未开始,刷新等待开始###')
- continue
- elif buybutton == "立即预定":
- self.driver.find_element_by_class_name('buybtn').click()
- # 改变现有状态
- self.status = 3
- elif 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 = 5
- except:
- print('###未跳转到订单结算界面###')
- title = self.driver.title
- if 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]/div
- while 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()
因因链接常被和谐,可戳安全链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。