【发布时间】:2015-02-27 11:29:39
【问题描述】:
我刚刚使用 Scrapy 编写了一个简单的蜘蛛。现在我想知道是否有办法按块抓取链接并在前一个蜘蛛完成工作后重新启动蜘蛛?
我的意思是,在蜘蛛的__init__ 中,我从数据库中获得了 100 个起始 URL,当所有这些链接都被抓取并且蜘蛛终止时,我想自动启动一个新的蜘蛛。我怎样才能做到这一点?或者可能有一种方法可以在不重新启动蜘蛛的情况下获取新的 URL 块?
【问题讨论】:
我刚刚使用 Scrapy 编写了一个简单的蜘蛛。现在我想知道是否有办法按块抓取链接并在前一个蜘蛛完成工作后重新启动蜘蛛?
我的意思是,在蜘蛛的__init__ 中,我从数据库中获得了 100 个起始 URL,当所有这些链接都被抓取并且蜘蛛终止时,我想自动启动一个新的蜘蛛。我怎样才能做到这一点?或者可能有一种方法可以在不重新启动蜘蛛的情况下获取新的 URL 块?
【问题讨论】:
您可以将一个方法附加到spider_idle 信号,这样当蜘蛛空闲时(即它处理完所有请求和项目),它将执行该方法,或者在您的情况下,获取更多要抓取的 URL。
这是一个例子:
from scrapy.xlib.pydispatch import dispatcher
from scrapy import Spider, signals
from scrapy.http import Request
class MySpider(Spider):
def __init__(self, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.start_urls = self.fetch_more_urls()
dispatcher.connect(self.do_when_idle, signals.spider_idle)
def do_when_idle(self, spider):
if spider != self:
return
urls = self.fetch_more_urls()
for url in urls:
req = Request(url=url, callback=self.parse)
self.crawler.engine.crawl(req, spider)
def parse(self, response):
# parse function
蜘蛛将在处理/抓取__init__ 下的初始获取请求后运行do_when_idle 函数。
有关信号的更多信息,请参阅:http://doc.scrapy.org/en/latest/topics/signals.html
【讨论】: