Scrapy: запуск одного паука, затем использование собранной информации для запуска другого паука - PullRequest
0 голосов
/ 17 июня 2019

В документах Scrapy приведен пример запуска нескольких пауков:

process = CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start()

Однако проблема в том, что я хочу запустить Spider1, проанализировать данные, а затем использовать извлеченные данные для запуска Spider2. Если я сделаю что-то вроде:

process.crawl(MySpider1)
process.start()
parse_data_from_spider1()
pass_data_to_spider2_class()

process2.crawl(MySpider2)
process2.start()

Это дает мне страшную ошибку ReactorNotRestartable. Может ли кто-нибудь подсказать мне, как сделать то, что я пытаюсь достичь здесь?

1 Ответ

1 голос
/ 18 июня 2019

Код, который вы используете из документов , запускает несколько пауков в одном и том же процессе с использованием внутреннего API, поэтому возникает проблема, если вам нужно дождаться окончания первого паука, прежде чем запускать второй.

Если это весь охват проблемы, мои предложения будут заключаться в том, чтобы хранить данные первого паука в месте, где его может использовать второй (база данных, csv, jsonlines), и переносить эти данные во второй spider run, либо в определении паука (где определено name, либо если у вас есть подклассы scrapy.Spider, может быть, в __init__) или в методе start_requests().

Затем вам нужно будет запустить пауков последовательно, вы можете увидеть, как CrawlerRunner () связывает отложенный метод в разделе общие практики в документации.

configure_logging()
runner = CrawlerRunner()

@defer.inlineCallbacks
def crawl():
    yield runner.crawl(MySpider1)
    yield runner.crawl(MySpider2)
    reactor.stop()

crawl()
reactor.run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...