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

问题描述 投票:0回答:1

我正在尝试在AWS Lambda函数上运行Scrapy,并且几乎一切正常,除了我需要在1个函数中运行2个lambda。主要问题是我需要2个Spider才能输出到2个different 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错误,我尝试解决using this thread但没有成功。

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

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

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

有人知道如何在一个进程中运行2个Scrapy Spiders(它们have不能同时运行)并将它们输出到单独的文件吗?

python aws-lambda scrapy twisted
1个回答
0
投票

感谢Corentin和this guide,,我能够使它正常工作。

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

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

为了确保避免出现from multiprocessing.context import Process错误,我还不得不使用try并使用ReactorNotRestartable块终止进程(甚至在分配它之前!)。

© www.soinside.com 2019 - 2024. All rights reserved.