我正在积极开发70多种蜘蛛的Scrapy项目,我想定期运行(每日/每周),大约有4只蜘蛛并发运行,能够单独停止,启动和监控蜘蛛。
我已经排除了使用ScrapyD的原因,因为它增加了我已经拥有的复杂程度,并且需要部署一个新的鸡蛋,即使对项目的任何部分进行小的改动也是如此。
这个问题here的更一般版本使用命令行接受了答案:
$ scrapy list | xargs -P 4 -n 1 scrapy crawl
这是一个非常好的解决方案,但需要通过bash shell工作,这看起来很笨拙,并且一旦运行就无法以编程方式停止或与蜘蛛交互。我希望尽可能保持简单,最好不要离开我的Python IDE。我还需要能够从这个队列中停止,添加或删除一个蜘蛛,而不是在单独的bash窗口中完成或完全重新开始。
我很困惑为什么在文档中没有明确的方法可以解决这个问题。查看相似但不完全相同的问题here,here和here,答案主要指向ScrapyD或单独启动单独的Twisted反应堆,这似乎很复杂且可能容易出错。
使用CrawlSpider,我知道我可以做类似的事情:
from scrapy.spiderloader import SpiderLoader
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess
settings = get_project_settings()
crawler = SpiderLoader.from_settings(settings)
spiders= SpiderLoader.list(crawler)
process = CrawlerProcess(settings)
def run_all_spiders():
for spider in spiders:
process.crawl(spider)
process.start()
run_all_spiders()
但是这似乎尝试在每分钟运行所有蜘蛛时调整process.start()并停止处理进一步的代码直到完成。 只使用python,是否有办法将许多蜘蛛排入队列,以便同时运行一定数量的蜘蛛,仍可控制它们?