scrapyのpipelineがitemをいつ取得するかを検討します.
1580 ワード
問題はspiderを実行する過程でpipelineに書き込まれたデータベースストレージ過程がitemから伝達されたデータを常に得られず、デバッグを経てpipelineが呼び出されるメカニズムが発見されたことにある.
テストするコードを書きます.
spider.py:
実行結果itemはprintされていないことが分かった.
すなわち,あるコードに成分が欠けており,pipelineはitemを取得していない.
デバッグによりspider.pyのparse()内部ではnext_が得られますpage_urlの前に、「yield item」を加えると、すべてが終わります.
したがって、pipelineは、這い出し中にitemを返すときに呼び出され、pipelineはitemを処理した後にitemを返し、次のitemを処理する.
テストするコードを書きます.
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を処理する.