Обход нескольких сайтов с 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()