国庆快到了,想着通过自动化测试程序抢个票.免费给大家分享.请勿商用.

速度与防检测的平衡优化

当前程序在速度过快时(如 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:

https://github.com/whilefog233/12306_grab_tickets.git

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐