Scrapy与Selenium结合运行爬虫时出现KeyError: 'driver'问题求助
解决Scrapy用CrawlerProcess运行时出现KeyError: 'driver'的问题
问题原因
直接执行scrapy runspider Myspider时,Scrapy会自动加载项目根目录下的settings.py配置文件,其中的Selenium相关配置和下载中间件设置会被正常读取,SeleniumMiddleware能完成driver的初始化。但通过CrawlerProcess启动爬虫时,默认不会自动加载项目的settings,导致Selenium的配置未生效,中间件无法创建driver实例,最终触发KeyError: 'driver'。
另外你的爬虫类代码里存在一个小问题:__init__方法中调用super时用了字符串my_spider,而不是当前类名MySpider,这会导致父类初始化异常,虽不是直接触发该错误的原因,但也是潜在问题。
解决方案
1. 让CrawlerProcess加载项目settings
修改主文件,导入并传入项目的settings配置:
import scrapy import classListUrls from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings # 新增导入 from dir.spiders import Spider URL = "example.com" urls = classListUrls.GenListUrls(URL) # 传入项目settings创建CrawlerProcess process = CrawlerProcess(get_project_settings()) process.crawl(Spider.my_spider, list_urls = urls.list_urls()) process.start()
2. 修正爬虫类的super调用
修改爬虫文件中的__init__方法:
class MySpider(scrapy.Spider): name = 'my_spider' def __init__(self, list_urls, *args, **kwargs): # 将super的第一个参数改为当前类名MySpider super(MySpider, self).__init__(*args, **kwargs) self.urls = list_urls def start_requests(self): for url in self.urls: yield SeleniumRequest( url = url['link'], callback = self.parse, wait_time = 15, )
3. 确保Selenium驱动配置正确
检查settings.py中的SELENIUM_DRIVER_EXECUTABLE_PATH:
- 如果你的系统环境变量
PATH中已经包含chromedriver的路径,保持注释没问题; - 如果没有,取消注释并填写正确的
chromedriver绝对路径,避免驱动找不到的问题:
SELENIUM_DRIVER_EXECUTABLE_PATH = '/home/PATH/OF/FILE/chromedriver'
内容的提问来源于stack exchange,提问作者SDLSpin
相关产品推荐
相关产品推荐

