python - Scrapy:如何从 spider_idle 事件回调中手动插入请求?

标签 python scrapy

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

如何手动添加请求?我不能只从解析中返回该项目——在这种情况下解析没有运行,因为所有已知的 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 作为父类(super class)的属性附加,所以我可以直接使用 self.crawler 而无需额外的努力。 >.>

最佳答案

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

关于python - Scrapy:如何从 spider_idle 事件回调中手动插入请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16970112/

相关文章:

python - 在 C++ 中,不应该有一个类似于 'this' 指针的名称不可知的类指针供成员函数引用吗?

Python 脚本 - 在本地环境中工作但不在开发服务器上工作

python - XPATH 选择器无法选择 html 代码块

python - 如何使用选择器选择html元素的属性?

python - 获取 Scrapy 记录器

python - Scrapy:存储/抓取当前的 start_url?

python - Crcmod python3多项式错误

python - 初级刽子手游戏 : Can't make it work

python - 如何在不占用所有内存的情况下使用 python-gnupg 加密大型数据集?

python - 碎片 : Select only <p> elements with text content with xpath