2017-08-17 9 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 

上記のコードを実行すると、次の結果が得られます。 現在の結果複数のメソッドを実行する方法

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

「parseHeader」の唯一の方法は、その下に が、結果は変わりません返すように 変更収率は実行されません実行されます。

上記の結果を次のように変更したいと思います。

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

どうすればいいですか? ヒントになることが分かっている場合は教えてください。

答えて

0

あなたは、単一の応答を持っており、それのうち複数のものを解析する場合は、別のメソッドに解析するロジックを分離し、ちょうど項目を返す通常のPythonメソッドとしてそれらを呼び出すことができます。

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

をいただき、ありがとうございますあなたのコメント。十分な説明はありませんでしたが、parse_bodyにはfor文があります あなたが教えているように、パイプラインの実行は声明の始まりに過ぎませんでした。 – sukho

+0

声明のために?投稿できますか?いつどこでパイプラインが実行されているのかを理解しようとするなら、[architectual overview](https://doc.scrapy.org/en/latest/topics/architecture.html)を見直すことをお勧めします。 – Granitosaurus

関連する問題