如何优化Scrapy结合Selenium时driver.get加载速度,实现元素变更即时检测
可行优化方案
- 取消重复页面加载
现有代码核心性能损耗来自循环内反复调用driver.get()全量加载页面,实际上仅需首次打开页面1次,后续直接在已渲染的页面上检测元素变化即可,直接砍掉绝大多数重复加载耗时。 - 调整Chrome启动参数与加载策略
修改Chrome配置,禁用不必要的资源加载,调整页面加载判定规则:- 将页面加载策略设为
eager,仅等待DOM树加载完成就返回,无需等待图片、字体、样式表等非核心资源加载完成 - 禁用图片、音频视频、扩展插件等非必要资源加载,减少首次加载耗时
- 启用浏览器缓存,复用已加载的静态资源
相关配置示例:
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的MutationObserverAPI,监听.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
相关产品推荐
相关产品推荐

