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

