Возможно, есть много способов сделать это. Первое, что приходит в голову, - использовать сигнал 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
Теперь, как только первый URL делается быть Царапины ваш spider_idle() будет вызываться, и там вы можете запланировать новый URL, продолжать это до тех пор, пока вы в состоянии поп-адреса из базы данных.
Какие-либо документы о диспетчере? Я не нашел это на сайте scrapy docs. – hguser
@hguser на самом деле кажется, что pydispatcher лишен, и теперь вы можете подключать сигналы в методе класса 'from_crawler'. В соответствии с [вопросом scrapy # 1762] (https://github.com/scrapy/scrapy/issues/1762). См. Мое редактирование. – Granitosaurus