当前位置: 首页 > 面试题库 >

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

胡墨竹
2023-03-14
问题内容

我创建了一个Spider,并将一个方法链接到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被附加为超类的属性,因此我可以轻松使用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


 类似资料:
  • 问题内容: 如何通过自己的代码手动调用特定事件? 问题答案: 我认为您想要wx.PostEvent。 在wxPython Wiki上 还有一些有关从其他线程发布事件以执行长期运行任务的信息。

  • 钻研比使用基本刮擦功能更深。 我了解基本的BaseSpider类:名称、允许的\u域,以及如何为每个start\u url发送请求对象,其中parse函数用作回调函数,parse接收响应。 我知道我的解析函数为每个名为“服务名称”的类的数据保存了一个XPath响应,我相信它会通过循环将每个XPath响应匹配的数据存储到对象“项”中,然后将其发送到“我的items.py容器。 'newUrl'包含连

  • 注册事件回调函数,与swoole_server->on相同。 $server->on('eventName','function for call back') 的方式来实现回调事件的注册。 request 事件 $http_server->on('request', function(swoole_http_request $request, swoole_http_response $res

  • 问题内容: 我正在通过日历窗口小部件设置日期时间文本字段值。显然,日历小部件会执行以下操作: 我想要的是:在更改日期时间文本字段中的值时,我需要重置页面中的其他一些字段。我已经将一个onchange事件侦听器添加到了不会被触发的datetimetext字段中,因为我猜只有在元素获得焦点并且其值更改为失去焦点时才会被触发。 因此,我正在寻找一种手动触发此事件的方法(我认为应该注意检查文本字段中的值差

  • 如何从pytest测试模块向正在运行的pyplay注入事件? 下面是pygame的一个最小示例,它在按下时绘制一个白色矩形,并在按下时退出游戏。 我想写一个模块来自动测试它。我读到过,一个人可以在运行时注入事件。在这里,我读到产生允许双向通信,所以我想我必须实现某种钩子,用于从模块注入的,但它并不简单正如我所想,所以我评论了它。如果我在,甚至不等待任何输入。 下面是pytest的测试模块: