2016-07-28 7 views
1

Ich benutze InitSpider und lesen Sie eine benutzerdefinierte json Konfiguration innerhalb der def __init__(self, *a, **kw): Methode.Scrapy: überschreiben DEPTH_LIMIT Variable basierend auf Wert gelesen von benutzerdefinierten Konfig

Die JSON-Konfigurationsdatei enthält eine Direktive, mit der ich die Crawling-Tiefe steuern kann. Ich kann diese Konfigurationsdatei bereits erfolgreich lesen und den Wert extrahieren. Das Hauptproblem ist, wie man scrapy sagt, diesen Wert zu verwenden.

Hinweis: Ich möchte nicht ein Befehlszeilenargument wie -s DEPTH_LIMIT=3 verwenden, ich möchte es tatsächlich von meiner benutzerdefinierten Konfiguration analysieren.

Antwort

1

DEPTH_LIMIT wird in scrapy.spidermiddlewares.depth.DepthMiddleware verwendet. Da Sie sich den Code vielleicht kurz angesehen haben, sehen Sie, dass der Wert DEPTH_LIMIT nur gelesen wird, wenn Sie diese Middleware initialisieren.

Ich denke, das wäre eine gute Lösung für Sie:

  1. Im __init__ Methode Ihrer Spinne, stellte eine Spinne Attribut max_depth mit Ihrem eigenen Wert.
  2. Überschreiben Sie scrapy.spidermiddlewares.depth.DepthMiddleware und überprüfen Sie das max_depth Attribut.
  3. Deaktivieren Sie die Standardeinstellung DepthMiddleware und aktivieren Sie Ihre eigenen in den Einstellungen.

Siehe auch http://doc.scrapy.org/en/latest/topics/spider-middleware.html

Ein kurzes Beispiel der außer Kraft gesetzten Middleware in Schritt # 2 beschrieben:

class MyDepthMiddleware(DepthMiddleware): 

    def process_spider_output(self, response, result, spider): 
    if hasattr(spider, 'max_depth'): 
     self.maxdepth = getattr(spider, 'max_depth') 
    return super(MyDepthMiddleware, self).process_spider_output(response, result, spider) 
+0

wo ich die Middleware-Klasse speichern und welchen Dateinamen soll ich ihm geben? – cytopia

+0

Ich löste das obige Problem. Es funktioniert jetzt, aber es scheint, dass Seiten mit einer Tiefe> max_depth immer noch gecrawlt (heruntergeladen), aber nicht verarbeitet werden. Ist es auch möglich, sie nicht herunterzuladen, um Zeit und Bandbreite zu sparen? – cytopia