2016-07-29 111 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