12306_自动化抢票系统
本文分享了国庆抢票自动化程序的优化方案。针对系统检测机制,提出了动态间隔调整策略(如随机sleep时间)和模拟人为操作的方法。对于"系统繁忙"弹窗问题,建议使用WebDriverWait动态定位元素并添加重试机制。同时分析了抢不到座的可能原因(网络延迟、缓存数据等),并给出了浏览器配置优化建议(禁用图片/CSS、隐藏自动化痕迹等)。该程序仅供非商业用途,旨在帮助用户提高抢票成功
·
国庆快到了,想着通过自动化测试程序抢个票.免费给大家分享.请勿商用.
速度与防检测的平衡优化
当前程序在速度过快时(如 sleep(0.03)
)会被系统识别为机器操作,触发“系统繁忙”弹窗;当 sleep(0.2)
时未被检测,而 sleep(0.15)
会触发检测。这表明系统对操作间隔有阈值判断。
解决方案:
- 动态间隔调整:在关键操作(如点击“预订”按钮)后,使用随机化的
sleep
时间,例如random.uniform(0.15, 0.25)
,避免固定间隔触发风控。 - 模拟人为延迟:对非关键操作(如页面加载)使用较短延时(如
0.1
秒),对关键操作(如提交订单)延长至0.2
秒以上。
暴力破解弹窗的可行性
直接捕获“系统繁忙”弹窗的确定按钮并重试是一种有效绕过策略,但需注意:
其他影响因素:
- 弹窗元素定位:确保使用
WebDriverWait
动态等待弹窗出现,而非硬性sleep
。示例代码:# 第一步:尝试关闭警告对话框(直接内联实现) try: warning_btn = WebDriverWait(self.driver, 0.3).until( EC.presence_of_element_located((By.ID, 'qd_closeDefaultWarningWindowDialog_id')) ) # 执行警告按钮的javascript代码 self.driver.execute_script(""" var btn = document.getElementById('qd_closeDefaultWarningWindowDialog_id'); if (btn && btn.href) { var jsCode = btn.href.replace('javascript:', '').trim(); if (jsCode) { eval(jsCode); } else { btn.click(); } } """) print("✅ 警告对话框已关闭") time.sleep(0.08) # 等待对话框关闭 except Exception as e: # 没有警告对话框是正常情况 pass
- 重试机制:在点击“预订”后加入循环检测,若弹窗出现则立即处理并重新提交。
-
仅抢到无座票的可能原因
网络延迟问题:
- 请求时序差异:即使本地操作速度很快,网络延迟可能导致请求到达服务器时座位已被占用。
- 优化建议:
- 使用更高带宽的网络或减少本地程序的其他资源占用。
- 在提交前通过
driver.execute_script("return document.readyState")
确保页面完全加载。
- 缓存数据:部分站点会缓存座位状态,需通过强制刷新(如
F5
模拟)获取实时数据。 - 多线程竞争:若同时多人抢票,可尝试在多个标签页或浏览器实例中并行提交不同车次。
系统速度的提升
通过修改浏览器设置来得到
# === 添加浏览器优化配置 ===
self.options = webdriver.ChromeOptions() #设置浏览器启动参数
self.options.add_experimental_option('detach', True) #保持浏览器窗口在结束之后不关闭
self.options.add_experimental_option('excludeSwitches', ['enable-automation']) #隐藏"Chrome正受到自动测试软件的控制"提示,降低被网站检测为自动化的风险
self.options.add_argument('--disable-blink-features=AutomationControlled')#禁用 Blink 引擎的自动化控制特征,进一步隐藏自动化痕迹,避免被反爬虫机制检测
self.options.add_argument('--no-sandbox')#禁用沙盒模式。提升性能但降低安全性
self.options.add_argument('--disable-dev-shm-usage')
self.options.add_argument('--disable-gpu')#禁用 GPU 硬件加速,避免GPU相关硬件错误.
self.options.add_argument('--disable-extensions')#禁用所有浏览器扩展插件,减少内存占用
self.options.add_argument('--disable-images') # 禁用图片加载
# 网络请求优化 - 禁用图片和CSS
self.options.add_experimental_option("prefs", {
#"profile.default_content_setting_values.images": 2, # 禁用图片
#"profile.managed_default_content_settings.stylesheets": 2, # 禁用CSS
"profile.managed_default_content_settings.javascript": 1, # 保持JS启用
"profile.managed_default_content_settings.flash": 2 # 禁用Flash
完整代码可以看github:
更多推荐
所有评论(0)