【问题标题】:How to call particular Scrapy spiders from another Python script如何从另一个 Python 脚本调用特定的 Scrapy 蜘蛛
【发布时间】:2013-06-08 00:27:02
【问题描述】:

我有一个名为 algorithm.py 的脚本,我希望能够在脚本期间调用 Scrapy 蜘蛛。文件结构为:

算法.py 我的蜘蛛/

其中 MySpiders 是一个包含多个scrapy 项目的文件夹。我想创建方法 perform_spider1()、perform_spider2()... 我可以在 algorithm.py 中调用。

我该如何构造这个方法?

我已经设法使用以下代码调用了一只蜘蛛,但是,它不是一种方法,它只适用于一只蜘蛛。我是需要帮助的初学者!

import sys,os.path
sys.path.append('path to spider1/spider1')
from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy.settings import Settings
from scrapy import log, signals
from scrapy.xlib.pydispatch import dispatcher
from spider1.spiders.spider1_spider import Spider1Spider

def stop_reactor():
    reactor.stop()

dispatcher.connect(stop_reactor, signal=signals.spider_closed)

spider = RaListSpider()
crawler = Crawler(Settings())
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
log.msg('Running reactor...')
reactor.run() # the script will block here
log.msg('Reactor stopped.')

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    只需通过调用configurecrawlstart 来检查你的蜘蛛并设置它们,然后再调用log.start()reactor.run()。而且scrapy会在同一个进程中运行多个spider。

    有关详细信息,请参阅 documentationthis thread

    另外,考虑通过scrapyd 运行你的蜘蛛。

    希望对您有所帮助。

    【讨论】:

    • 谢谢,alecxe!在最后一个蜘蛛之后如何停止反应堆?目前我正在使用 def stop_reactor(): reactor.stop() dispatcher.connect(stop_reactor, signal=signals.spider_closed) 但是,这在第一个蜘蛛之后停止......
    • 不客气。好问题!手动跟踪stop_reactor 中关闭的蜘蛛并在所有都关闭时停止反应器怎么样?顺便说一句,我已经编辑了答案并包含了相关主题的链接。
    • 谢谢,伙计。我没有足够的声望给你投票,但我在道德上给你投票:)
    • 如果蜘蛛在完全不同的目录中怎么办?这种方法还能用吗?
    • @PrakharMohanSrivastava 只要蜘蛛是可导入的 - 它也应该可以工作。
    【解决方案2】:

    根据 alecxe 的建议,这里有一个可能的解决方案。

    import sys,os.path
    sys.path.append('/path/ra_list/')
    sys.path.append('/path/ra_event/')
    from twisted.internet import reactor
    from scrapy.crawler import Crawler
    from scrapy.settings import Settings
    from scrapy import log, signals
    from scrapy.xlib.pydispatch import dispatcher
    from ra_list.spiders.ra_list_spider import RaListSpider
    from ra_event.spiders.ra_event_spider import RaEventSpider
    
    spider_count = 0
    number_of_spiders = 2
    
    def stop_reactor_after_all_spiders():
        global spider_count
        spider_count = spider_count + 1
        if spider_count == number_of_spiders:
            reactor.stop()
    
    
    dispatcher.connect(stop_reactor_after_all_spiders, signal=signals.spider_closed)
    
    def crawl_resident_advisor():
    
        global spider_count
        spider_count = 0
    
        crawler = Crawler(Settings())
        crawler.configure()
        crawler.crawl(RaListSpider())
        crawler.start()
    
        crawler = Crawler(Settings())
        crawler.configure()
        crawler.crawl(RaEventSpider())
        crawler.start()
    
        log.start()
        log.msg('Running in reactor...')
        reactor.run() # the script will block here
        log.msg('Reactor stopped.')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多