温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Scrapy run 2 spiders with outputs to 2 different files using one process (AWS Lambda)
aws-lambda python scrapy twisted

python - Scrapy使用一个进程运行2个Spider,并输出到2个不同的文件(AWS Lambda)

发布于 2020-03-29 13:16:37

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

文档看起来他们已经有了一个非常接近的解决方案:

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蜘蛛(他们不具备在同一时间运行)的一个过程,并让它们输出到单独的文件?

查看更多

查看更多

提问者
Jamie
被浏览
131
Jamie 2020-02-01 00:18

多亏了Corentin和本指南,我才能够使它正常工作。

通过custom_settings为蜘蛛创建单独的类属性,我可以将它们运行起来CrawlerProcess,而不必担心,因为它们分别具有自己的文件输出。

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

为了确保避免发生该错误我还不得不使用from multiprocessing.context import Process和使用一个try块来终止该进程(甚至在分配它之前!)ReactorNotRestartable