2017-06-26 3 views
0

In meiner Analyse-Methode möchte ich 3 Methoden aus einer SpiderClass aufrufen, die ich erben. Zuerst möchte ich die XPaths parsen, dann die Daten bereinigen, dann die Daten einer Item-Instanz zuweisen und sie der Pipeline übergeben.Scrapy/Python - Ausführen mehrerer Erträge

Ich werde es mit wenig Code versuchen und einfach nach den Prinzipien fragen: cleanData und assignProductValues werden nie genannt - warum?

def parse(self, response): 
    for href in response.xpath("//a[@class='product--title']/@href"): 
     url = href.extract() 

     yield scrapy.Request(url, callback=super(MyclassSpider, self).scrapeProduct) 
     yield scrapy.Request(url, callback=super(MyclassSpider, self).cleanData) 
     yield scrapy.Request(url, callback=super(MyclassSpider, self).assignProductValues) 

Ich verstehe, dass ich einen Generator erstellen, wenn Ertrag verwenden, aber ich verstehe nicht, warum die 2. und 3. Ausbeute nicht nach der ersten Ausbeute aufgerufen wird, oder wie kann ich erreichen, sie genannt zu werden.

-

Dann habe ich versucht, einen anderen Weg: Ich weiß nicht 3-Anfragen auf der Website tun wollen - nur eine und die Arbeit mit den Daten.

def parse(self, response): 
    for href in response.xpath("//a[@class='product--title']/@href"): 
     url = href.extract() 

     item = MyItem() 
     response = scrapy.Request(url, meta={'item': item}, callback=super(MyclassSpider, self).scrapeProduct) 
     super(MyclassSpider, self).cleanData(response) 
     super(MyclassSpider, self).assignProductValues(response) 
     yield response 

Was hier geschieht, scrapeProduct genannt wird, das eine Weile dauern könnte. (Ich habe eine 5 Sekunden Verspätung). Aber dann werden cleanData und assignProductValues sofort wie 30 Mal aufgerufen (so oft wie das for ist/durchgeschleift). Wie kann ich die drei Methoden eins nach dem anderen mit nur einer Anfrage an die Webseite ausführen?

Antwort

1

Ich denke, dass, nachdem Sie die erste Anfrage ergeben, die anderen beiden von Dupefilter gefiltert werden. Überprüfen Sie Ihr Protokoll. Wenn Sie nicht möchten, dass es gefiltert wird, übergeben Sie dont_filter=True für das Request-Objekt.

+0

Das würde bedeuten, ich würde 3 Anfragen auf dieselbe Seite machen, die ich gerne vermeiden würde. Wie wäre das möglich? – Chris

Verwandte Themen