新闻动态

为了顺利买到演唱会的票用Python制作了自动抢票的脚本

发布日期:2021-12-25 02:32 | 文章来源:gibhub

知识点:

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

开发环境:

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

【付费VIP完整版】只要看了就能学会的教程,80集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

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"))  # 载入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()

最后看下效果如何

到此这篇关于为了顺利买到演唱会的票用Python制作了自动抢票的脚本的文章就介绍到这了,更多相关Python 自动抢票内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部