Обход нескольких сайтов с Python Scrapy с ограниченной глубиной на сайт

Я новичок в Scrapy, и я пытаюсь сканировать несколько сайтов из текстового файла с помощью CrawlSpider. Однако я хотел бы ограничить глубину выскабливания per сайт, а также общее количество просмотренных страниц снова per веб-сайт. К сожалению, когда атрибуты start_urls и allowed_domains заданы ответ.meta ['depth'] всегда кажется нулевым (этого не происходит, когда я пытаюсь очистить отдельные сайты). Установка DEPTH_LIMIT в файле настроек кажется, он вообще ничего не делает. Когда я удаляю init определение и просто установить start_urls и allowed_domains вещи, кажется, работают нормально. Вот код (извините за отступ-это не вопрос):

class DownloadSpider(CrawlSpider):
  name = 'downloader'
  rules = (
    Rule(SgmlLinkExtractor(), callback='parse_item', follow=True),
    )
  def __init__(self, urls_file, N=10):
      data = open(urls_file, 'r').readlines()[:N]
      self.allowed_domains = [urlparse(i).hostname.strip() for i in data] 
      self.start_urls = ['http://' + domain for domain in self.allowed_domains]

  def parse_start_url(self, response):
      return self.parse_item(response)

  def parse_item(self, response):
      print response.url
      print response.meta['depth']

это приводит к ответу.meta ['depth'] всегда равна нулю, и cralwer только обходит самый первый сайт каждого элемента start_urls (т. е. он не следует по ссылкам). Поэтому у меня два вопроса 1) Как ограничить обход до a определенная глубина per каждый сайт в start_urls 2) Как ограничить общее количество обходов на сайте независимо от глубины

спасибо !

1 ответов


Не забудьте вызвать конструкторы базового класса (например, с помощью super):

def __init__(self, urls_file, N=10, *a, **kw):
    data = open(urls_file, 'r').readlines()[:N]
    self.allowed_domains = [urlparse(i).hostname.strip() for i in data]
    self.start_urls = ['http://' + domain for domain in self.allowed_domains]
    super(DownloadSpider, self).__init__(*a, **kw)

обновление:

когда вы переопределить метод в Python метод базового класса больше не вызывается и вместо этого вызывается ваш новый метод, это означает, что если вы хотите, чтобы ваша новая логика запускалась к старой логике (т. е. не ВМЕСТО), то вам нужно вызвать старую логику вручную.

здесь логика вы пропали, не позвонив в CrawlSpider.__init__() (via super(DownloadSpider, self).__init__()):

self._compile_rules()