Scrapy学习过程之四:Feed Export

本文介绍了Scrapy的数据导出流程,包括Serialization formats如JSON、CSV等,Storages如Local Filesystem、FTP、S3,并详细讲解了FEED_URI、FEED_FORMAT等设置参数,以及如何自定义存储后端和序列化方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://docs.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports

整体架构图:

Scrapy architecture

SPIDER提取出的数据是dict,从上图可以看出,会将这些数据发送给ENGINE,然后ENGINE再将数据交给ITEM PIPELINES。

Serialization formats

Scrapy提供了几种内置的方法,能将dict转换成常见的数据格式,开箱即用。

  • JSON
  • JSON Line
  • CSV
  • XML

以上是Scrapy内置的序列化dict的方法,开发者也可以通过设置FEED_EXPORTERS进行自定义扩展,稍后展开,这个东西就是设置一个开发者自己实现的一个EXPORTER。

Storages

格式转换有了,接下来就是把转换好的数据存放在什么地方的问题。Scrapy通过设置一个URI指定,参数是FEED_URL,稍后展开。

Scrapy支持的内置存储后端类型:

  • Local Filesystem
  • FTP
  • S3
  • Standard Output

有些存储后端需要另外安装依赖包,如S3需要安装botocore与boto。

Storage URI parameters

设置存储后端的URI可以包含可替换点位符,当真正写数

V2025-03-18 15:57:52 [scrapy.utils.log] INFO: Scrapy 2.11.2 started (bot: weibo) 2025-03-18 15:57:52 [scrapy.utils.log] INFO: Versions: lxml 5.3.1.0, libxml2 2.11.7, cssselect 1.2.0, parsel 1.9.1, w3lib 2.2.1, Twisted 24.11.0, Python 3.8.5 (t ags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)], pyOpenSSL 25.0.0 (OpenSSL 3.4.1 11 Feb 2025), cryptography 44.0.1, Platform Windows-10-10.0.22621-SP0 2025-03-18 15:57:52 [weibo_comment] INFO: Reading start URLs from redis key 'weibo_comment:start_urls' (batch size: 16, encoding: utf-8) 2025-03-18 15:57:52 [scrapy.addons] INFO: Enabled addons: [] 2025-03-18 15:57:52 [asyncio] DEBUG: Using selector: SelectSelector 2025-03-18 15:57:52 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor 2025-03-18 15:57:52 [scrapy.utils.log] DEBUG: Using asyncio event loop: asyncio.windows_events._WindowsSelectorEventLoop 2025-03-18 15:57:52 [scrapy.extensions.telnet] INFO: Telnet Password: ed3efe598fe58086 2025-03-18 15:57:52 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats'] 2025-03-18 15:57:52 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'weibo', 'DOWNLOAD_DELAY': 2, 'DUPEFILTER_CLASS': 'scrapy_redis.dupefilter.RFPDupeFilter', 'FEED_EXPORT_ENCODING': 'utf-8', 'NEWSPIDER_MODULE': 'weibo.spiders', 'REQUEST_FINGERPRINTER_IMPLEMENTATION': '2.7', 'ROBOTSTXT_OBEY': True, 'SCHEDULER': 'scrapy_redis.scheduler.Scheduler', 'SPIDER_MODULES': ['weibo.spiders'], 'TWISTED_REACTOR': 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'} Unhandled error in Deferred: 2025-03-18 15:57:52 [twisted] CRITICAL: Unhandled error in Deferred: Traceback (most recent call last): File "e:\python\lib\site-packages\twisted\internet\defer.py", line 2017, in _inlineCallbacks result = context.run(gen.send, result) File "e:\python\lib\site-packages\scrapy\crawle
最新发布
03-19
<think>好的,用户遇到了Scrapy运行时的“Unhandled error in Deferred”错误,需要解决这个问题。根据提供的引用内容,我需要分析可能的原因,并提供对应的解决方案。 首先,用户提供的引用中有多个可能的原因。引用[5]提到缺少sqlite模块,用户尝试导入后发现问题,所以这可能是一个常见原因。另外,引用[3]指出可能是Twisted模块中的请求队列排序错误或pywin32版本问题。引用[2]提到在修复PyCharm提示的问题后,init文件被修改,可能导入了不必要的模块。引用[4]的代码示例中使用了一个循环调用crawl并可能未正确处理异步操作,可能导致资源暂时不可用。引用[1]则提到了pipeline模块的导入错误,可能是settings中的配置问题。 接下来,我需要将这些可能的原因整理成结构化的步骤,每个步骤对应一个解决方法。需要确保用户能够逐步排查,从简单到复杂。例如,先检查Python环境是否缺少sqlite模块,然后检查pipelines.py的设置是否正确,再查看是否有不正确的循环调用或异步处理问题,最后处理可能的包版本冲突。 另外,需要确保用户正确安装相关依赖,如pywin32,以及检查Scrapy项目的配置是否正确,比如ITEM_PIPELINES的设置是否存在拼写错误或未正确导入模块。同时,在代码结构方面,引用[4]中的示例可能使用了reactor.run()和循环调用的方式,这可能导致资源问题,需要建议用户使用CrawlerProcess代替CrawlerRunner,并正确管理reactor的运行。 最后,可能需要提醒用户注意环境变量或路径问题,特别是在使用Anaconda或其他虚拟环境时,确保所有依赖包版本兼容,并且正确安装了sqlite等必要的模块。 总结可能的解决方案步骤: 1. 检查并安装sqlite模块。 2. 检查pipelines.py和settings.py中的配置是否正确。 3. 确保正确使用CrawlerProcess和reactor,避免循环中的资源问题。 4. 安装或更新pywin32包。 5. 检查环境中的包版本兼容性,尤其是Twisted和Scrapy的版本。 需要将这些步骤用清晰的中文解释,帮助用户一步步排查问题,并引用相关的引用内容作为支持依据。</think>针对Scrapy运行中出现的`CRITICAL: Unhandled error in Deferred`错误,以下是逐步排查与解决方案: --- ### **1. 检查Python环境依赖** #### 1.1 确认SQLite模块正常 部分系统可能未正确安装SQLite支持库,尝试在Python中手动导入测试: ```python import sqlite3 ``` 若报错,需安装SQLite开发包: - **Ubuntu/Debian**:`sudo apt-get install libsqlite3-dev` - **Windows**:通过Anaconda或Python安装包重新安装Python环境[^5] #### 1.2 安装pywin32(仅Windows) Windows环境下需安装匹配的`pywin32`版本: ```bash pip install pywin32==303 # 指定兼容版本 ``` --- ### **2. 排查Scrapy项目配置** #### 2.1 检查`pipelines.py`引用 确保`settings.py`中未错误引用不存在的Pipeline类: ```python ITEM_PIPELINES = { 'myproject.pipelines.MyPipeline': 300, # 确认类名和路径正确 } ``` 若未使用Pipeline,直接注释掉该配置[^1][^2]。 #### 2.2 清理`__init__.py`冗余代码 删除自定义脚本(如`runner.py`)中重复导入或冗余代码,避免干扰Scrapy内部机制[^4]。 --- ### **3. 修正异步调用逻辑** #### 3.1 避免循环调用与reactor冲突 错误示例中使用了`while True`循环和手动控制reactor,易导致资源冲突: ```python # 错误写法(引用[4]) def crawl(): while True: yield runner.crawl('spider_name') time.sleep(300) reactor.stop() ``` **正确写法**:使用`CrawlerProcess`替代`CrawlerRunner`,并遵循Twisted单reactor原则: ```python from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings process = CrawlerProcess(get_project_settings()) process.crawl('spider_name') process.start() # 自动管理reactor,无需手动调用 ``` --- ### **4. 检查包版本兼容性** 更新关键依赖至兼容版本: ```bash pip install --upgrade twisted scrapy pyopenssl ``` - **Twisted**建议版本≥20.3.0 - **Scrapy**建议版本≥2.5.0 --- ### **5. 查看完整错误堆栈** 启用Scrapy详细日志定位具体错误: ```bash scrapy crawl spider_name --loglevel=DEBUG ``` 重点关注堆栈中首次报错位置,如数据库连接、请求队列等[^3]。 --- ### **相关问题** 1. 如何避免Scrapy中的`Deferred`异步错误? 2. Scrapy项目中`CrawlerProcess`和`CrawlerRunner`有什么区别? 3. 如何调试Scrapy的`ImportError`问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值