ReactorNotRestartable со скрапбу при использовании облачных функций Google - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь отправить несколько запросов на сканирование с помощью облачных функций Google. Тем не менее, я, кажется, получаю ошибку ReactorNotRestartable. Из других сообщений на StackOverflow, таких как этот , я понимаю, что это происходит из-за невозможности перезапустить реактор, в частности, при выполнении al oop.

Способ решить эту проблему, поместив start() вне для l oop. Однако с облачными функциями это невозможно, поскольку каждый запрос должен быть технически независимым.

Кешируется ли CrawlerProcess с помощью облачных функций? И если так, как мы можем удалить это поведение.

Я пытался, например, поместить процесс импорта и инициализации внутри функции, а не снаружи, чтобы предотвратить кэширование импорта, но это не сработало:

# main.py

def run_single_crawl(data, context):
    from scrapy.crawler import CrawlerProcess
    process = CrawlerProcess()

    process.crawl(MySpider)
    process.start()

1 Ответ

1 голос
/ 09 апреля 2020

По умолчанию асинхронный характер scrapy не будет хорошо работать с облачными функциями, так как нам нужен способ блокировки при сканировании, чтобы предотвратить преждевременный возврат функции и остановку экземпляра перед процессом. завершается.

Вместо этого мы можем использовать scrapydo для запуска существующего паука в режиме блокировки:

requirements.txt:

scrapydo

main.py:

import scrapy
import scrapydo

scrapydo.setup()


class MyItem(scrapy.Item):
    url = scrapy.Field()


class MySpider(scrapy.Spider):
    name = "example.com"
    allowed_domains = ["example.com"]
    start_urls = ["http://example.com/"]

    def parse(self, response):
        yield MyItem(url=response.url)


def run_single_crawl(data, context):
    results = scrapydo.run_spider(MySpider)

Здесь также показан простой пример того, как получить один или несколько scrapy.Item от паука и собрать результаты сканирования, что также было бы сложно сделать, если нет используя scrapydo.

Также: убедитесь, что у вас включен биллинг для вашего проекта. По умолчанию облачные функции не могут отправлять исходящие запросы, и сканер будет работать успешно, но не даст результатов.

...