基于 Python 与 Selenium 的大麦网自动抢票脚本实现
使用 Python 语言结合 Selenium 自动化框架制作大麦网抢票脚本的方法。内容涵盖环境搭建、Cookie 免登录实现、浏览器元素定位、自动点击下单等核心步骤。通过面向对象编程封装 Concert 类,实现了登录状态管理、页面轮询及订单确认逻辑。文章提供了完整的代码示例,并补充了关于 XPath 稳定性、反爬虫规避及浏览器指纹优化的建议,旨在帮助开发者理解 Web 自动化原理并进行合法合规的技术实践。

使用 Python 语言结合 Selenium 自动化框架制作大麦网抢票脚本的方法。内容涵盖环境搭建、Cookie 免登录实现、浏览器元素定位、自动点击下单等核心步骤。通过面向对象编程封装 Concert 类,实现了登录状态管理、页面轮询及订单确认逻辑。文章提供了完整的代码示例,并补充了关于 XPath 稳定性、反爬虫规避及浏览器指纹优化的建议,旨在帮助开发者理解 Web 自动化原理并进行合法合规的技术实践。

大麦网是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、话剧、音乐剧、体育赛事等领域。由于票数有限且存在黄牛竞争,普通用户往往难以抢到心仪的门票。
本文将介绍如何使用 Python 编写一个自动化脚本来辅助抢票。该方案主要利用 Selenium 模拟浏览器操作,结合 Cookie 免登录技术,实现定时刷新和自动下单的功能。
免责声明:本教程仅供技术交流与学习使用。请勿用于非法用途或干扰正常商业秩序,否则可能违反相关法律法规及平台服务条款。
seleniumpickle (内置)time (内置)os (内置)安装依赖命令:
pip install selenium
同时需要下载对应版本的 ChromeDriver,并确保其路径在环境变量中或在代码中指定。
import os
import time
import pickle
from time import sleep
from selenium import webdriver
设置全局变量,包括主页、登录页和目标商品页 URL。定义 Concert 类来封装抢票逻辑。
# 大麦网主页
damai_url = "https://www.damai.cn/"
# 登录页
login_url = "https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F"
# 抢票目标页 (示例 ID,实际使用时请替换为具体商品链接)
target_url = 'https://detail.damai.cn/item.htm?id=654534889506'
class Concert:
def __init__(self):
self.status = 0 # 状态标识:0-未开始,1-登录中,2-已登录,3-选座中,4-确认订单
self.login_method = 1 # 0:模拟输入登录,1:Cookie 登录
# 初始化 Chrome 浏览器驱动
self.driver = webdriver.Chrome(executable_path='chromedriver.exe')
通过浏览器扫码登录后,将当前 Cookie 保存到本地 cookies.pkl 文件中,以便后续直接加载。
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("###扫码成功###")
# 保存 Cookie
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(f"Cookie 读取失败:{e}")
根据配置选择登录方式,若 Cookie 不存在则触发扫码流程。
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.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 =
:
()
title = .driver.title
title == :
.choice_seats()
title == :
:
()
.isElementExist():
.check_order()
针对需要手动选座的场次,提供简单的自动化辅助逻辑。
def choice_seats(self):
while self.driver.title == '选座购买':
# 等待座位图加载
while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):
print('请快速的选择您的座位!!!')
# 消失后点击确认
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(f"发生错误:{e}")
con.finish()
options.add_argument('--disable-blink-features=AutomationControlled') 等方式降低被检测风险。本文详细介绍了使用 Python 和 Selenium 制作大麦网抢票脚本的基本流程。通过模块化设计,实现了免登录、自动刷新、自动下单等功能。希望读者能在此基础上进一步优化,提升成功率。再次提醒,技术应服务于正当需求,请遵守相关法律法规。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online