使用谷歌云功能时,可使用scrapy进行ReactorNotRestartable

2024-04-19 19:47:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用谷歌云功能发送多个爬网请求。然而,我似乎得到了ReactorNotRestartable错误。从StackOverflow的其他帖子,比如this one,我理解这是因为不可能重新启动反应器,特别是在执行循环时

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

CrawlerProcess是否以某种方式使用云函数进行缓存?如果是这样,我们如何才能消除这种行为

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

# main.py

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

    process.crawl(MySpider)
    process.start()

Tags: 方法函数功能for错误thisstackoverflowprocess
2条回答

您可以简单地按顺序爬行蜘蛛

main.py

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

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

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

相反,我们可以使用^{}以阻塞方式运行现有的spider:

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,这也是一个挑战

另外:确保您的项目已启用计费功能。默认情况下,云函数不能发出出站请求,爬虫程序将成功,但不会返回任何结果

相关问题 更多 >