2016-07-29 112 views
0

在我的scrapy项目中,我必须在数据库中获取很多url,并且这些url由另一个蜘蛛填充。scrapy从数据库中生成url

一般来说,我会从数据库中获取的网址,并将其设置为蜘蛛的

start_urls财产,但有可能超过1000成千上万的URL在db和URL可以随时进行更新。

所以我想知道是否有可能从数据库中读取每个请求一个?

回答

1

有可能有很多方法可以做到这一点。首先想到的是使用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,继续这样,只要你能够从数据库中弹出的网址。

+0

关于调度员的任何文档?我在scrapy文档站点没有找到。 – hguser

+0

@hguser实际上,pydispatcher似乎已被删除,现在您可以在类方法'from_crawler'中连接信号。根据[scrapy issue#1762](https://github.com/scrapy/scrapy/issues/1762)。看我的编辑。 – Granitosaurus