我正在尝试在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蜘蛛(他们不具备在同一时间运行)的一个过程,并让它们输出到单独的文件?
多亏了Corentin和本指南,我才能够使它正常工作。
通过custom_settings
为蜘蛛创建单独的类属性,我可以将它们运行起来CrawlerProcess
,而不必担心,因为它们分别具有自己的文件输出。
最终代码看起来很像我在问题中提供的docs示例。
为了确保避免发生该错误,我还不得不使用from multiprocessing.context import Process
和使用一个try
块来终止该进程(甚至在分配它之前!)ReactorNotRestartable
。