2017-07-05 6 views
0

Ich brauche 2 Anfrage an verschiedenen URLs zu machen und diese Informationen an den gleichen Punkt setzen. Ich habe diese Methode versucht, aber das Ergebnis ist in verschiedenen Zeilen geschrieben. Die Rückrufe gibt Artikel zurück. Ich habe viele Methoden ausprobiert, aber keine scheint zu funktionieren.Scrapy mehr Anfragen und füllen einen Artikel

Antwort

3

Da scrapy asynchron ist, müssen Sie Ihre Anforderungen manuell verketten. Für Daten zwischen den Anfragen Übertragung können Sie Anfrage meta Attribut:

def parse(self, response): 
    item = dict() 
    item['name'] = 'foobar' 
    yield request('http://someurl.com', self.parse2, 
        meta={'item': item}) 

def parse2(self, response): 
    print(response.meta['item']) 
    # {'name': 'foobar'} 

In Ihrem Fall, dass Sie mit einer Split-Kette am Ende, wenn Sie eine fortlaufende Kette haben sollten.
Der Code sollte wie folgt aussehen:

def parse_companies(self, response): 
    data = json.loads(response.body) 
    if not data: 
     return 
    for company in data: 
     item = ThalamusItem() 
     comp_id = company["id"] 
     url = self.request_details_URL + str(comp_id) + ".json" 
     url2 = self.request_contacts + str(comp_id) 
     request = Request(url, callback=self.parse_details, 
          meta={'url2': url2, 'item': item}) 
     yield request 

def parse_details(self, response): 
    item = response.meta['item'] 
    url2 = response.meta['url2'] 
    item['details'] = '' # add details 
    yield Request(url2, callback=self.parse_contacts, meta={'item': item}) 

def parse_contacts(self, response): 
    item = response.meta['item'] 
    item['contacts'] = '' # add details 
    yield item 
+0

Eine Frage, ich habe ein Problem, dass es Details Zunächst scheint es an den Kontaktinformationen kommt dann getan werden. Es endet damit, alles zu vermasseln. Die Kontaktinformationen sind überall und nicht dort, wo sie hingehören sollten. Der Code, den ich verwende, ist genau der gleiche, den Sie hier benutzen. –

+0

@DainiusPreimantas hmm, es scheint ein Fehler in meinem Beispiel zu sein. Der Artikel sollte in __every__ loop erstellt werden, siehe meine Bearbeitung. Ansonsten passiert es, dass wir eine Referenz ändern und mit chaotischem Durcheinander enden. – Granitosaurus

Verwandte Themen