【问题标题】:Scrapy: How to manually insert a request from a spider_idle event callback?Scrapy:如何手动插入来自 spider_idle 事件回调的请求?
【发布时间】:2013-06-06 19:01:24
【问题描述】:

我创建了一个蜘蛛,并将一个方法链接到 spider_idle 事件。

如何手动添加请求?我不能只从 parse 中返回项目——在这种情况下 parse 没有运行,因为所有已知的 URL 都已被解析。我有一个生成新请求的方法,我想从 spider_idle 回调中运行它以添加创建的请求。

class FooSpider(BaseSpider):
    name = 'foo'

    def __init__(self):
        dispatcher.connect(self.dont_close_me, signals.spider_idle)

    def dont_close_me(self, spider):
        if spider != self:
            return
        # The engine instance will allow me to schedule requests, but
        # how do I get the engine object?
        engine = unknown_get_engine()
        engine.schedule(self.create_request())

        # afterward, ensure we stay alive by raising DontCloseSpider
        raise DontCloseSpider("..I prefer live spiders.")

更新:我已经确定我可能需要 ExecutionEngine 对象,但我不完全知道如何从蜘蛛那里获取它,尽管它可以从 Crawler 实例中获得.

更新 2: ..谢谢。 ..crawler 作为超类的属性附加,所以我可以使用 self.crawler 而不需要额外的努力。 >.>

【问题讨论】:

    标签: python scrapy


    【解决方案1】:
    class FooSpider(BaseSpider):
        def __init__(self, *args, **kwargs):
            super(FooSpider, self).__init__(*args, **kwargs)
            dispatcher.connect(self.dont_close_me, signals.spider_idle)
    
        def dont_close_me(self, spider):
            if spider != self:
                return
    
            self.crawler.engine.crawl(self.create_request(), spider)
    
            raise DontCloseSpider("..I prefer live spiders.")
    

    2016 年更新:

    class FooSpider(BaseSpider):
        yet = False
    
        @classmethod
        def from_crawler(cls, crawler, *args, **kwargs):
            from_crawler = super(FooSpider, cls).from_crawler
            spider = from_crawler(crawler, *args, **kwargs)
            crawler.signals.connect(spider.idle, signal=scrapy.signals.spider_idle)
            return spider
    
        def idle(self):
            if not self.yet:
                self.crawler.engine.crawl(self.create_request(), self)
                self.yet = True
    

    【讨论】:

    • 呃。直接属于我的超类。 >.>
    • ..我写了一个小扩展来将爬虫附加到类,但这显然是正确的方法。
    • 你能解释一下上面的函数是做什么的吗?我还没有得到什么。能否解释一下与 def spider_idle(self) 的区别:self.crawler.engine.slot.scheduler.next_request() raise DontCloseSpider
    猜你喜欢
    • 1970-01-01
    • 2017-04-25
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多