2016-04-29 6 views
1

Wie analysiere ich mit Scrapy Daten zu gleichen Artikel von mehreren Links auf der gleichen Seite? Ich versuche nicht, Daten von nur einen Link von einer Unterseite zu retten, aber etwas equivalente zu this Beispiel, aber mit dem Unterschied, dass ich mehr als einen Link von der gleichen Seite folgen mag:Scrapy Daten im selben Artikel von mehreren Link auf der gleichen Seite?

A 
----> B.1 
--------> B.1.1 
----> B.2 
--------> B.2.2 

Zusammengefasst Ich möchte verschiedene Arten von Daten in demselben Element von der Stammseite A, B.1, B.1.1, B.2 und B.2.2 speichern. Kann mir jemand ein Spielzeugbeispiel geben?

EDIt:

Bild den folgenden Code:

class MySpider(BaseSpider): 

    start_urls = [www.pageA.com] 

    def parse(self, response): 
     myitem = Item() 

     # some initial data 
     item['a'] = response.xpath(...).extract() 

     # extract all B.i links 
     url_Bi_list = response.xpath(...).extract() 

     for url_Bi in url_Bi_list: 
      yield Request(url_Bi, 
        ... 
        callback=parseBi,meta=dict(item=myitem)) 

    def parseBi(self, response): 
     my_new_item = response.meta['item'] 


     # some second data 
     item['bi'] = response.xpath(...).extract() 

     # extract B.i.i link 
     url_Bii = response.xpath(...).extract() 

     yield Request(url_Bii, 
        ... 
        callback=parseBii,meta=dict(item=my_new_item)) 

    def parseBii(self, response): 
     final_item = response.meta['item'] 

     # extract more data from B.i.i link 
     # some third inner data 
     my_new_item['bii'] = response.xpath(...).extract() 

     yield final_item 

So wird dieser Code-Struktur arbeiten? Ich bin nicht sicher, wenn Artikel oder Anfrage zu erhalten ...

Antwort

1

mehr Seiten verwenden das Beispiel you just pointed (zur Steuerung Rückruf) abfragen und verwenden Sie die meta parameter in einer dict Form von Informationen zwischen Rückrufen geben, übergeben Sie ein Element zu jeder Callback lo gibt ihn später beim letzten Callback zurück.

def parseA(self, response): 
    ... 
    myitem = MyItem() 
    # populate the item 
    ... 
    yield Request(url=<B url>, 
        ... 
        callback=parseB, meta=dict(item=myitem)) 

def parseB(self, response): 
    my_new_item = response.meta['item'] 
    ... 
    yield Request(url=<C url>, 
        ... 
        callback=parseC, meta=dict(item=my_new_item)) 

def parseC(self, response): 
    final_item = response.meta['item'] 
    ... 
    yield final_item 
+0

nicht sicher, ob ich verstehe. Wenn der ParseB aufgerufen wird, könnte die eine unbekannte sein. – Miguel

+0

teilen Sie Code, wenn Sie möchten, dass ich Ihren Fall verstehe. über eine Methode, die eine URL zum Parsen weiß oder nicht, wie wirkt sich das auf das Element aus? – eLRuLL

+0

Ok, ich habe gerade ein Beispiel für einen Code geschrieben, den ich versucht habe. Aber die Ergebnisse waren nicht gut. Die letzten Item-Dictionary Ergebnisse sind eine Reihe von gemischten Daten – Miguel

Verwandte Themen