2017-05-31 7 views
2

So habe ich derzeit 2 Pipelines, beide sind wie folgt bestellt.Scrapy - Erstellen Sie zusätzliche Elemente in der Pipeline

ITEM_PIPELINES = { 
    'myproject.pipelines.mutatorPipeline': 300, 
    'myproject.pipelines.submitDatabasePipeline': 800, 
} 

Sie werden in der richtigen Reihenfolge ausgeführt.

1.) Die erste Pipeline ist ein Mutator.

2.) Der zweite gibt die Informationen an die Datenbank.

Die Daten werden korrekt an die Datenbank gesendet.

Meine Probleme sind, dass manchmal, wenn Daten meine mutator pipeline erreichen, ich 'zusätzliche' Elemente erstellen möchte, um an meine zweite Pipeline zu übergeben.

Aktuell (ohne Mutationen) sieht es wie folgt aus:

def process_item(self, item, spider): 
      #Mutate the item 
      return item 

kann ich jedoch nicht, return mehr als einmal. Ich möchte auch kein zusätzliches Element erstellen, das am Anfang von Pipeline 1 beginnt.

Viele hilft im Voraus.

Antwort

2

Wenn Sie sich schnell die Dokumente ansehen, können Sie wahrscheinlich eine Unterklasse von scrapy.item.Item erstellen, das ist wie eine verkettete Liste.

Ohne scrapy zu berühren, könnte so etwas in der Lage sein. Es könnte einige Änderungen erfordern, aber sollte genug sein, um Sie zu beginnen.

class Myitem(Item): 
    my_field = scrapy.Field() 

    def __init__(self): 
     self.next = None 
     super(Myitem,self).__init__() 

Jetzt können Ihre Prozesselemente mehrere Elemente erstellen und verketten.

def process_item(self, item, spider): 
     # Mutate the item, get additional my_value 
     item.next = MyItem() 
     item.next['my_field'] = my_value 
     return item 

Jetzt in Ihrer Datenbank-Pipeline können Sie jeden Artikel verarbeiten.

def process_item(self, item, ...): 
    current = item 
    while current: 
     # process current 
     current = item.next 
+0

Immer eine Liste erstellen und dann loopen. Gute Idee! –

Verwandte Themen