0
在我的scrapy项目中,我必须在数据库中获取很多url,并且这些url由另一个蜘蛛填充。scrapy从数据库中生成url
一般来说,我会从数据库中获取的网址,并将其设置为蜘蛛的
start_urls
财产,但有可能超过1000成千上万的URL在db和URL可以随时进行更新。
所以我想知道是否有可能从数据库中读取每个请求一个?
在我的scrapy项目中,我必须在数据库中获取很多url,并且这些url由另一个蜘蛛填充。scrapy从数据库中生成url
一般来说,我会从数据库中获取的网址,并将其设置为蜘蛛的
start_urls
财产,但有可能超过1000成千上万的URL在db和URL可以随时进行更新。
所以我想知道是否有可能从数据库中读取每个请求一个?
有可能有很多方法可以做到这一点。首先想到的是使用spider_idle
信号来在每次完成时弹出新的URL,这样您就可以始终使用最新的URL。
from scrapy import Spider, signals
from scrapy.exceptions import DontCloseSpider
class MySpider(scrapy.Spider):
start_urls = ['first_url']
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(MySpider, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.spider_idle, signals.spider_idle)
return spider
def spider_idle(self, spider):
new_url = ... #pop url from database
if new_url:
self.crawler.engine.schedule(
Request(new_url, callback=self.parse), spider)
raise DontCloseSpider
现在,一旦第一个网址进行刮掉你的spider_idle()将被调用,也可以安排一个新的URL,继续这样,只要你能够从数据库中弹出的网址。
关于调度员的任何文档?我在scrapy文档站点没有找到。 – hguser
@hguser实际上,pydispatcher似乎已被删除,现在您可以在类方法'from_crawler'中连接信号。根据[scrapy issue#1762](https://github.com/scrapy/scrapy/issues/1762)。看我的编辑。 – Granitosaurus