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.
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. –