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