使用 Google Cloud Functions 时,ReactorNotRestartable 与 scrapy

Joh*_*ews 3 python scrapy google-cloud-platform google-cloud-functions

我正在尝试使用 Google Cloud Functions 发送多个抓取请求。但是,我似乎收到了错误ReactorNotRestartable。从 StackOverflow 上的其他帖子(例如这篇文章)中,我了解到这是因为无法重新启动反应器,特别是在执行循环时。

解决这个问题的方法是把start()for循环放在外面。但是,对于云功能,这是不可能的,因为每个请求在技术上都应该是独立的。

是否以CrawlerProcess某种方式使用 Cloud Functions 进行缓存?如果是这样,我们如何消除这种行为。

例如,我尝试将导入和初始化过程放在函数内部而不是外部,以防止缓存导入,但这不起作用:

# main.py

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

    process.crawl(MySpider)
    process.start()
Run Code Online (Sandbox Code Playgroud)

Dus*_*ram 5

默认情况下,异步特性scrapy不能很好地与云函数配合使用,因为我们需要一种方法来阻止爬行,以防止函数提前返回并在进程终止之前终止实例。

相反,我们可以使用scrapydo以阻塞方式运行现有的蜘蛛:

requirements.txt:

scrapydo
Run Code Online (Sandbox Code Playgroud)

main.py:

scrapydo
Run Code Online (Sandbox Code Playgroud)

这还展示了一个简单的示例,说明如何scrapy.Item从蜘蛛中产生一个或多个并从爬行中收集结果,如果不使用,这也将具有挑战性scrapydo

另外:确保您的项目启用了计费功能。默认情况下,Cloud Functions 无法发出出站请求,爬虫会成功,但不返回任何结果。