修改ROBOTSTXT_OBEY后依然报错AttributeError: 'AsyncioSelectorReactor' object has no attribute '_handleSignals'
时间: 2025-02-17 19:17:38 浏览: 42
### 解决Scrapy项目中的`ROBOTSTXT_OBEY`配置引发的AttributeError
当设置 `ROBOTSTXT_OBEY=True` 后,在某些情况下可能会遇到如下错误:
```plaintext
AttributeError: 'AsyncioSelectorReactor' object has no attribute '_handleSignals'
```
此问题通常发生在使用 Twisted 的异步事件循环(如 AsyncioSelectorReactor)时,而 Scrapy 默认使用的反应堆并不支持 `_handleSignals` 属性[^1]。
为了修复这个问题,建议采取以下措施之一:
#### 方法一:禁用Twisted的信号处理机制
可以在项目的 settings.py 文件中添加或修改下列选项来阻止 Twisted 尝试安装其默认的信号处理器:
```python
REACTOR_THREADPOOL_MAXSIZE = 20
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
ASYNCIO_EVENT_LOOP = "asyncio.DefaultEventLoopPolicy"
# 禁用 Twisted 自动注册 SIGCHLD 处理器
import os
os.environ['SCRAPEX_NO_SIGCHLD'] = '1'
```
这种方法通过环境变量防止 Twisted 安装它自己的 SIGCHLD 处理程序,从而绕过了该属性缺失所引起的异常情况。
#### 方法二:切换回默认的选择器反应堆
如果不需要特定的功能依赖于 asyncio,则可以选择不使用 `AsyncioSelectorReactor` 而改用 Twisted 提供的标准选择器反应堆。只需移除任何关于自定义反应堆的相关设定即可恢复到默认状态。
```python
# 移除这些行或者将其注释掉
# TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
```
这样做之后,Scrapy 应能正常工作并遵循 robots.txt 协议而不触发上述提到的那个 AttributeError 错误。
阅读全文
相关推荐

















