使用Google Cloud Functions时ReactorNotRestartable出现刮擦
问题内容:
我正在尝试使用Google Cloud
Functions发送多个爬网请求。但是,我似乎正在得到ReactorNotRestartable
错误。从StackOverflow上其他职位,如这一个,据我所知,这是以因为它是不可能做一个循环何时重启反应堆,尤其如此。
解决此问题的方法是将start()
for循环置于外部。但是,对于Cloud Functions,这是不可能的,因为每个请求在技术上都应该独立。
CrawlerProcess
云功能是否以某种方式缓存了?如果是这样,我们如何消除这种行为。
例如,我尝试将导入和初始化过程放在函数内部而不是外部,以防止缓存导入,但这没有用:
# main.py
def run_single_crawl(data, context):
from scrapy.crawler import CrawlerProcess
process = CrawlerProcess()
process.crawl(MySpider)
process.start()
问题答案:
默认情况下,的异步性质scrapy
无法与Cloud
Functions一起很好地工作,因为我们需要一种阻止爬网的方法,以防止该函数过早返回,并防止该实例在进程终止之前被杀死。
相反,我们可以使用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
。
另外:请确保您已为项目启用结算。默认情况下,Cloud Functions无法发出出站请求,并且搜寻器将成功执行,但不返回任何结果。