2 回答

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。

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()
添加回答
举报