适用系统: Windows / Mac / Linux
核心优势:国内网络适配、无需境外驱动、防风控、精准卡点、零基础可用
⚠️ 重要免责声明
本文所有代码仅用于 Python 自动化、Selenium 网页自动化技术学习研究,仅限个人测试学习。大麦网用户协议明确禁止脚本、爬虫等自动化工具操作平台;批量抢票、囤票加价倒卖演出票,涉嫌违反《治安管理处罚法》,情节严重可追究刑事责任。违规使用脚本导致账号封禁、IP 限制、法律责任全部由使用者自行承担。请理性购票,维护公平购票环境。
一、前言:为什么选择 Selenium 做抢票?
热门演唱会、音乐节开票瞬间秒空,手动刷新、手动点击根本拼不过自动化程序。目前市面上仅有两种抢票方案,优劣差距非常明显:
接口直刷(不推荐新手):直接请求后端库存接口,速度最快,但需要逆向加密签名、Cookie、订单参数,技术门槛极高,高频请求极易封号、触发风控。
Selenium 浏览器自动化(本文方案):操控真实 Chrome 浏览器,1:1 模拟真人点击、刷新、选座下单,可视化操作、逻辑简单、风控概率极低,是新手学习、个人捡漏首选方案。
相比于复杂的接口逆向,Selenium 可以让我们零逆向、零基础实现全自动抢票,全程看得见操作,报错可快速排查。
二、环境搭建(5分钟极速完成)
2.1 安装 Python 环境
安装Python 3.8 及以上正式版本,安装时务必勾选Add Python to PATH加入系统环境变量。
安装完成后,终端输入以下命令验证是否安装成功:
python--version2.2 安装核心依赖库
本脚本无需手动配置 ChromeDriver,依托webdriver-manager自动适配国内镜像驱动,完美解决境外驱动网站无法访问的国内网络问题。一键安装依赖:
pipinstallselenium webdriver-manager依赖说明:
selenium:浏览器自动化核心库,负责操控页面所有操作webdriver-manager:自动匹配、下载、适配 Chrome 驱动,彻底告别版本报错
2.3 浏览器要求
电脑需安装最新版谷歌 Chrome 浏览器,其他浏览器不兼容本脚本。
三、抢票核心流程拆解
脚本完整复刻人工购票全流程,全自动执行,仅扫码登录需要手动参与:
加载页面 + 自动登录检测:打开目标演出页面,未登录自动弹出扫码窗口,限时等待登录
精准定时卡点:倒计时等待开票,开票前1分钟高频刷新页面
自动选场次/日期/票档:自动匹配可购场次、目标票价档位
自动设置购票数量、勾选观演人:无需手动操作订单信息
循环重试提交订单:毫秒级监控下单按钮,抢到立即提交
核心优化:全程使用WebDriverWait显式等待,摒弃死板的固定延时,页面加载完成立即执行操作,兼顾速度与稳定性。
四、完整可运行抢票代码(国内适配版)
代码内置防风控参数、随机真人延时、超时保护、异常捕获,无需修改底层代码,仅修改顶部配置即可直接运行。
""" 大麦网自动抢票脚本 Python+Selenium 完整版 适配国内网络、无需访问境外ChromeDriver下载站 内置防风控、定时卡点、显式等待、自动驱动适配 仅供Python自动化技术学习,禁止囤票倒卖、商用 """importtimeimportrandomfromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServicefromwebdriver_manager.chromeimportChromeDriverManagerfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.common.exceptionsimportTimeoutException,NoSuchElementException# ==================== 【用户自定义配置区 - 务必修改】 ====================# 大麦移动端演出链接(APP分享链接获取,替换对应项目ID)TARGET_URL="https://m.damai.cn/damai/perform/item.html?projectId=替换为你的演出ID"# 目标开票时间 24小时制TARGET_HOUR=10TARGET_MINUTE=0# 目标票档文字(必须和网页完全一致,例:看台380元、内场680元)TARGET_PRICE="看台380元"# 购买票数(1张成功率最高,多张需提前添加对应实名观演人)BUY_COUNT=1# 无头模式:False=显示浏览器(调试) True=隐藏浏览器(后台挂机)HEADLESS=False# 登录最大等待时间(秒)LOGIN_WAIT_TIME=120# 订单最大重试提交次数MAX_SUBMIT_TRY=50# ======================================================================classDamaiTicketBot:def__init__(self):# Chrome防风控核心配置,规避自动化检测chrome_options=webdriver.ChromeOptions()# 关闭浏览器自动化标识chrome_options.add_experimental_option("excludeSwitches",["enable-automation"])chrome_options.add_experimental_option("useAutomationExtension",False)chrome_options.add_argument("--disable-blink-features=AutomationControlled")# 模拟真实浏览器运行环境chrome_options.add_argument("--no-sandbox")chrome_options.add_argument("--disable-dev-shm-usage")# 随机UA,进一步防风控chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')# 无头模式配置ifHEADLESS:chrome_options.add_argument("--headless=new")chrome_options.add_argument("--disable-gpu")# 关闭冗余日志输出chrome_options.add_argument("--log-level=3")# 自动适配驱动!!解决国内无法访问境外驱动网站问题# webdriver-manager 国内镜像自动下载驱动,无需手动安装service=Service(ChromeDriverManager().install())self.driver=webdriver.Chrome(service=service,options=chrome_options)self.driver.maximize_window()# 全局显式等待(精准加载元素)self.wait=WebDriverWait(self.driver,10)# 隐式等待兜底self.driver.implicitly_wait(3)defwait_for_element(self,by,value,timeout=10):"""通用工具:等待元素可点击,超时不报错、不中断程序"""try:elem=WebDriverWait(self.driver,timeout).until(EC.element_to_be_clickable((by,value)))returnelemexceptTimeoutException:returnNonedeflogin_handle(self):"""加载页面 + 扫码登录逻辑,限时保护"""print("[INFO] 正在加载大麦演出页面...")self.driver.get(TARGET_URL)time.sleep(random.uniform(1,1.5))# 检测登录状态login_btn=self.wait_for_element(By.XPATH,"//*[contains(text(), '登录') or contains(text(), '登陆')]")iflogin_btn:print("[INFO] 检测到未登录!请打开大麦APP扫码登录(2分钟内完成)")login_btn.click()# 限时等待登录完成try:WebDriverWait(self.driver,LOGIN_WAIT_TIME).until(lambdad:"login"notind.current_url.lower())print("[SUCCESS] 账号登录成功,等待开票!")exceptTimeoutException:print("[ERROR] 登录超时,脚本自动退出,请重新运行!")self.driver.quit()exit()else:print("[INFO] 账号已登录,就绪等待开票")defwait_target_open_time(self):"""精准定时卡点,开票前高频刷新,无需手动值守"""print(f"[INFO] 定时等待开票:{TARGET_HOUR:02d}:{TARGET_MINUTE:02d}")whileTrue:now=time.localtime()h,m,s=now.tm_hour,now.tm_min,now.tm_sec# 临近开票,进入秒杀状态ifh==TARGET_HOURandm==TARGET_MINUTEands>=55:print("[INFO] 即将开票!启动秒杀模式!")break# 开票前1分钟高频刷新页面,确保第一时间加载库存ifh==TARGET_HOURandm==TARGET_MINUTE-1ands>=55:self.driver.refresh()time.sleep(random.uniform(0.4,0.6))time.sleep(0.1)defselect_date_session(self):"""自动选择可点击日期、演出场次"""print("[INFO] 自动匹配演出日期、场次")# 选择可用日期date_btn=self.wait_for_element(By.XPATH,"//div[contains(@class, 'date-item') and not(contains(@class, 'disabled'))]")ifdate_btn:date_btn.click()print("[INFO] 已选中演出日期")time.sleep(random.uniform(0.2,0.4))# 选择可用场次session_btn=self.wait_for_element(By.XPATH,"//div[contains(@class, 'session-item') and not(contains(@class, 'disabled'))]")ifsession_btn:session_btn.click()print("[INFO] 已选中演出场次")defselect_price_tier(self):"""精准匹配目标票档,双模式兜底(精确+模糊)"""print(f"[INFO] 匹配目标票档:{TARGET_PRICE}")# 精确匹配票档price_btn=self.wait_for_element(By.XPATH,f"//span[contains(text(), '{TARGET_PRICE}')]/..")ifprice_btn:price_btn.click()print(f"[SUCCESS] 成功选中票档:{TARGET_PRICE}")else:# 模糊匹配兜底price_btn=self.wait_for_element(By.XPATH,f"//*[contains(text(), '{TARGET_PRICE}')]")ifprice_btn:price_btn.click()print(f"[SUCCESS] 模糊匹配选中票档:{TARGET_PRICE}")else:print(f"[ERROR] 未找到对应票档,请检查配置文字是否一致!")time.sleep(random.uniform(0.2,0.3))defset_ticket_count(self):"""自动设置购票数量"""ifBUY_COUNT<=1:returnprint(f"[INFO] 调整购票数量至{BUY_COUNT}张")add_btn=self.wait_for_element(By.XPATH,"//div[contains(@class, 'number')]//span[contains(@class, 'plus') or contains(text(), '+')]")ifadd_btn:for_inrange(BUY_COUNT-1):add_btn.click()time.sleep(random.uniform(0.08,0.15))print("[INFO] 购票数量设置完成")defselect_viewer(self):"""自动勾选实名观演人"""print("[INFO] 勾选实名观演人")viewer_check=self.wait_for_element(By.XPATH,"//div[contains(@class, 'audience')]//input[@type='checkbox' and not(@disabled)]")ifviewer_checkandnotviewer_check.is_selected():viewer_check.click()print("[INFO] 观演人勾选完成")defsubmit_order_loop(self):"""核心下单逻辑:循环重试提交订单,极限抢票"""print("[INFO] 持续监控下单按钮,全力抢票中...")foridxinrange(MAX_SUBMIT_TRY):submit_btn=self.wait_for_element(By.XPATH,"//*[contains(text(), '立即购买') or contains(text(), '提交订单')]",timeout=1)ifsubmit_btn:try:submit_btn.click()print("\n【🎉抢票成功!】请15分钟内打开大麦APP完成支付!")returnTrueexceptException:continue# 定时刷新防缓存ifidx%5==0:self.driver.refresh()time.sleep(random.uniform(0.4,0.6))time.sleep(random.uniform(0.15,0.25))print("[ERROR] 抢票失败,已达最大重试次数")returnFalsedefrun(self):"""脚本主运行入口"""print("="*60)print(" 大麦网自动抢票脚本|国内适配版")print("="*60)try:# 1. 登录流程self.login_handle()# 2. 等待开票时间self.wait_target_open_time()# 3. 开票刷新,进入抢票流程self.driver.refresh()time.sleep(random.uniform(0.3,0.5))# 4. 自动选场次、选票、设数量self.select_date_session()self.select_price_tier()self.set_ticket_count()# 5. 点击立即购买buy_btn=self.wait_for_element(By.XPATH,"//*[contains(text(), '立即购买') or contains(text(), '选座购买')]")ifbuy_btn:buy_btn.click()# 6. 勾选观演人 + 提交订单self.select_viewer()self.submit_order_loop()else:print("[ERROR] 无购买按钮,门票已售罄或页面更新")exceptExceptionase:print(f"[FATAL] 脚本异常:{str(e)}")finally:print("\n[INFO] 脚本运行结束,浏览器保持打开可手动操作")input("回车关闭浏览器...")self.driver.quit()if__name__=="__main__":bot=DamaiTicketBot()bot.run()五、参数配置教程(仅改4项)
无需读懂代码,仅修改顶部自定义配置区4个核心参数即可使用:
TARGET_URL:大麦APP分享的移动端演出链接,替换链接内的
projectIdTARGET_HOUR / TARGET_MINUTE:官方开票时间(24小时制,如10点开票填 10、0)
TARGET_PRICE:目标票档文字,必须和网页一字不差(匹配失败是新手最大问题)
BUY_COUNT:购票数量,默认1张成功率最高,多张需提前添加对应观演人
六、零基础极速上手步骤
6.1 账号提前准备(必做)
大麦账号完成实名认证(未实名无法下单)
个人中心提前添加实名观演人信息
实体票演出提前填写收货地址
6.2 脚本运行步骤
将修改好的代码保存为
damai_bot.py终端进入文件所在文件夹,执行运行命令
python damai_bot.py弹出浏览器后,大麦APP扫码登录
登录成功后脚本自动卡点等待开票,全程无需手动操作
抢票成功后,15分钟内APP手动支付,超时订单失效
七、常见问题排查表
| 故障现象 | 问题原因 | 解决方案 |
|---|---|---|
| 匹配不到票档 | 票档文字和页面不一致 | 直接复制网页完整票档文字粘贴配置 |
| 驱动版本报错 | Chrome自动更新 | 脚本自动适配驱动,直接重启即可 |
| 无法勾选观演人 | 未实名/未添加观演人 | 提前在网页端完善实名与观演人信息 |
| 浏览器闪退、风控 | 操作频率过高 | 关闭无头模式,不要长时间挂机 |
八、风控与合规提醒
风控说明:脚本内置防风控参数,但平台存在行为检测,请勿24小时挂机、高频频繁运行
成功率说明:无100%抢票脚本,脚本仅替代人工重复操作,最终成功率取决于网络、服务器并发、运气
合规红线:代码仅限个人Python技术学习,禁止商用代抢、囤票倒卖,违规后果自负
九、拓展优化方向
可自行二次开发升级脚本:多票档优先级切换、微信抢票通知、Cookie免登录、多演出轮询监控、语音播报成功提醒等功能。
十、总结
本脚本适配国内网络环境,彻底解决境外驱动无法访问的问题,零基础用户修改少量配置即可全自动抢票。同时通过学习本脚本,可快速掌握 Selenium 网页自动化、元素等待、防风控优化、面向对象编程等实用技术,兼顾实战与学习价值。请理性使用技术,维护公平购票环境。