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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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)

它第一次起作用,然后我得到错误。我每次创建process变量,那么问题是什么?

答案

默认情况下,CrawlerProcess.start()将在所有爬虫完成后停止它创建的扭曲反应堆。

如果在每次迭代中创建process.start(stop_after_crawl=False),则应调用process

另一种选择是自己处理Twisted反应器并使用CrawlerRunnerThe docs have an example这样做。

另一答案

我能够像这样解决这个问题。 process.start()应该只召唤一次。

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()
另一答案

参考http://crawl.blog/scrapy-loop/

 import scrapy
 from scrapy.crawler import CrawlerProcess
 from scrapy.utils.project import get_project_settings     
 from twisted.internet import reactor
 from twisted.internet.task import deferLater

 def sleep(self, *args, seconds):
    """Non blocking sleep callback"""
    return deferLater(reactor, seconds, lambda: None)

 process = CrawlerProcess(get_project_settings())

 def _crawl(result, spider):
    deferred = process.crawl(spider)
    deferred.addCallback(lambda results: print('waiting 100 seconds before 
    restart...'))
    deferred.addCallback(sleep, seconds=100)
    deferred.addCallback(_crawl, spider)
    return deferred


_crawl(None, MySpider)
process.start()

以上是关于使用scrapy进行while循环时出现ReactorNotRestartable错误的主要内容,如果未能解决你的问题,请参考以下文章

使用循环将信息流传递给setter时出现运行时错误

从数组中删除重复项时出现超出范围异常

使用scrapy crawl name启动一个爬虫时出现的问题

Scrapy:在干净的蟒蛇环境中安装时出现问题

在 React/Express 中使用 PassportJS 进行 Google OAuth 时出现 CORS 错误

使用 React-testing-library 进行测试时出现 Next.js 路由器错误