我得到的twisted.internet.error.ReactorNotRestartable错误,当我执行下面的代码:
from time import sleep
from scrapy import signals
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy.xlib.pydispatch import dispatcher
result = None
def set_result(item):
result = item
while True:
process = CrawlerProcess(get_project_settings())
dispatcher.connect(set_result, signals.item_scraped)
process.crawl('my_spider')
process.start()
if result:
break
sleep(3)
Run Code Online (Sandbox Code Playgroud)
它第一次起作用,然后我得到错误.我process每次创建变量,那么问题是什么?
我正在尝试使用 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)