2017-07-05 5 views
0

Ich versuche, eine Website mit Scrapy zu kratzen. Beispiel Link ist: Here. Ich bin in der Lage, einige Daten mit CSS-Selektoren zu bekommen. Ich muss auch alle Bild-URLs jedes Elements abrufen. Jetzt kann ein Gegenstand mehrere Farben haben. Wenn wir auf eine andere Farbe klicken, werden Bilder von einer anderen URL im Browser abgerufen. Also, ich muss manuelle Anfragen (aufgrund mehrerer Farben) generieren und "Meta" anhängen, um Bild URLs von anderen URLs in einem EINZELNEN ARTIKELFELD zu speichern.Mehrere Anfragen an ein einzelnes Feld in Scrapy

Hier ist mein Scrapy Code:

def get_image_urls(self, response): 
    item = response.meta['item'] 
    if 'image_urls' in item: 
     urls = item['image_urls'] 
    else: 
     urls = [] 
    urls.extend(response.css('.product-image-link::attr(href)').extract()) 
    item['image_urls'] = urls 
    next_url = response.css('.va-color .emptyswatch a::attr(href)').extract() 
    #print(item['image_urls']) 
    yield Request(next_url[0], callback=self.get_image_urls, meta={'item': item}) 

def parse(self, response): 
    output = JulesProduct() 
    output['name'] = self.get_name(response) 

    # Now get the recursive img urls 
    response.meta['item'] = output 
    self.get_image_urls(response) 
    return output 

Idealerweise sollte ich Ausgangsobjekt zurückgeben alle erforderlichen Daten zu haben. Meine Frage ist, warum ich keine Ausgabe ['image_urls'] bekomme? Wenn ich die print-Anweisung in der Funktion get_image_urls auslasse, sehe ich 3 gecrawlte URLs und 3 print-Anweisungen mit URL, die nacheinander angehängt werden. Ich brauche sie in der Parse-Funktion. Ich bin mir nicht sicher, ob ich mein Problem diktieren kann. Kann jemand helfen?

Antwort

0

Ihre Analysemethode gibt die Ausgabe zurück, bevor die get_image_urls-Anforderungen ausgeführt werden.

Sie sollten nur Ihr endgültiges Objekt und am Ende Ihrer rekursiven Logik geben oder zurückgeben. So etwas sollte funktionieren:

def parse(self, response): 
    output = JulesProduct() 
    output['name'] = self.get_name(response) 
    yield Request(response.url, callback=self.get_image_urls, meta={'item': item}, dont_filter=True) 

def get_image_urls(self, response): 
    item = response.meta['item'] 
    if 'image_urls' in item: 
     urls = item['image_urls'] 
    else: 
     urls = [] 
    urls.extend(response.css('.product-image-link::attr(href)').extract()) 
    item['image_urls'] = urls 
    next_url = response.css('.va-color .emptyswatch a::attr(href)').extract() 

    if len(next_url) > 0: 
     yield Request(next_url[0], callback=self.get_image_urls, meta={'item': item}) 
    else: 
     yield item 
+0

Sind Sie sicher, dass wir nicht etwas in Parse-Funktion ändern müssen? Weil ich das versucht habe und es nichts bekommen hat. Irgendwelche Hinweise? –

+0

Ich habe meine Antwort bearbeitet. Entschuldige meinen Fehler. Nur damit du weißt, da ich die Seite, die du scrappst, nicht kenne, mache ich eine zweite Anfrage an dieselbe Seite, also benutze dont_filter = True, und gehe davon aus, dass deine Analyse-Logik gut ist. –

Verwandte Themen