代码之家  ›  专栏  ›  技术社区  ›  user3499866

两个蜘蛛完成后如何停止反应器

  •  1
  • user3499866  · 技术社区  · 11 年前

    我有这段代码,当两个蜘蛛完成后,程序仍在运行。

    #!C:\Python27\python.exe
    
    from twisted.internet import reactor
    from scrapy.crawler import Crawler
    from scrapy import log, signals
    from carrefour.spiders.tesco import TescoSpider
    from carrefour.spiders.carr import CarrSpider
    from scrapy.utils.project import get_project_settings
    import threading
    import time
    
    def tescofcn():
        tescoSpider = TescoSpider()
        settings = get_project_settings()
        crawler = Crawler(settings)
        crawler.configure()
        crawler.crawl(tescoSpider)
        crawler.start()
    
    def carrfcn():
        carrSpider = CarrSpider()
        settings = get_project_settings()
        crawler = Crawler(settings)
        crawler.configure()
        crawler.crawl(carrSpider)
        crawler.start()
    
    
    t1=threading.Thread(target=tescofcn)
    t2=threading.Thread(target=carrfcn)
    
    t1.start()
    t2.start()
    log.start()
    reactor.run()
    

    当我尝试将此插入两个函数时

    crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
    

    ,对于两种蜘蛛来说,速度更快的蜘蛛和速度较慢的蜘蛛都被终止了,尽管他没有完成。

    1 回复  |  直到 11 年前
        1
  •  1
  •   marven    11 年前

    您可以做的是创建一个函数,检查运行的蜘蛛列表,并将其连接到 singals.spider_closed .

    from scrapy.utils.trackref import iter_all
    
    
    def close_reactor_if_no_spiders():
        running_spiders = [spider for spider in iter_all('Spider')]
    
        if not running_spiders:
            reactor.stop()
    
    crawler.signals.connect(close_reactor_if_no_spiders, signal=signals.spider_closed)
    

    虽然,我仍然建议使用 scrapyd 以管理运行多个蜘蛛。