Scrapy запускает 2 паука с выходами в 2 разных файла, используя один процесс (AWS Lambda) - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь запустить Scrapy на AWS лямбда-функции, и все почти работает, за исключением того, что мне нужно запустить 2 лямбда-функции в 1-й функции. Основная проблема в том, что мне нужно, чтобы 2 паука выводили в 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' не найдена - потому что у меня нет настройки virtualenv в функции Lambda (Я не знаю, стоит ли его настраивать для этого?).

Кто-нибудь знает, как запустить 2 Scrapy Spider (у них нет для запуска в одно и то же время) в одном процессе и выводить ли их в отдельные файлы?

1 Ответ

0 голосов
/ 31 января 2020

Благодаря Corentin и этому руководству я смог заставить его работать.

Создав индивидуальный атрибут класса custom_settings для пауков, я смог запустить их из одного CrawlerProcess и не нужно беспокоиться, так как они по отдельности имели свои собственные выходные файлы.

Окончательный код очень похож на пример документации, который я привел в вопросе.

Я также вынужден был используйте from multiprocessing.context import Process и используйте блок try, чтобы завершить процесс (еще до того, как он был назначен!), чтобы избежать ошибки ReactorNotRestartable.

...