10个代理并发抢鞋:SneakerBotTutorials多线程架构与Driver管理深度解析
【免费下载链接】SneakerBotTutorialsOpen Source SneakerBot created as a supplement to my "Creating a Sneaker Bot in Python" Youtube Series项目地址: https://gitcode.com/gh_mirrors/sn/SneakerBotTutorials
SneakerBotTutorials 是一款开源球鞋机器人(Sneaker Bot)项目,配套 YouTube 系列教程"Creating a Sneaker Bot in Python",核心玩法就是用Python 多线程 + 代理并发,让 10 个无头浏览器同时访问发售页面抢鞋。本文带你拆解它的多线程架构、Driver(浏览器实例)管理逻辑,以及代理测试筛选流程。
为什么抢鞋机器人必须"多线程 + 代理"
热门球鞋(比如 Yeezy 350 V2)开售时,单一 IP 的浏览器会被页面直接限流或风控,手动刷新更是毫无胜算。SneakerBotTutorials 的思路是:
- 🌐每个代理 IP 一个浏览器实例,用不同出口 IP 分散访问;
- 🧵每个代理一条 Python 线程,10 个代理就是 10 路并发,同时刷新目标页面;
- 📸 每个代理自动保存一张截图,方便事后核对每个 IP 到底跑没跑通。
项目结构与一键安装步骤
仓库克隆下来之后,核心文件很少,结构非常清晰:
git clone https://gitcode.com/gh_mirrors/sn/SneakerBotTutorials cd SneakerBotTutorials pip install -r requirements.txt依赖见 requirements.txt:Flask(Web 控制台)、selenium(浏览器驱动)、requests、beautifulsoup4。
| 文件 | 作用 |
|---|---|
| main.py | 机器人核心:bot类、Driver 管理、线程并发 |
| app.py | Flask Web 控制台:代理测试、启动/跳转浏览器 |
| proxy_tests.py | 代理配置函数的单元测试 |
| RandomHeaders.py | 随机 User-Agent,降低指纹特征 |
| testingCookies.py | 无头浏览器 Cookie 迁移实验 |
| oldBot/ | 早期单线程版本(Part1~Part3),适合对照学习 |
多线程架构拆解:一个代理一条线程
整个项目的并发核心就一句话——列表推导式批量建线程,先全部 start,再全部 join。main.py 中的startAllDrivers()是代表性实现:
threads = [threading.Thread(target=self.startDriver, args=(proxy,)) for proxy in self.proxyList] for thread in threads: thread.start() for thread in threads: thread.join()同样的模式在项目中共出现 3 处,分别对应抢鞋流程的 3 个阶段:
- 并发启动:startAllDrivers() —— 每个代理一条线程,各自开一个 PhantomJS 无头浏览器并访问目标 URL;
- 并发跳转:sendAllToURL() —— 所有已打开的 Driver 同时刷新到同一个发售页,10 路并发抢刷新;
- 并发蹲点:grabSS() 在 main.py 中为每个代理开线程,死循环盯住 Splash 页,一旦标题变化就截图、导出 Cookie 并切换到可视化 Firefox 窗口人工接管。
💡 早期的 oldBot/Part3.py 里还有
ThreadNumber{}的命名线程写法,对比阅读能直观看到"从单线程轮询"到"全代理并发"的演进过程。
Driver 管理:bot 类如何"记住"每一个浏览器
main.py 中的bot类是整个 Driver 管理的中心,初始化时维护 4 个关键列表:
driverList:所有活着的 Selenium 实例,元素为{'driver': driver, 'proxy': proxy};driverInfo:每个 Driver 的完整档案(proxy / driver / url / useragent),供 Web 面板展示;successProxies:成功启动的代理(白名单);failedProxies:启动失败的代理(黑名单),后续测试页会显示"差了几个代理"。
单个 Driver 的生命周期由 startDriver() 完成:
- 调用 createHeadlessBrowser() 创建 PhantomJS,通过
--proxy=参数把代理注入浏览器; - 访问目标 URL,成功则把 driver 追加进
driverList、successProxies,并按static/{IP}.png格式截图存档; - 失败(超时/无法访问)则立即
close()释放资源,把该代理记入failedProxies,不影响其他线程继续跑。
这种"失败隔离"设计很关键:10 个代理里挂掉 2 个,剩下 8 路并发照常工作。而 app.py 的massTestProxies()还会在开打之前,用线程并发 ping 一遍所有代理,把每个代理的延迟(Ping)和连接时间记录进 templates/index.html 的面板表格。
📌 上图就是SS_FORMAT = "static/{0}.png"自动产出的截图:每个代理 IP 对应一张独立的浏览器信息页(见 main.py 的截图命名规则),10 个代理并发跑完,static 目录下就会多出 10 张同构截图,一眼就能确认哪些 IP 真的跑通了。
代理测试与筛选:先验证,再开打
抢鞋之前,代理质量决定成败。项目提供了三层验证手段:
- verifyProxy():单代理连通性测试,能访问 Google 即返回
True; - configure_proxy_settings():把 IP/端口/账号密码规范成 requests 可用的代理字典,带鉴权的代理也能接入;
- getPing():记录每个代理的响应延迟,延迟高的代理在并发刷新时会拖慢整体节奏。
proxy_tests.py 里的单元测试覆盖了三类场景:无鉴权代理、带账号密码代理、空参数返回None,是很好的代理配置参考。
实战:一键启动 10 路并发抢鞋
完整流程只需 3 步:
- 启动:
python app.py 139.59.169.81:8000 103.12.160.61:3128 ...,直接在命令行传 10 个IP:端口,也可以传.csv文件批量导入(见 app.py 入口逻辑); - 启动浏览器:访问
http://localhost:8000或 POST 到 /openDriver 路由,bot.startAllDrivers()会并发拉起全部代理浏览器; - 统一跳转:在面板输入发售页地址,POST 到 /goToURL 触发
sendAllToURL(),10 个 Driver 同时刷新同一页面。
⚠️ 小贴士:
- 线程数 = 代理数,并发开浏览器是 CPU/内存大户,低配机器建议先 3~5 个代理练手;
- 代理格式必须是
IP:端口,main.py 支持用-R参数从文件读取; - 无头浏览器需要 PhantomJS 支持,Python 2.7 环境下运行(项目原始版本基于 Python 2)。
常见问题 FAQ
Q:10 个线程同时开浏览器,会不会把机器卡死?会。每条线程都要起一个完整的 PhantomJS 进程,建议观察内存占用,必要时减少并发数或分机部署。
Q:代理失效了怎么办?不用重启。failedProxies只记录启动失败项,/botInfo面板会实时显示有效代理与失败数量的差值(proxyDiff),换一份代理文件重跑即可。
Q:抢到鞋之后怎么接管?grabSS() 的设计是:无头浏览器蹲到 Splash 页通过后,自动把 Cookie 迁移到一个可视化 Firefox 窗口,人类接管完成付款。
总结
SneakerBotTutorials 用最朴素的"一代理一线程"模式,把代理并发、Driver 生命周期管理、失败隔离、截图审计四件事串成了一套完整的抢鞋流水线:多线程并发在 main.py 的三处线程池调用里,Driver 档案在bot类的四个列表中,代理筛选在 app.py 的 ping 测试里。读懂这套架构,你不仅能复刻一个抢鞋机器人,还能把它迁移到任何"高并发 + 多 IP 访问"的自动化场景。👟
【免费下载链接】SneakerBotTutorialsOpen Source SneakerBot created as a supplement to my "Creating a Sneaker Bot in Python" Youtube Series项目地址: https://gitcode.com/gh_mirrors/sn/SneakerBotTutorials
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考