2013-04-06 4 views
7

Ich bin neu in Scrapy und versuche, mehrere Sites aus einer Textdatei mit CrawlSpider zu crawlen. Allerdings möchte ich die Tiefe des Scraping per Website und auch die Gesamtzahl der gecrawlten Seiten wieder per Website begrenzen. Leider, wenn die Attribute start_urls und allowed_domains gesetzt sind, scheint die response.meta ['depth'] immer Null zu sein (das passiert nicht, wenn ich versuche, einzelne Sites zu scrappen). Das Einstellen der DEPTH_LIMIT in der Einstellungsdatei scheint überhaupt nichts zu tun. Wenn ich die init Definition entfernen und einfach die start_urls und allowed_domains Dinge scheinen gut zu funktionieren. Hier ist der Code (Sorry für die Einbuchtung - das ist nicht das Thema):Crawlen mehrerer Sites mit Python Scrapy mit begrenzter Tiefe pro Site

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'] 

Dies führt zu response.meta [ ‚Tiefe‘] immer gleich Null und die cralwer kriecht nur die erste Seite von jedem Element von start_urls (dh es folgt keine Links). So habe ich zwei Fragen 1) Wie das Crawling zu einer bestimmten Tiefe zu begrenzen pro jeder Standort in start_urls 2) Wie die Gesamtzahl der Crawls pro Seite zu begrenzen, unabhängig von den Tiefen

Dank!

+0

Es scheint, dass das Problem in dem Teil, wo Sie Argumente an die Spinne passieren. Wenn dies entfernt wird, funktioniert der Crawler problemlos mit der Einstellung DEPTH_LIMIT. Dies macht es jedoch sehr ineffizient, es einem wechselnden Satz von Seiten zuzuführen, um zu krabbeln – gpanterov

Antwort

2

Vergessen Sie nicht (mit super zum Beispiel) die Basisklassenkonstruktoren zu nennen:

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) 

UPDATE:

Wenn Sie Methode eine Methode in Python die Basisklasse außer Kraft setzen ist nicht mehr aufgerufen und stattdessen Ihre neue Methode aufgerufen wird, bedeutet dies, dass, wenn Sie möchten, dass Ihre neue Logik zusätzlich zu der alten Logik (dh nicht statt) ausführen, dann müssen Sie die alte Logik ma aufrufen nachmittags.

Hier ist die Logik, die Sie nicht den Aufruf der CrawlSpider.__init__() (via super(DownloadSpider, self).__init__()) fehlten:

self._compile_rules() 
+0

THanks. Das hat es behoben (obwohl ich immer noch keine Ahnung habe, warum - ich werde weiter die Dokumentation in scrapy durchkämmen) – gpanterov

Verwandte Themen