2016-07-04 15 views
2

Was ist der beste Ansatz zum Schreiben von Verträgen für Scrapy-Spider, die mehr als eine Methode zum Analysieren der Antwort haben? Ich sah dies answer, aber es klang nicht sehr klar für mich.Scrapy-Verträge mit mehreren Parse-Methoden

Mein aktuelles Beispiel: Ich habe eine Methode namens parse_product, die die Informationen auf einer Seite extrahiert, aber ich habe mehr Daten, die ich für das gleiche Produkt in einer anderen Seite extrahieren muss, so dass ich eine neue Anfrage am Ende dieser yield Methode, um eine neue Anfrage zu erstellen, und der neue Rückruf extrahiert diese Felder und gibt das Element zurück.

Das Problem ist, dass wenn ich einen Vertrag für die zweite Methode schreiben, wird es fehlschlagen, weil es nicht das Meta-Attribut (enthält das Element mit den meisten der Felder). Wenn ich einen Vertrag für die erste Methode schreibe, kann ich nicht überprüfen, ob sie die Felder zurückgibt, weil sie eine neue Anfrage anstelle des Artikels zurückgibt.

def parse_product(self, response): 
    il = ItemLoader(item=ProductItem(), response=response) 
    # populate the item in here 

    # yield the new request sending the ItemLoader to another callback 
    yield scrapy.Request(new_url, callback=self.parse_images, meta={'item': il}) 

def parse_images(self, response): 
    """ 
    @url http://foo.bar 
    @returns items 1 1 
    @scrapes field1 field2 field3 
    """ 
    il = response.request.meta['item'] 
    # extract the new fields and add them to the item in here 

    yield il.load_item() 

Im Beispiel habe ich den Vertrag in der zweiten Methode, aber es gab mir eine KeyError Ausnahme auf response.request.meta['item'], auch die Felder field1 und field2 in dem ersten Verfahren bestückt sind.

Ich hoffe, es ist klar genug.

Antwort

3

Ehrlich gesagt, ich benutze keine Scrapy-Verträge und ich empfehle auch niemandem, sie zu benutzen. Sie haben many issues und someday may be removed from Scrapy.

In der Praxis hatte ich nicht viel Glück mit Unit-Tests für Spinnen.

Zum Testen von Spinnen während der Entwicklung, würde ich den Cache aktivieren und dann die Spinne so oft wie nötig ausführen, um das Kratzen richtig zu machen.

Für Regression Bugs, hatte ich mehr Glück mit Item-Pipelines (oder Spider Middlewares), die Validierung on-the-fly (es gibt nur so viel können Sie in frühen Tests sowieso fangen). Es ist auch eine gute Idee, einige Strategien für die Wiederherstellung zu haben.

Und um eine gesunde Codebasis zu erhalten, würde ich ständig Bibliothek-ähnlichen Code aus dem Spider selbst herausbewegen, um ihn testbarer zu machen.

Entschuldigung, wenn dies nicht die Antwort ist, die Sie suchen.

+1

Es war nicht genau die Antwort, die ich suchte, aber es hat mir sehr geholfen, vielleicht mehr als die tatsächliche Antwort (wenn es existiert). Vielen Dank. –