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

Docker容器运行Selenium+Scrapy爬虫提示NoSuchElementException问题求助

故障原因与解决方案

你遇到的NoSuchElementException报错是页面渲染逻辑冲突、无头模式适配不足、等待策略不完善共同导致的,具体原因如下:

  • 逻辑重复冲突:你同时使用了scrapy-selenium提供的SeleniumRequest和自行初始化的webdriver.Chrome实例,SeleniumRequest本身已经完成了页面驱动渲染,你在parse方法中又调用self.driver.get()重新加载页面,两次加载逻辑冲突导致页面状态异常。
  • 无头模式适配缺失:Chrome无头模式默认窗口尺寸极小,大部分响应式站点不会在小窗口下渲染完整的桌面端内容,你没有配置窗口启动参数,目标站点在容器运行的小窗口环境下没有渲染类名为ReactTable的表格元素。
  • 等待策略不完善:仅配置隐式等待无法覆盖所有加载场景,容器性能波动、网络延迟都可能导致元素还未加载完成就执行查找逻辑。

代码修改方案

1. 修正加载逻辑,替换parse方法

def parse(self, response):
    # 直接使用SeleniumRequest渲染完成的driver实例,删除重复的self.driver.get调用
    driver = response.meta['driver']
    # 新增显式等待,等待目标元素加载最长30秒
    WebDriverWait(driver, 30).until(
        EC.presence_of_element_located((By.CLASS_NAME, "ReactTable"))
    )
    soup = BeautifulSoup(driver.find_element(By.CLASS_NAME, "ReactTable").get_attribute("outerHTML"), 'html.parser')
    # 原有业务逻辑不变
    rows = soup.findAll('div', {"class": 'rt-tr-group'})
    for row in rows:
        print(str(row.findAll('div', {"class": 'rt-td'})[1].findAll('span')[0].text).strip())
    driver.quit()

2. 补充Chrome启动参数

在现有ChromeOptions配置段新增以下参数:

# 配置窗口尺寸适配桌面端站点渲染
options.add_argument('--window-size=1920,1080')
options.add_argument('--start-maximized')

3. 可选优化

你当前配置的User-Agent版本为Chrome60,和容器内安装的Chrome93版本不匹配,建议更新User-Agent与实际Chrome版本对齐,避免被站点反爬策略拦截导致页面返回异常。

Dockerfile无需调整

你已经正确安装了版本匹配的Chrome与ChromeDriver,可排除驱动相关问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:15:03