如何解决Scrapy-Selenium无法生成输出的问题?
问题排查与解决
1. 选择器语法错误
你的CSS选择器tr[class= \"app\"]里多了无效空格,正确写法应为tr[class="app"]或更简洁的tr.app。浏览器渲染后的元素class属性值是app,带空格的选择器会完全匹配不到目标行,这是无输出的核心原因。
2. 等待逻辑优化
固定wait_time=10的可靠性不足,建议用显式等待指定等待目标元素加载完成,避免页面框架加载完毕但动态内容未渲染的情况。
3. 简化解析流程
Scrapy-Selenium返回的response已经是渲染后的完整页面内容,无需重新通过driver.page_source生成Selector,直接用response.xpath/response.css即可完成解析。
修改后的代码
from scrapy import Selector from scrapy_selenium import SeleniumRequest from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class SeamdbTestSpider(scrapy.Spider): name = 'steam_db_test' start_urls = ['https://steamdb.info/graph/'] def start_requests(self): for link in self.start_urls: yield SeleniumRequest( url=link, # 显式等待目标表格加载完成,超时15秒 wait_until=EC.presence_of_element_located((By.ID, "table-apps")), callback=self.parse) def parse(self, response): # 直接用response解析目标行 rows = response.css('tr.app')[0:2] for element in rows: info_link = "https://steamdb.info" + element.css('a::attr(href)').get() name = element.css('a::text').get() # 增加判空处理,避免无效数据 if name and info_link: yield {"Name": name.strip(), "Link": info_link}
额外检查点
- 确认Scrapy-Selenium中间件已在
settings.py中正确配置:DOWNLOADER_MIDDLEWARES = { 'scrapy_selenium.SeleniumMiddleware': 800 } SELENIUM_DRIVER_NAME = 'chrome' # 替换为你使用的浏览器 SELENIUM_DRIVER_EXECUTABLE_PATH = '/path/to/your/driver' # 驱动文件路径 SELENIUM_DRIVER_ARGUMENTS = ['--headless=new'] # 可选无头模式配置 - 检查浏览器版本与驱动版本是否匹配,版本不兼容可能导致隐性渲染失败。
内容的提问来源于stack exchange,提问作者Baraa Zaid
相关产品推荐
相关产品推荐

