【问题标题】:scrapy : parallel AND sequential running of spiderscrapy:蜘蛛的并行和顺序运行
【发布时间】:2021-11-11 16:02:36
【问题描述】:

我有一个包含多个蜘蛛的scrapy 项目。有些需要几分钟,有些需要几小时,以及介于两者之间的任何时间 - 但是每次运行所用的时间通常大致相同 - 因此您可以假设刮板 X 的运行时间与刮板 Y 和 Z 一起运行的时间大致相同。

我想要做的不是从 T0 开始并行运行所有,我想在开始时启动刮板 1、2、3,然后在 2 完成后启动刮板 4、5、6 和 7、8 ,9 在 3 完成后平滑下游处理需求(并发数据库连接等)

我认为我需要链接延迟,并且文档中有一些明确的示例,但我不确定如何设置它以及一些并行运行 - 当前的起始代码如下(每​​个蜘蛛都是在它自己的外部文件中)

from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess

setting = get_project_settings()

process = CrawlerProcess(setting)
process.crawl('scraper1')
process.crawl('scraper2')
process.crawl('scraper3')
...etc...
...etc...
process.start()

【问题讨论】:

  • 使用 ScrapyD API,然后启动一个蜘蛛,然后在该蜘蛛的spider_closed 方法中,启动你要运行的下一个蜘蛛
  • ScrapyD 目前不是一个选项 - 我需要遵循相同的“在 python 脚本中启动”方法...有可能吗?

标签: python scrapy twisted


【解决方案1】:

想出答案 - 比我想象的要容易。

无需担心停止反应器(因此将其注释掉)

刮板1和刮板2同时启动,刮板3在刮板2完成后启动。


from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess

setting = get_project_settings()

process = CrawlerProcess(setting)

@defer.inlineCallbacks
def crawl_seq():
    global process

    yield process.crawl('scraper2')
    yield process.crawl('scraper3')
    #reactor.stop()

crawl_seq()
process.crawl('scraper1')

process.start()

【讨论】:

  • 更新:这不太行。刮板完成,但两个顺序运行的状态是“关闭” - 不是“完成”....?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
相关资源
最近更新 更多