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
错误。
我正在尝试 运行 对 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
错误。