在上传到 S3 之前,scrapyd 在使用 S3 FEED_URI 时将抓取结果写入何处?

Where does scrapyd write crawl results when using an S3 FEED_URI, before uploading to S3?

我是 运行 一个长期的 运行 网络爬虫,在 Amazon EC2 实例上使用 scrapyd 和 scrapy 1.0.3。我正在使用 spider/settings.py 文件中的这些参数将 jsonlines 文件导出到 S3:

FEED_FORMAT: jsonlines FEED_URI: s3://my-bucket-name

我的 scrapyd.conf 文件将 items_dir 属性 设置为空:

items_dir=

items_dir 属性 设置为空的原因是 scrapyd 不会覆盖蜘蛛设置中的 FEED_URI 属性,它指向一个 s3桶(参见 Saving items from Scrapyd to Amazon S3 using Feed Exporter)。

这在大多数情况下都按预期工作,但我 运行 在一个特别大的爬网中遇到问题:本地磁盘(不是特别大)填满了正在进行的爬网数据在它完全完成之前,因此在结果可以上传到 S3 之前。

我想知道在上传到 S3 之前,是否有任何方法可以配置可以将此抓取的 "intermediate" 结果写入何处?我假设 Scrapy 在内部表示正在进行的爬网数据不完全保存在 RAM 中,而是放在磁盘上的某个地方,如果是这种情况,我想将该位置设置为具有足够 space 在将完成的 .jl 文件发送到 S3 之前保存结果。为 "items_dir" 指定一个值可防止 scrapyd 在完成时自动将结果上传到 s3。

S3 提要存储选项继承自 BlockingFeedStorage,后者本身使用 TemporaryFile(prefix='feed-')(来自临时文件模块)

The default directory is chosen from a platform-dependent list

您可以子类化 S3FeedStorage 并将 open() 方法重写为 return 来自其他地方的临时文件而不是默认值,例如使用 dir 参数 tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])