我刚用Scrapy写了一个简单的蜘蛛。现在我想知道是否有办法通过块抓取链接并在前一个蜘蛛完成其工作时重新启动蜘蛛?
我的意思是,在蜘蛛的__init__
中,我从数据库中获得100个起始URL,当所有这些链接被爬行并且蜘蛛终止时,我想自动启动一个新的蜘蛛。我怎样才能做到这一点?或者可能有一种方法可以在不重新启动蜘蛛的情况下获取新的URL?
答案 0 :(得分:0)
您可以将方法附加到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
蜘蛛会在do_when_idle
下处理/删除您的初始抓取请求后运行__init__
函数。
有关信号的详细信息,请参阅:http://doc.scrapy.org/en/latest/topics/signals.html