2017-07-18 4 views
1

Ich habe folgendes Scrapy Parse-Methode:Scrapy - Condition Based kriechen

def parse(self, response): 
     item_loader = ItemLoader(item=MyItem(), response=response) 
     for url in response.xpath('//img/@src').extract(): 
      item_loader.add_value('image_urls', response.urljoin(url)) 
     yield item_loader.load_item() 
     # If item['images_matched'] == True: 
     # yield Request(links, callback=parse) 

Dieser sendet die extrahierten Bild-URLs zu den ImagePipelines. Ich muss Scrapy zusätzliche Links von dieser Seite crawlen lassen, wenn eine bestimmte Bedingung erfüllt ist ... etwas wie ... die Prüfsumme der Bildinhalte ist eine Übereinstimmung für eine Liste von Hashes.


Mein Problem ist, dass ich weiß nicht, wie die Artikel zugreifen, sobald es in der ImagesPipeline und es ist bevölkert mit allen, die Daten fertig ist. Bedeutung item['images_matched'] wird nicht in der Parse-Methode, sondern die Pipelines gefüllt. Ich habe entdeckt, dass die folgende Zugabe nach yield arbeitet: mit entweder den Zugriff auf den Artikel oder eine andere Herangehensweise an dieses


EDIT Hilfe brauchen.

Allerdings scheint dies wie unglaublich schlecht Codierung für mich als das Element dict kann manchmal ziemlich groß sein. Das nur zu überschreiten, um ein Attribut zu überprüfen, ist komisch. Gibt es einen besseren Weg?

Antwort

1

zuweisen Nur das Element zu einer Variablen und liefern dann diese Variable:

item = item_loader.load_item() 
yield item 
if item['images_matched']: 
    yield Request(links, callback=parse) 

Die 'if' -Anweisung wird nach der Pipeline ausgeführt werden.

+0

Danke. Ich habe tatsächlich so etwas probiert, aber es hat nicht funktioniert. Nicht sicher, wo mein Fehler war, als ich diesen Code löschte. – Akustik