Scrapy运行2个蜘蛛,使用一个进程将输出到2个不同的文件(AWS Lambda)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scrapy运行2个蜘蛛,使用一个进程将输出到2个不同的文件(AWS Lambda)相关的知识,希望对你有一定的参考价值。
我正在尝试在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不能同时运行)并将它们输出到单独的文件吗?
感谢Corentin和this guide,,我能够使它正常工作。
通过分别为蜘蛛创建一个custom_settings
类属性,我可以将它们从一个CrawlerProcess
中运行,而不必担心,因为它们分别具有自己的文件输出。
最终代码看起来很像我在问题中提供的docs示例。
为了确保避免出现from multiprocessing.context import Process
错误,我还不得不使用try
并使用ReactorNotRestartable
块终止进程(甚至在分配它之前!)。
以上是关于Scrapy运行2个蜘蛛,使用一个进程将输出到2个不同的文件(AWS Lambda)的主要内容,如果未能解决你的问题,请参考以下文章