在Scrapy文档中,他们给出的运行多个蜘蛛的示例如下:
process = CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start()
但是,问题是我想运行Spider1,解析数据,然后使用提取的数据运行Spider2。如果我做类似的事情:
process.crawl(MySpider1)
process.start()
parse_data_from_spider1()
pass_data_to_spider2_class()
process2.crawl(MySpider2)
process2.start()
它给了我可怕的ReactorNotRestartable错误。有人可以指导我如何做我在这里想要实现的目标吗?
答案 0 :(得分:1)
您从the docs使用的代码使用内部API在同一进程中运行多个蜘蛛,因此如果您需要等待第一个蜘蛛完成然后再启动第二个蜘蛛,就会出现问题。
如果这是问题的全部范围,我的建议是将第一个蜘蛛的数据存储在第二个蜘蛛可以使用的地方(数据库,csv,jsonlines),然后将数据带入第二个蜘蛛可以在“蜘蛛”定义(其中定义了name
,或者如果您有scrapy.Spider的子类,可能在__init__
中)或在start_requests()
方法中进行蜘蛛运行。 / p>
然后,您必须顺序运行Spider,您可以在文档的common practices部分中看到CrawlerRunner()链接延迟方法。
configure_logging()
runner = CrawlerRunner()
@defer.inlineCallbacks
def crawl():
yield runner.crawl(MySpider1)
yield runner.crawl(MySpider2)
reactor.stop()
crawl()
reactor.run()