Scrapy爬虫报错:'EPollReactor'对象无'_handleSignals'属性求解决
问题解决:Scrapy运行报错
'EPollReactor' object has no attribute '_handleSignals' 这个错误是Twisted与Scrapy版本不兼容导致的:EPollReactor是Twisted的IO反应器组件,新版本Twisted可能移除了_handleSignals方法,而当前使用的Scrapy版本未适配该变化。
解决步骤:
- 先查看当前安装的Twisted和Scrapy版本:
pip list | grep -E "Twisted|Scrapy" - 方案一:降级Twisted到兼容版本(比如22.10.0,该版本与多数Scrapy版本适配):
pip install twisted==22.10.0 --force-reinstall - 方案二:升级Scrapy到最新稳定版,适配新版本Twisted:
pip install --upgrade scrapy
额外代码优化建议:
你的代码直接在parse方法中修改全局DataFramedf存在线程安全风险(Scrapy是异步框架,多请求同时修改df可能导致数据混乱),建议改用Scrapy的Item Pipeline处理数据存储:
- 定义Item类:
import scrapy class ContentItem(scrapy.Item): index = scrapy.Field() content = scrapy.Field() - 修改Spider的
parse方法:def parse(self, response): index = response.meta['Index'] content = ''.join(response.css('p::text').extract()) yield ContentItem(index=index, content=content) - 编写Pipeline保存到DataFrame:
class DataFramePipeline: def open_spider(self, spider): self.items = [] def process_item(self, item, spider): self.items.append({'Index': item['index'], 'Content': item['content']}) return item def close_spider(self, spider): global df for item in self.items: df.loc[item['Index'], 'Content'] = item['content'] - 在settings.py中启用Pipeline:
ITEM_PIPELINES = { 'your_project_name.pipelines.DataFramePipeline': 300, }
内容的提问来源于stack exchange,提问作者Yến Phan
相关产品推荐
相关产品推荐

