scrapyのpipelineがitemをいつ取得するかを検討します.

1580 ワード

問題はspiderを実行する過程でpipelineに書き込まれたデータベースストレージ過程がitemから伝達されたデータを常に得られず、デバッグを経てpipelineが呼び出されるメカニズムが発見されたことにある.
テストするコードを書きます.
  spider.py:
import scrapy
from items import Work1Item # item, 

class Work1Spider(scrapy.Spider):
        name = 'work1'
        start_urls = [
            'http://quotes.toscrape.com/',
        ]
	
	def parse(self, response):
	    for quote in response.xpath('//div[@class="quote"]'):
	        item = Work1Item()
		    item['author'] = quote.xpath('.//small[@class="author"]/text()').extract_first()
		    item['tags'] = quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract()
	        item['quote'] = quote.xpath('./span[@class="text"]/text()').extract_first()
		next_page_url = response.xpath('//li[@class="next"]/a/@href').extract_first()
		if next_page_url is not None:
		        yield scrapy.Request(response.urljoin(next_page_url))
  pipeline.py: 
class Work1Pipeline(object):
        def process_item(self, item, spider):
                print item
                return item
  settings.pyでpipelineをオンにします.
ITEM_PIPELINES = {
    'work1.pipelines.Work1Pipeline': 300,
}

実行結果itemはprintされていないことが分かった.
すなわち,あるコードに成分が欠けており,pipelineはitemを取得していない.
デバッグによりspider.pyのparse()内部ではnext_が得られますpage_urlの前に、「yield item」を加えると、すべてが終わります.
したがって、pipelineは、這い出し中にitemを返すときに呼び出され、pipelineはitemを処理した後にitemを返し、次のitemを処理する.