相关疑难解决方法(0)

使用scrapy进行while循环时出现ReactorNotRestartable错误

我得到的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每次创建变量,那么问题是什么?

python twisted scrapy python-2.7

18
推荐指数
4
解决办法
1万
查看次数

使用 Google Cloud Functions 时,ReactorNotRestartable 与 scrapy

我正在尝试使用 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)

python scrapy google-cloud-platform google-cloud-functions

3
推荐指数
1
解决办法
641
查看次数