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
相关产品推荐
相关产品推荐

