Как указать разные настройки процесса для двух разных пауков в CrawlerProcess Scrapy? - PullRequest
1 голос
/ 18 июня 2020

У меня есть два паука, которые я хочу запустить параллельно . Я использовал экземпляр CrawlerProcess и его метод crawl, чтобы добиться этого. Однако я хочу указать разные выходные файлы , ie FEED_URI для каждого паука в одном процессе . Я попытался l oop пауков и запустить их, как показано ниже. Хотя генерируются два разных файла вывода, процесс завершается, как только второй паук завершает выполнение . Если первый паук завершит сканирование раньше второго, я получу желаемый результат. Однако, если второй паук заканчивает ползать первым, он не дожидается завершения первого паука. Как я могу это исправить?

from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess

setting = get_project_settings()
process = CrawlerProcess(setting)

for spider_name in process.spider_loader.list():
    setting['FEED_FORMAT'] = 'json'
    setting['LOG_LEVEL'] = 'INFO'
    setting['FEED_URI'] = spider_name+'.json'
    setting['LOG_FILE'] = spider_name+'.log'
    process = CrawlerProcess(setting)
    print("Running spider %s" % spider_name)
    process.crawl(spider_name)

process.start()
print("Completed")

1 Ответ

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

Согласно scrapy docs использование одного CrawlerProcess для нескольких пауков должно выглядеть так:

import scrapy
from scrapy.crawler import CrawlerProcess

class Spider1(scrapy.Spider):
    ...

class Spider2(scrapy.Spider):
    ...

process = CrawlerProcess()
process.crawl(Spider1)
process.crawl(Spider2)
process.start()

настройка .. настройки для каждого паука могут быть выполнены с помощью custom_settings атрибут паука

Scrapy имеет группу модулей, которые нельзя установить для каждого паука (только для CrawlerProcess).

модулей, которые используют настройки, связанные с ведением журнала, SpiderLoader и twisted Reactor - уже инициализированы до того, как Scrapy прочитает паук custom_settings.

Когда вы вызываете scrapy crawl .... из инструмента командной строки - фактически вы создаете single CrawlerProcess для одиночного паука, определенного в аргументах команды.

процесс завершается, как только завершает выполнение второй паук.

Если вы использовали те же версии пауков, которые ранее были запущены scrapy crawl..., этого не ожидается.

...