2016-07-29 3 views
0

В моем проекте по очистке я должен получить много URL-адресов в базе данных, и эти URL-адреса заполнены другим пауком.scrapy generate url из базы данных

Вообще я получить адреса из базы данных и установить их в собственность паука

start_urls, однако там, возможно, 1000+ тысячи адресов в БД, и 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 

Теперь, как только первый URL делается быть Царапины ваш spider_idle() будет вызываться, и там вы можете запланировать новый URL, продолжать это до тех пор, пока вы в состоянии поп-адреса из базы данных.

+0

Какие-либо документы о диспетчере? Я не нашел это на сайте scrapy docs. – hguser

+0

@hguser на самом деле кажется, что pydispatcher лишен, и теперь вы можете подключать сигналы в методе класса 'from_crawler'. В соответствии с [вопросом scrapy # 1762] (https://github.com/scrapy/scrapy/issues/1762). См. Мое редактирование. – Granitosaurus

Смежные вопросы