Python抢票工具实战:Selenium+Requests自动化方案与避坑指南

发布时间:2026/10/17 9:35:15
Python抢票工具实战:Selenium+Requests自动化方案与避坑指南 简介这是一份面向Python爬虫与自动化爱好者的「大麦网自动抢票工具」源码包适合具备一定编程基础、希望研究浏览器自动化与高并发请求实践的开发者。资源围绕热门演出票务紧张场景提供从页面监控、信息填写到订单提交的完整实现思路帮助理解抢票流程中的关键技术环节。压缩包共6个文件约24KB包含1个py主程序、1个json配置文件、1个md说明文档及3张png示意图结构精简便于快速定位核心逻辑与配置入口。目前已有32970人学习下载热度较高。通过阅读源码读者可掌握Selenium等浏览器自动化工具的调用方式、多线程与异步请求的并发策略、验证码识别与IP代理池的接入思路以及异常重试机制的设计方法同时了解数据库存储账号与演出偏好的基本做法。代码可作为学习网络爬虫、事件监听触发及安全合规边界的实践参考也便于按自身需求二次调整。1. 抢票工具的真相为什么你总是慢那0.5秒大麦网自动抢票工具本质上是一套把「人工点击」替换成「程序轮询自动提交」的脚本系统。它的核心价值不在于「破解」什么而在于把选座、提交订单、确认支付这几个动作的响应时间从人的300毫秒压缩到50毫秒以内。适合谁适合那些手速不慢、网速不差但每次都在「提交订单」那一步被挤出来的开发者。我见过太多人以为抢票靠的是运气其实在库存释放的那一瞬间拼的是谁先完成「查询→锁定→提交」这个链路。这篇文章不讲玄学只讲怎么用SeleniumRequests搭一套能跑通的方案以及我在实际调试中踩过的坑。如果你连Python环境都没装好建议先补基础因为后面的每一步都需要你动手改代码。2. 技术选型Selenium和Requests到底该用哪个2.1 两种方案的适用场景对比抢票工具的技术路线基本分两派一派是纯协议模拟用Requests直接构造HTTP请求另一派是浏览器自动化用Selenium驱动真实浏览器。我一开始图快直接上了Requests结果发现大麦网的登录态维护比想象中复杂——它不是简单的Cookie还涉及动态Token和风控指纹。后来换成Selenium虽然慢一点但胜在稳定因为浏览器帮你处理了JS渲染和加密参数。维度Requests方案Selenium方案速度快单次请求50ms内慢单次操作200ms起稳定性低参数易变高模拟真人操作登录维护需手动抓Token自动维持会话反爬对抗弱易被识别强指纹真实开发难度高需逆向低API直观我的建议是如果你只是想抢一张普通票Selenium足够如果你要抢热门场次建议用Selenium登录Requests提交的混合模式。但混合模式有个坑——Token同步问题后面避坑章节会细说。2.2 环境搭建与依赖安装先装Python 3.8以上版本然后建虚拟环境。别嫌麻烦我见过太多人因为全局包冲突导致ChromeDriver跑不起来。# 创建虚拟环境 python -m venv ticket_env # 激活环境Windows ticket_env\Scripts\activate # 激活环境Mac/Linux source ticket_env/bin/activate # 安装核心依赖 pip install selenium requests beautifulsoup4 lxmlChromeDriver的版本必须和本机Chrome浏览器一致否则会报「session not created」错误。我一般去Chrome的设置里看版本号然后下载对应版本的Driver。下载后把Driver路径加到系统PATH或者直接在代码里指定路径。from selenium import webdriver from selenium.webdriver.chrome.service import Service # 指定ChromeDriver路径避免环境变量问题 service Service(executable_path/path/to/chromedriver) options webdriver.ChromeOptions() # 关闭「正受到自动测试软件控制」提示 options.add_experimental_option(excludeSwitches, [enable-automation]) options.add_experimental_option(useAutomationExtension, False) driver webdriver.Chrome(serviceservice, optionsoptions)这段代码的关键在excludeSwitches参数它去掉浏览器顶部的自动化提示条。别小看这个提示条有些风控系统会检测这个特征。useAutomationExtension设为False也是同理减少被识别的概率。2.3 登录态获取的两种实操路径登录是抢票的第一道坎。大麦网支持扫码登录和账号密码登录我推荐扫码因为密码登录容易触发滑块验证。import time from selenium.webdriver.common.by import By # 打开登录页 driver.get(https://passport.damai.cn/login) # 等待用户手动扫码预留30秒 time.sleep(30) # 获取登录后的Cookies cookies driver.get_cookies() # 把Cookies转成Requests可用的格式 cookie_dict {c[name]: c[value] for c in cookies} print(cookie_dict)这段代码的逻辑是Selenium打开登录页后你手动扫码程序等待30秒让登录完成然后抓取Cookies。参数time.sleep(30)可以根据实际情况调整但别设太短否则Cookies没抓全。抓到的Cookies可以存到本地文件下次直接加载省去扫码步骤。注意Cookies有有效期一般几小时到一天不等。如果抢票当天发现Cookies失效重新扫码即可别硬跑。3. 核心逻辑从监控库存到提交订单的完整链路3.1 库存监控的轮询策略与频率控制库存监控的本质是「定时查询条件判断」。大麦网的票档接口会返回一个JSON里面包含各价位的库存状态。我一般用Requests轮询因为比Selenium快。import requests import time # 目标场次的接口地址需从浏览器开发者工具抓取 url https://detail.damai.cn/item/stock?itemIdxxxxx headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Cookie: ; .join([f{k}{v} for k, v in cookie_dict.items()]) } while True: try: resp requests.get(url, headersheaders, timeout3) data resp.json() # 判断目标价位是否有票 if data[stock][price_680][status] available: print(有票了准备提交) break except Exception as e: print(f查询失败{e}) # 轮询间隔建议0.5到1秒 time.sleep(0.8)这段代码的核心参数是time.sleep(0.8)。太快容易被封IP太慢抢不到。我实测0.5到1秒是比较安全的区间。timeout3是防止请求卡死超过3秒直接放弃这次查询。headers里的Cookie必须和登录态一致否则接口返回未登录。3.2 提交订单的自动化操作步骤当监控到有票后立刻切换到Selenium执行提交。为什么不用Requests直接提交因为提交订单涉及复杂的表单参数和加密签名Selenium模拟点击更可靠。from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 跳转到选座页 driver.get(https://detail.damai.cn/item/xxxxx) # 等待票档按钮出现最多等5秒 wait WebDriverWait(driver, 5) price_btn wait.until(EC.element_to_be_clickable((By.XPATH, //div[contains(text(),680元)]))) price_btn.click() # 点击「立即购买」 buy_btn wait.until(EC.element_to_be_clickable((By.XPATH, //button[contains(text(),立即购买)]))) buy_btn.click() # 选择观演人这里假设已提前添加 viewer wait.until(EC.element_to_be_clickable((By.XPATH, //div[classviewer-item]))) viewer.click() # 提交订单 submit_btn wait.until(EC.element_to_be_clickable((By.XPATH, //button[contains(text(),提交订单)]))) submit_btn.click()这段代码的每一步都用WebDriverWait做显式等待而不是time.sleep。显式等待会在元素出现时立刻执行比固定等待快得多。By.XPATH的写法要灵活因为大麦网的class名经常变用文本内容定位更稳。观演人必须提前在账号里添加好否则这一步会卡住。3.3 支付环节的自动化边界提交订单后会跳转到支付页面。这里我建议不要自动化支付原因有两个一是支付涉及资金安全二是支付页面的风控最严。我的做法是提交订单后用声音提醒或弹窗通知手动完成支付。import winsound # 提交成功后播放提示音 winsound.Beep(1000, 2000) print(订单已提交请手动支付)如果是Mac或Linux可以用os.system(afplay /System/Library/Sounds/Glass.aiff)或print(\a)。这一步的参数没什么好调的关键是别让程序自动输密码翻车案例太多了。4. 避坑指南我踩过的五个血泪坑4.1 坑一Cookie失效导致查询接口返回未登录现象程序跑了一晚上第二天发现所有请求都返回「请先登录」。原因大麦网的Cookie有效期短且异地登录会触发失效。解决每次抢票前重新扫码获取Cookie别用昨天的。我一般把扫码步骤做成手动触发抢票前10分钟跑一次。4.2 坑二ChromeDriver版本不匹配报session not created现象代码一跑就报「session not created: This version of ChromeDriver only supports Chrome version XX」。原因Chrome浏览器自动更新了但Driver还是旧版。解决关闭Chrome自动更新或者每次抢票前检查版本。我习惯把Driver放在项目目录下代码里写死路径避免PATH冲突。4.3 坑三轮询频率过高被临时封IP现象查询接口突然返回403换IP后恢复。原因time.sleep设得太短比如0.1秒触发风控。解决轮询间隔不低于0.5秒最好加随机抖动。我一般用time.sleep(0.5 random.random() * 0.5)让间隔在0.5到1秒之间浮动。4.4 坑四提交订单时提示「观演人信息不完整」现象点击提交后弹窗报错订单没生成。原因账号里没提前添加观演人或者观演人数量超过票数限制。解决抢票前一周就把观演人信息填好包括姓名和证件号。别等到抢票当天才加那时候系统卡得你怀疑人生。4.5 坑五Selenium被检测出自动化特征现象登录时频繁出滑块或者提交订单时被拦截。原因ChromeDriver的默认指纹被识别。解决除了前面说的excludeSwitches还可以用undetected-chromedriver库替代原生Selenium。这个库会修改Chrome的启动参数隐藏自动化特征。安装命令是pip install undetected-chromedriver用法和Selenium基本一致。import undetected_chromedriver as uc driver uc.Chrome() driver.get(https://passport.damai.cn/login)这个库的好处是开箱即用不用手动配参数。但注意它更新频率高建议锁定版本避免突然不兼容。5. 进阶技巧用多线程和代理池提升成功率5.1 多线程监控的线程数选择单线程轮询只能盯一个价位多线程可以同时监控多个价位。但线程不是越多越好我实测4到6个线程比较稳再多容易触发风控。import threading def monitor_price(price, url, headers): while True: resp requests.get(url, headersheaders, timeout3) if resp.json()[stock][fprice_{price}][status] available: print(f{price}元有票) # 触发提交逻辑 break time.sleep(0.8) # 启动4个线程分别监控不同价位 for p in [380, 580, 680, 880]: t threading.Thread(targetmonitor_price, args(p, url, headers)) t.start()这段代码的关键是每个线程独立轮询互不干扰。但要注意所有线程共用同一个Cookie如果Cookie失效全部线程都会失败。所以建议加一个Cookie有效性检测失效时自动暂停。5.2 代理池的接入与切换策略如果单IP被限流可以接入代理池。但免费代理基本不能用延迟高且不稳定。我一般用付费代理按量计费那种。proxies { http: http://user:passproxy_ip:port, https: https://user:passproxy_ip:port } resp requests.get(url, headersheaders, proxiesproxies, timeout5)代理的切换策略是每个线程用不同的代理失败3次后自动换下一个。别把所有线程绑同一个代理否则一挂全挂。5.3 验证方法用日志和录屏定位失败环节抢票失败时别急着改代码先看日志。我习惯在每一步加时间戳和状态码。import logging logging.basicConfig(levellogging.INFO, format%(asctime)s - %(message)s) logging.info(开始查询库存)如果日志看不出问题就用Selenium的录屏功能。虽然Selenium原生不支持录屏但可以用ffmpeg配合屏幕录制。我一般用OBS手动录抢票时开着失败后回放看是哪一步卡了。这个笨办法帮我定位过好几次「元素定位失效」的问题。最后一句话教训别把抢票工具当成一劳永逸的银弹它更像一把需要每天磨的刀。我现在的习惯是抢票前三天开始跑测试每天调一次参数直到稳定出票为止。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询