2016-04-04 4 views
1

Hier ist mein CodeScrapy Objekt nicht auf Anfrage Füllen

spider.py

def parse(self,response): 
    item=someItem() 
    cuv=Vitae() 
    item['cuv']=cuv 
    request=scrapy.Request(url, callback=self.cvsearch) 
    request.meta['item'] = item 
    yield request 

def cvsearch(self, response): 
    item=response.meta['item'] 
    cv=item['cuv'] 
    cv['link']=response.url 
    return item 

items.py

class someItem(Item): 
    cuv=Field() 

class Vitae(Item): 
    link=Field() 

keine Fehler angezeigt werden!

Es fügt das Objekt "cuv" zu "item" aber Attribute zu "cuv" werden nie hinzugefügt, was fehlt mir hier?

Antwort

0

Ich bin kein sehr guter Erklärer benutzen, aber ich werde versuchen zu erklären, was falsch ich kann

Scrapy am besten ist asynchron Bedeutung keine Ordnung, die Anfragen sind dort hingerichtet. Lassen Sie uns an diesem Stück Code

def parse(self,response): 
    item=someItem() 
    cuv={} 
    item['cuv']=cuv 
    request=scrapy.Request(url, callback=self.cvsearch) 
    request.meta['item'] = item 
    yield request 
    logging.error(item['cuv']) #this will return null [1] 

def cvsearch(self, response): 
    item=response.meta['item'] 
    cv=item['cuv'] 
    cv['link']=response.url 
    return item 

[1] einen Blick -Das ist, weil diese Zeile ausgeführt wird, bevor cvsearch getan wird, die man nicht kontrollieren kann. Um dies zu lösen Sie eine Kaskade für mehrere Anforderungen zu tun haben

def parse(self,response): 
    item=someItem() 
    request=scrapy.Request(url, callback=self.cvsearch) 
    request.meta['item'] = item 
    yield request 

def cvsearch(self, response): 
    item=response.meta['item'] 
    request=scrapy.Request(url, callback=self.another) 
    yield request 

def another (self, response) 
    item=response.meta['item'] 
    yield item 

Um vollständig dieses Konzept zu begreifen rate ich einen Blick auf Multithreading zu nehmen. Bitte füge alles hinzu, was ich vermisst habe!

1

Warum verwenden Sie scrapy.Item in einem anderen? Probieren Sie ein einfaches Python-Diktat in Ihrem item['cuv']. Und versuchen Sie, request.meta zu scrapy.Request Konstruktorargument zu verschieben. Und Sie sollten yield statt return

def parse(self,response): 
    item=someItem() 
    request=scrapy.Request(url, meta={'item': item} callback=self.cvsearch) 
    yield request 

def cvsearch(self, response): 
    item=response.meta['item'] 
    item['cuv'] = {'link':response.url} 
    yield item 
+0

aber ich möchte weiter an dem Element in der Parse-Methode arbeiten, ist es in Ordnung, es zu tun? Wie auch immer, immer noch nicht funktioniert, es ist leer –

+0

Ich korrigierte die Antwort, überprüfen Sie es noch einmal. –

+0

Immer noch nicht funktioniert, ich habe das Diktat genau wie du gesagt hast und wenn ich 'logging.error (item)' in der cvsearch-Methode zeige es in Ordnung, aber wenn ich das selbe in der Parse-Methode nach 'yield request' mache, ist es nicht da mehr –

Verwandte Themen