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

如何优化Scrapy结合Selenium时driver.get加载速度,实现元素变更即时检测

可行优化方案
  • 取消重复页面加载
    现有代码核心性能损耗来自循环内反复调用driver.get()全量加载页面,实际上仅需首次打开页面1次,后续直接在已渲染的页面上检测元素变化即可,直接砍掉绝大多数重复加载耗时。
  • 调整Chrome启动参数与加载策略
    修改Chrome配置,禁用不必要的资源加载,调整页面加载判定规则:
    1. 将页面加载策略设为eager,仅等待DOM树加载完成就返回,无需等待图片、字体、样式表等非核心资源加载完成
    2. 禁用图片、音频视频、扩展插件等非必要资源加载,减少首次加载耗时
    3. 启用浏览器缓存,复用已加载的静态资源
      相关配置示例:
    chrome_options.page_load_strategy = 'eager'
    chrome_options.add_argument("--blink-settings=imagesEnabled=false") # 禁用图片
    chrome_options.add_argument("--disable-extensions") # 禁用扩展
    chrome_options.add_argument("--disable-gpu") # 禁用GPU加速
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    
  • 移除冗余Scrapy依赖
    当前监控逻辑完全不需要Scrapy框架参与,直接基于Selenium实现即可,避免不必要的框架调度开销,精简代码结构。
  • 主动监听元素变更替代轮询加载
    不要反复拉取页面,可直接通过Selenium注入前端JS的MutationObserver API,监听.ant-card-body元素的内容、属性变更,元素发生变化时会主动触发回调,检测延迟可低至毫秒级,完全满足即时检测需求。如果不想使用JS注入,也可以在首次加载页面后,以较小的间隔(比如500ms)直接查询当前页面的目标元素文本,和上一次存储的结果做对比,性能也远优于反复加载页面。
优化后参考代码
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time

def monitor_site(url, target_selector):
    chrome_options = Options()
    chrome_options.add_argument("--headless=new")
    chrome_options.page_load_strategy = 'eager'
    chrome_options.add_argument("--blink-settings=imagesEnabled=false")
    chrome_options.add_argument("--disable-extensions")
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("--no-sandbox")
    
    driver = webdriver.Chrome("chromedriver.exe", options=chrome_options)
    # 仅加载一次页面
    start = time.time()
    driver.get(url)
    print(f"首次加载完成,耗时{time.time()-start:.2f}秒")
    
    # 存储上一次的元素内容
    last_content = set()
    while True:
        # 直接在当前页面查询元素,不需要重新加载
        new_elems = driver.find_elements(By.CSS_SELECTOR, target_selector)
        current_content = {elem.text for elem in new_elems}
        # 对比内容是否变更
        if current_content != last_content:
            print("元素内容发生变更:")
            for text in current_content:
                print(text)
            # 这里添加需要执行的自定义操作
            last_content = current_content
        # 调整检测间隔,单位秒
        time.sleep(0.5)

if __name__ == "__main__":
    monitor_site("https://solanamonkeysclub.com/#/#mint", ".ant-card-body")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:48:04