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)
これは実際に動作するようです。しかし、理想的には私のコードをできるだけシンプルにしたいと思っています。 'self.parse'関数でループを実行することなく、' self.test'関数でこれらの要求を直接得ることはできません。 – Casper
私はそれが可能ではないと思います。コードを少しシンプルにしたい場合(python 3_in)、 'req in test():yield req'の代わりに' yield from test() 'を使うことができます。 – Fidan
残念ながら私は2.7を実行していますが、あなたの助けに感謝します – Casper