You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium抢RTX4090脚本嵌套循环过慢,求优化建议

优化Selenium抢购RTX 4090脚本的核心方案

1. 干掉冗余嵌套循环,换用显式精准等待

你现在的三层嵌套while循环会反复无意义重试,再加上全局10秒的隐式等待,直接拖慢了整个流程。改用WebDriverWait显式等待,只在元素出现/可点击时才执行操作,完全避免无效循环:

替换原嵌套循环的代码:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化显式等待,超时设为5秒(抢购场景要快,不用等太久)
wait = WebDriverWait(uc, 5)

while True:
    try:
        uc.get(url)
        
        # 处理地区选择:能点就点,超时说明已经在美区,直接跳过
        try:
            country_btn = wait.until(EC.element_to_be_clickable(("class name", "us-link")))
            country_btn.click()
        except:
            pass
        
        # 处理调查弹窗:同理,能关就关,关不了直接跳过
        try:
            survey_btn = wait.until(EC.element_to_be_clickable(("xpath", '/html/body/div[7]/div/div/div[3]/button[2]')))
            survey_btn.click()
        except:
            pass
        
        # 尝试点击加购按钮,成功就跳出循环
        add_cart_btn = wait.until(EC.element_to_be_clickable(("xpath", '/html/body/div[4]/main/div[3]/div[3]/div[2]/div/div/div[14]/div[2]/div/div/div/button')))
        add_cart_btn.click()
        break
        
    except NoSuchElementException:
        print("缺货,等待刷新")
        rotations += 1
        print(f"已刷新 {rotations} 次")
        if rotations % 5 == 0:
            rotate_VPN(hideIP)
        randomRefresh()

2. 换掉脆弱的绝对XPath,用更稳定的定位方式

绝对XPath(比如/html/body/div[4]/...)一碰到页面结构微调就失效,定位速度还慢。优先用相对XPath、CSS选择器或者页面自带的测试属性(比如data-testid):

  • 加购按钮可以用BestBuy自带的属性定位:
    add_cart_btn = wait.until(EC.element_to_be_clickable(("css selector", '[data-testid="add-to-cart-button"]')))
    
  • 调查弹窗关闭按钮也可以简化:
    survey_btn = wait.until(EC.element_to_be_clickable(("css selector", 'button[data-testid="survey-close-button"]')))
    

3. 关掉全局隐式等待,避免双重等待拖慢速度

你设置的uc.implicitly_wait(10)会让Selenium每次找元素都最多等10秒,和显式等待叠加后会导致等待时间翻倍。直接删掉这行,完全用显式等待控制每个元素的超时,能省不少时间。

4. 别每次都刷新整个页面,先查库存再操作

刷新整个页面耗时极长,不如先通过API接口查库存,确认有货了再用Selenium打开页面操作:

import requests

def check_stock():
    # 替换成对应商品的库存API(浏览器F12抓包就能拿到)
    api_url = "https://api.bestbuy.com/v1/products/你的商品SKU.json?apiKey=你的API密钥"
    response = requests.get(api_url, headers={"User-Agent": "Mozilla/5.0"})
    data = response.json()
    return data["inventory"]["onlineAvailability"] == True

# 主循环先查库存,有货再打开页面
while True:
    if check_stock():
        uc.get(url)
        # 处理弹窗、加购逻辑
    else:
        print("缺货,等待刷新")
        randomRefresh()

注:需要去BestBuy开发者平台申请API密钥,或者直接抓页面的库存接口(注意模拟请求头)

5. 优化VPN切换逻辑,减少网络波动

现在每5次刷新就切VPN,但切换VPN会中断网络,重新连需要时间。可以改成连续检测到IP被限制时再切换,或者把切换间隔改成10次,减少不必要的网络波动。

6. 禁用浏览器冗余功能,提速页面加载

初始化Chrome时加这些配置,关掉图片、无用插件,减少页面加载耗时:

options = uc.ChromeOptions()
options.add_argument("--blink-settings=imagesEnabled=false")  # 禁用图片加载
options.add_argument("--disable-extensions")
options.add_argument("--disable-plugins")
options.add_argument("--start-maximized")
uc = uc.Chrome(options=options)

内容的提问来源于stack exchange,提问作者Osprey350

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:05:30