当前位置:   article > 正文

Python脚本实现【大麦网】抢票程序,今年我一定要去听一场演唱会_抢票脚本

抢票脚本

 前言

大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。

但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票

那么,今天带大家用Python来制作一个自动抢票的脚本小程序

知识点:

  • 面向对象编程
  • selenium 操作浏览器
  • pickle 保存和读取Cookie实现免登陆
  • time 做延时操作
  • os 创建文件,判断文件是否存在

开发环境:

  • 版 本:anaconda5.2.0(python3.6.5)
  • 编辑器:pycharm

先导入本次所需的模块

  1. import os
  2. import time
  3. import pickle
  4. from time import sleep
  5. from selenium import webdriver

第一步,实现免登录

确定目标,设置全局变量

  1. # 大麦网主页
  2. damai_url = "https://www.damai.cn/"
  3. # 登录页
  4. login_url = "https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F"
  5. # 抢票目标页
  6. 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

初始化加载

  1. class Concert:
  2. def __init__(self):
  3. self.status = 0 # 状态,表示如今进行到何种程度
  4. self.login_method = 1 # {0:模拟登录,1:Cookie登录}自行选择登录方式
  5. self.driver = webdriver.Chrome(executable_path='chromedriver.exe') # 默认Chrome浏览器

登录调用设置cookie

  1. ~~~python
  2. def set_cookie(self):
  3. self.driver.get(damai_url)
  4. print("###请点击登录###")
  5. while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:
  6. sleep(1)
  7. print('###请扫码登录###')
  8. while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':
  9. sleep(1)
  10. print("###扫码成功###")
  11. pickle.dump(self.driver.get_cookies(), open("cookies.pkl", "wb"))
  12. print("###Cookie保存成功###")
  13. self.driver.get(target_url)
  14. ~~~

获取cookie

  1. ~~~python
  2. def get_cookie(self):
  3. try:
  4. cookies = pickle.load(open("cookies.pkl", "rb")) # 载入cookie
  5. for cookie in cookies:
  6. cookie_dict = {
  7. 'domain':'.damai.cn', # 必须有,不然就是假登录
  8. 'name': cookie.get('name'),
  9. 'value': cookie.get('value')
  10. }
  11. self.driver.add_cookie(cookie_dict)
  12. print('###载入Cookie###')
  13. except Exception as e:
  14. print(e)
  15. ~~~

登录

  1. def login(self):
  2. if self.login_method==0:
  3. self.driver.get(login_url)
  4. # 载入登录界面
  5. print('###开始登录###')
  6. elif self.login_method==1:
  7. if not os.path.exists('cookies.pkl'):
  8. # 如果不存在cookie.pkl,就获取一下
  9. self.set_cookie()
  10. else:
  11. self.driver.get(target_url)
  12. self.get_cookie()

打开浏览器

  1. def enter_concert(self):
  2. """打开浏览器"""
  3. print('###打开浏览器,进入大麦网###')
  4. # self.driver.maximize_window() # 最大化窗口
  5. # 调用登陆
  6. self.login() # 先登录再说
  7. self.driver.refresh() # 刷新页面
  8. self.status = 2 # 登录成功标识
  9. print("###登录成功###")
  10. # 后续德云社可以讲
  11. if self.isElementExist('/html/body/div[2]/div[2]/div/div/div[3]/div[2]'):
  12. self.driver.find_element_by_xpath('/html/body/div[2]/div[2]/div/div/div[3]/div[2]').click()

第二步,抢票并下单

判断元素是否存在

  1. def isElementExist(self, element):
  2. flag = True
  3. browser = self.driver
  4. try:
  5. browser.find_element_by_xpath(element)
  6. return flag
  7. except:
  8. flag = False
  9. return flag

选票操作

  1. def choose_ticket(self):
  2. if self.status == 2: #登录成功入口
  3. print("="*30)
  4. print("###开始进行日期及票价选择###")
  5. while self.driver.title.find('确认订单') == -1: # 如果跳转到了订单结算界面就算这步成功了,否则继续执行此步
  6. try:
  7. buybutton = self.driver.find_element_by_class_name('buybtn').text
  8. if buybutton == "提交缺货登记":
  9. # 改变现有状态
  10. self.status=2
  11. self.driver.get(target_url)
  12. print('###抢票未开始,刷新等待开始###')
  13. continue
  14. elif buybutton == "立即预定":
  15. self.driver.find_element_by_class_name('buybtn').click()
  16. # 改变现有状态
  17. self.status = 3
  18. elif buybutton == "立即购买":
  19. self.driver.find_element_by_class_name('buybtn').click()
  20. # 改变现有状态
  21. self.status = 4
  22. # 选座购买暂时无法完成自动化
  23. elif buybutton == "选座购买":
  24. self.driver.find_element_by_class_name('buybtn').click()
  25. self.status = 5
  26. except:
  27. print('###未跳转到订单结算界面###')
  28. title = self.driver.title
  29. if title == '选座购买':
  30. # 实现选座位购买的逻辑
  31. self.choice_seats()
  32. elif title == '确认订单':
  33. while True:
  34. # 如果标题为确认订单
  35. print('waiting ......')
  36. if self.isElementExist('//*[@id="container"]/div/div[9]/button'):
  37. self.check_order()
  38. break

选择座位

  1. def choice_seats(self):
  2. while self.driver.title == '选座购买':
  3. while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):
  4. # 座位手动选择 选中座位之后//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img 就会消失
  5. print('请快速的选择您的座位!!!')
  6. # 消失之后就会出现 //*[@id="app"]/div[2]/div[2]/div[2]/div
  7. while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):
  8. # 找到之后进行点击确认选座
  9. self.driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[2]/button').click()

下单操作

  1. def check_order(self):
  2. if self.status in [3,4,5]:
  3. print('###开始确认订单###')
  4. try:
  5. # 默认选第一个购票人信息
  6. self.driver.find_element_by_xpath('//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()
  7. except Exception as e:
  8. print("###购票人信息选中失败,自行查看元素位置###")
  9. print(e)
  10. # 最后一步提交订单
  11. time.sleep(0.5) # 太快会影响加载,导致按钮点击无效
  12. self.driver.find_element_by_xpath('//div[@class = "w1200"]//div[2]//div//div[9]//button[1]').click()

抢票完成,退出

  1. def finish(self):
  2. self.driver.quit()

测试代码是否成功

  1. if __name__ == '__main__':
  2. try:
  3. con = Concert() # 具体如果填写请查看类中的初始化函数
  4. con.enter_concert() # 打开浏览器
  5. con.choose_ticket() # 开始抢票
  6. except Exception as e:
  7. print(e)
  8. con.finish()

最后看下效果如何

  知道你对python感兴趣,所以给你准备了下面的资料~

因链接常被和谐,可戳安全链接:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/449583
推荐阅读
相关标签