我创建了一个蜘蛛,并将一个方法链接到 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/