2017-08-17 2 views
0
def parse(self,response): 
    print("parse!!!!!!!!!!!!!!!!!!!") 
    yield scrapy.Request("http://xx.com", callback=self.parseHeader,meta={'item': item}) 
    yield scrapy.Request("http://xx.com ", callback=self.parseBody,meta={'item': item}) 
    yield scrapy.Request("http://xx.com ", callback=self.parseFooter,meta={'item': item}) 


def parseHeader(self,response): 
    print("parseHeader!!!!!!!!!!!!!!!!!!!") 
    item = ItemHeader() 
    #... 
    yield item 

def parseBody(self,response): 
    print("parseBody!!!!!!!!!!!!!!!!!!!") 
    item = ItemBody() 
    #... 
    yield item 

def parseFooter(self,response): 
    print("parseFooter!!!!!!!!!!!!!!!!!!!") 
    item = ItemFooter() 
    #... 
    yield item 

L'exécution du code ci-dessus entraîne le résultat suivant. résultats actuelsComment exécuter plusieurs méthodes dans scrapy

parse!!!!!!!!!!!!!!!!!!! 
↓ 
parseHeader!!!!!!!!!!!!!!!!!!! 
↓ 
pipeline 
↓ 
Closing spider (finished) 

La seule méthode de « parseHeader » seront exécutés Sous ce n'est pas exécuté Modification de rendement pour revenir ne change pas le résultat.

Je voudrais changer le résultat ci-dessus comme suit.

parse!!!!!!!!!!!!!!!!!!! 
↓ 
parseHeader!!!!!!!!!!!!!!!!!!! 
↓ 
pipeline 
↓ 
parseBody!!!!!!!!!!!!!!!!!!! 
↓ 
pipeline 
↓ 
parseFooter!!!!!!!!!!!!!!!!!!! 
↓ 
pipeline 
↓ 
Closing spider (finished) 

Comment est-ce que je pourrais faire cela? S'il vous plaît laissez-moi savoir si vous savez quelque chose qui devient un indice?

Répondre

0

Si vous avez une seule réponse et que vous voulez analyser plusieurs choses sur, vous pouvez séparer la logique de l'analyse en différentes méthodes et les appeler comme méthodes de python normales qui renvoient un élément:

def parse(self, response): 
    yield scrapy.Request("http://xx.com", 
         callback=self.parse_item, 
         meta={'item': item}) 

def parse_item(self, response): 
    # either return everything as one item: 
    item = response.meta['item'] 
    item['header'] = self.parse_header(response) 
    item['body'] = self.parse_body(response) 
    item['footer'] = self.parse_footer(response) 
    yield item 
    # or as multiple items: 
    yield self.parse_header(response) 
    yield self.parse_body(response) 
    yield self.parse_footer(response) 

def parse_header(self, response): 
    print("parseHeader!!!!!!!!!!!!!!!!!!!") 
    item = ItemHeader() 
    return item 

def parse_body(self, response): 
    print("parseBody!!!!!!!!!!!!!!!!!!!") 
    item = ItemBody() 
    return item 

def parse_footer(self, response): 
    print("parseFooter!!!!!!!!!!!!!!!!!!!") 
    item = ItemFooter() 
    return item 
+0

Nous vous remercions de votre commentaire. Bien qu'il n'y ait pas assez d'explications, il y a une instruction for dans parse_body Comme vous l'avez montré, l'exécution du pipeline n'était que le début de l'instruction. – sukho

+0

Pour déclaration? Pouvez-vous poster cela? Je suggère de revoir [aperçu architectural] (https://doc.scrapy.org/fr/latest/topics/architecture.html) de scrapy si vous essayez de comprendre quand et où les pipelines sont en cours d'exécution. – Granitosaurus