2017-10-31 6 views
0

私は、複数のスパイダーで定期的なタスクを処理する関数を作成しようとしています。それはそれを破るように見える要求を生成することを伴います。この質問は、this questionからのフォローアップです。リクエストを出すBaseSpiderクラスの機能

import scrapy 
import json 
import re 

class BaseSpider(scrapy.Spider): 

    start_urls = {} 

    def test(self, response, cb, xpath): 
     self.logger.info('Success') 
     for url in response.xpath(xpath).extract(): 
      req = scrapy.Request(response.urljoin(url), callback=cb) 
      req.meta['category'] = response.meta.get('category') 
      yield req 

yield reqがコードである場合には、「成功」ロガーが突然もう動作しませんし、コールバック関数が呼び出されていないようです。 yield reqがコメントされると、ロガーには「成功」ロガーが表示されます。私は問題がクモのコードの下、クモであるとは思いませんが:

def parse(self,response): 
    self.logger.info('Base page: %s', response.url) 
    for req in self.test(response, self.parse_page, '//h3/a/@href'): 
     yield req 

試験方法利回りの結果と、なぜそれのthats:

# -*- coding: utf-8 -*- 
import scrapy 
from crawling.spiders import BaseSpider 

class testContactsSpider(BaseSpider): 
    """ Test spider """ 
    name = "test" 
    start_urls = {} 
    start_urls['test'] = 'http://www.thewatchobserver.fr/petites-annonces-montres#.WfMaIxO0Pm3' 

    def parse(self,response): 
     self.logger.info('Base page: %s', response.url) 
     self.test(response, self.parse_page, '//h3/a/@href') 

    def parse_page(self, response): 
     self.logger.info('Page: %s', response.url) 

答えて

1

私はあなたがこのようなものが必要だと思いますリターンジェネレータタイプ。下から てみてくださいコードとUnderstanding Generators in Pythonのためにこれを読んで:

def test(): 
    print('Inside generator!') 
    for i in range(5): 
    yield i 

print('============') 
g = test() #save as variable 
test()  #trying to call func 
print('============') 
print(next(g)) #next of "g" generator 
print(next(g)) 
print('============') 
print(next(test())) #next of newly created generator 
print(next(test())) 
print('============') 
for i in test(): #for each elem that returns generator 
    print(i) 


をこの例では、発電機を使用していない。我々はそれを呼び出して、なぜ次の要素とのthatsを取得しようとしている。この中

self.test(response, self.parse_page, '//h3/a/@href') 

を:

self.test(response, self.parse_page, '//h3/a/@href').next() 
#or 
    next(self.test(response, self.parse_page, '//h3/a/@href')) 


+0

これは実際に動作するようです。しかし、理想的には私のコードをできるだけシンプルにしたいと思っています。 'self.parse'関数でループを実行することなく、' self.test'関数でこれらの要求を直接得ることはできません。 – Casper

+0

私はそれが可能ではないと思います。コードを少しシンプルにしたい場合(python 3_in)、 'req in test():yield req'の代わりに' yield from test() 'を使うことができます。 – Fidan

+0

残念ながら私は2.7を実行していますが、あなたの助けに感謝します – Casper

関連する問題