为了账号安全,请及时绑定邮箱和手机立即绑定

Scrapy: twisted.internet.error.ReactorNotRestar

Scrapy: twisted.internet.error.ReactorNotRestar

哆啦的时光机 2022-08-11 17:40:20
我试图从脚本中运行我的刮擦。我正在使用CramplerProcess,我只有一个蜘蛛可以运行。我已经从这个错误中卡了一段时间,我已经尝试了很多事情来更改设置,但是每次我运行蜘蛛时,我都会得到twisted.internet.error.ReactorNotRestartable我一直在寻找解决这个错误,我相信你只有在尝试多次调用process.start()时才会得到这个错误。但我没有。这是我的代码:import scrapyfrom scrapy.utils.log import configure_loggingfrom scrapyprefect.items import ScrapyprefectItemfrom scrapy.crawler import CrawlerProcessfrom scrapy.utils.project import get_project_settingsclass SpiderSpider(scrapy.Spider):    name = 'spider'    start_urls = ['http://www.nigeria-law.org/A.A.%20Macaulay%20v.%20NAL%20Merchant%20Bank%20Ltd..htm']    def __init__(self, *args, **kwargs):        super().__init__(*args, **kwargs)    def parse(self, response):        item = ScrapyprefectItem()        ...        yield itemprocess = CrawlerProcess(settings=get_project_settings())process.crawl('spider')process.start()错误:Traceback (most recent call last):  File "/Users/pluggle/Documents/Upwork/scrapyprefect/scrapyprefect/spiders/spider.py", line 59, in <module>    process.start()  File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/scrapy/crawler.py", line 309, in start    reactor.run(installSignalHandlers=False)  # blocking call  File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/twisted/internet/base.py", line 1282, in run    self.startRunning(installSignalHandlers=installSignalHandlers)  File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/twisted/internet/base.py", line 1262, in startRunning    ReactorBase.startRunning(self)  File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/twisted/internet/base.py", line 765, in startRunning    raise error.ReactorNotRestartable()twisted.internet.error.ReactorNotRestartable
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

雷纳尔多,

非常感谢 - 你保存了我的项目!

你把我推向了这个想法,这可能是因为你有这个片段,如果脚本在蜘蛛定义的同一个文件中启动该过程。因此,每次 Scrapy 导入您的蜘蛛定义时都会执行它。我不是废料方面的专家,但可能它在内部做了几次,因此我们遇到了这个错误问题。

您的建议完全解决了问题!

另一种方法是将蜘蛛类定义和运行它的脚本分开。可能,这是 Scrapy 假设的方法,这就是为什么在脚本文档中的运行蜘蛛中,它甚至没有提到此检查。__name__

所以我做的是遵循:

  • 在项目根目录中,我有站点文件夹,在其中我有site_spec.py文件。这只是一个实用程序文件,其中包含一些目标站点特定信息(URL结构等)。我在这里提到它只是为了向您展示如何将各种实用程序模块导入到蜘蛛类定义中;

  • 在项目根目录中,我有蜘蛛文件夹,my_spider.py类定义。在该文件中,我导入site_spec.py带有指令的文件:

from sites import site_spec

值得一提的是,运行蜘蛛(您提供的那个)的脚本已从my_spider.py文件的类定义中删除。另外,请注意,我导入了我的site_spec.py文件,其中包含与 run.py 文件相关的路径(见下文),但与类定义文件无关,其中此指令是按照人们的期望发布的(python相对导入,我猜)

  • 最后,在项目根目录中,我有 run.py 文件,从脚本中运行刮擦:

from scrapy.crawler import CrawlerProcess

from spiders.my_spider  import MySpider # this is our friend in subfolder **spiders**

from scrapy.utils.project import get_project_settings


# Run that thing!


process = CrawlerProcess(get_project_settings())

process.crawl(MySpider)

process.start() # the script will block here until the crawling is finished

通过这种设置,我终于能够摆脱这个扭曲的.internet.error.ReactorNotRestartable。


查看完整回答
反对 回复 2022-08-11
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

好。我解决了它。所以我认为,在管道中,当刮刀进入open_spider时,它会再次运行 spider.py,并第二次调用process.start()。

为了解决这个问题,我在蜘蛛中添加了这个,所以process.start()只有在你运行蜘蛛时才会执行:

if __name__ == '__main__':
    process = CrawlerProcess(settings=get_project_settings())
    process.crawl('spider')
    process.start()


查看完整回答
反对 回复 2022-08-11
  • 2 回答
  • 0 关注
  • 498 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号