Вызов Scrapy из другого файла без потоковой передачи

Мне нужно вызвать искателя из другого файла python, для которого я использую следующий код.

def crawl_koovs():
    spider = SomeSpider()
    settings = get_project_settings()
    crawler = Crawler(settings)
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
    crawler.configure()
    crawler.crawl(spider)
    crawler.start()
    log.start()
    reactor.run()

При выполнении этого я получаю ошибку как

exceptions.ValueError: signal only works in main thread

Единственным обходным решением, которое я смог найти, является использование

reactor.run(installSignalHandlers=False)

который я не хочу использовать, поскольку я хочу вызвать этот метод несколько раз и хочу, чтобы реактор был остановлен до следующего вызова. Что я могу сделать, чтобы сделать эту работу (возможно, заставить искателя начать в том же "основном" потоке)?

Ответ 1

Первое, что я хотел бы сказать вам, - это когда вы выполняете Scrapy из внешнего файла, для уровня log установлено значение INFO, вы должны изменить его на DEBUG, чтобы узнать, что происходит, если ваш код не работает, t work

вы должны изменить строку:

 log.start()

для

log.start(loglevel=log.DEBUG)

Чтобы сохранить все в журнале и сгенерировать текстовый файл (для целей отладки), вы можете:

log.start(logfile="file.log", loglevel=log.DEBUG, crawler=crawler, logstdout=False)

О проблемах с уровнем журнала, измененным на DEBUG, может быть, вы можете увидеть какой-то вывод, который поможет вам его исправить, вы можете попытаться поместить ваш script в папку Scrapy Project, чтобы увидеть, все еще сбой.

Если вы измените строку:

crawler.signals.connect(reactor.stop, signal=signals.spider_closed)

для

dispatcher.connect(reactor.stop, signals.spider_closed)

Что он говорит?

В зависимости от вашей версии Scrapy она может быть устаревшей