使用Scrapy Shell请求网站时触发RuntimeError错误求助
Scrapy Shell使用fetch(Request)触发RuntimeError的解决方法
问题场景
使用Scrapy 2.7.1 + Python 3.11在Windows环境下,按以下操作尝试获取https://quotes.toscrape.com/的响应:
- 启动Scrapy Shell:
python -m scrapy shell
- 在Shell中手动构造Request并执行fetch:
>>> from scrapy import Request >>> req = Request("https://quotes.toscrape.com/") >>> fetch(req)
执行后出现核心报错:
RuntimeError: There is no current event loop in thread 'Thread-1 (start)'.
同时伴随协程未await的警告:
RuntimeWarning: coroutine 'SpiderMiddlewareManager.scrape_response.<locals>.process_callback_output' was never awaited
虽然日志显示请求已返回200,但无法通过response变量访问响应内容。
原因分析
这是Python 3.11与Scrapy 2.7.x版本的兼容性问题:Python 3.11对asyncio事件环的线程绑定逻辑做了调整,而Scrapy 2.7.x的deferred_from_coro方法在多线程场景下无法正确获取当前事件环,导致触发报错。
解决方案
方案1:使用Scrapy Shell推荐的快捷fetch方式
不需要手动构造Request,直接传入URL调用fetch,内部会自动处理事件环问题:
>>> fetch("https://quotes.toscrape.com/")
执行后即可通过response变量访问响应内容,比如输入response.status会返回200,view(response)可在浏览器中查看页面。
方案2:降级Python版本到3.10
如果必须使用手动构造Request的方式,将Python版本降级到3.10,该版本与Scrapy 2.7.x的兼容性更好,不会出现事件环相关报错。
方案3:升级Scrapy到2.8及以上版本
Scrapy 2.8及后续版本已修复了Python 3.11的兼容性问题,升级后手动构造Request的方式可正常工作。执行以下命令升级:
pip install --upgrade scrapy
内容的提问来源于stack exchange,提问作者Shishir Sabbir
相关产品推荐
相关产品推荐

