Scrapy 运行 2 个蜘蛛,使用一个进程(AWS Lambda)输出到 2 个不同的文件

Scrapy run 2 spiders with outputs to 2 different files using one process (AWS Lambda)

我正在尝试 运行 对 AWS Lambda 函数进行 Scrapy,几乎一切正常,除了我需要 运行 1 函数中的 2 个 lambda。主要问题是我需要 2 个蜘蛛输出到 2 个 不同的 JSON 文件。

docs 看起来他们有一个非常接近的解决方案:

import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider1(scrapy.Spider):
    # Your first spider definition
    ...

class MySpider2(scrapy.Spider):
    # Your second spider definition
    ...

process = CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start()

除了如果我将我的设置输入到 CrawlerProcess 中,就像我现在这样:

CrawlerProcess({
    'FEED_FORMAT': 'json',
    'FEED_URI': '/tmp/fx_today_data.json'
})

那么两个蜘蛛都会输出到一个文件fx_today_data.json

我尝试创建 2 个 CrawlerProcesses,但这给了我 ReactorNotRestartable 错误,我尝试解决 但没有成功。

我也试过 运行 像这样使用 scrapy 代码:

subprocess.call(["scrapy", "runspider", "./spiders/fx_today_data.py", "-o", "/tmp/fx_today_data.json"])

但这会导致找不到通常的 'scrapy' 命令 - 因为我没有在 Lambda 函数中设置 virtualenv(我不知道是否值得为此设置一个?) .

有谁知道如何 运行 2 个 Scrapy 蜘蛛(他们不会 到 运行 同时)在一个进程中并将它们输出到单独的文件?

多亏了 Corentin 和 我才能够让它工作。

通过为蜘蛛单独创建一个 custom_settings class 属性,我可以 运行 它们脱离一个 CrawlerProcess 而不必担心,因为它们各自有自己的文件输出。

最终代码看起来很像我在问题中提供的文档示例。

我最后还不得不使用 from multiprocessing.context import Process 并使用 try 块来终止进程(甚至在它被分配之前!)以确保我会避免 ReactorNotRestartable错误。