2017-06-26 6 views
0

私の解析メソッドでは、私が継承したSpiderClassから3つのメソッドを呼びたいと思います。 まず、XPathを解析してからデータを消去し、そのデータをアイテムインスタンスに割り当ててパイプラインに渡したいと思います。Scrapy/Python - いくつかの歩留まりを実行する

私は小さなコードで試してみて、原理を尋ねます:cleanDataassignProductValuesは決して呼び出されません - なぜですか?

def parse(self, response): 
    for href in response.xpath("//a[@class='product--title']/@href"): 
     url = href.extract() 

     yield scrapy.Request(url, callback=super(MyclassSpider, self).scrapeProduct) 
     yield scrapy.Request(url, callback=super(MyclassSpider, self).cleanData) 
     yield scrapy.Request(url, callback=super(MyclassSpider, self).assignProductValues) 

私は降伏を使用しているとき、私はジェネレータを作成することを理解したが2番目と3番目の収率は最初の収量またはどのように私は彼らが呼ばれて達成することができます後に呼び出されていない理由を私は理解していません。

-

それから私は別の方法を試してみました:私は、ウェブサイトへの3つの要求を行うにはしたくない - データと一つだけと仕事。ここでは何が起こる

def parse(self, response): 
    for href in response.xpath("//a[@class='product--title']/@href"): 
     url = href.extract() 

     item = MyItem() 
     response = scrapy.Request(url, meta={'item': item}, callback=super(MyclassSpider, self).scrapeProduct) 
     super(MyclassSpider, self).cleanData(response) 
     super(MyclassSpider, self).assignProductValues(response) 
     yield response 

されており、scrapeProductはしばらく時間がかかるかもしれない、と呼ばれています。 (私は5秒遅れている)。 しかし、cleanDataassignProductValuesは、30回のようにすぐに呼び出されています(forとtrueが頻繁に繰り返される)。 3つのメソッドを1つずつ、Webサイトに対して1つのリクエストで実行するにはどうすればよいですか?

答えて

1

私は、最初のリクエストを得た後、他の2つはdupefilterでフィルタリングされていると思います。あなたのログを確認してください。フィルタ処理を行わない場合は、Requestオブジェクトにdont_filter=Trueを渡します。

+0

これは、私が避けたい同じページに3つのリクエストを行うことを意味します。どのようにそれが可能でしょうか? – Chris

関連する問題