探讨scrapy当中的pipeline何时获取item。
2017-09-21 14:41
309 查看
问题来自于在运行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 itemsettings.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进行处理。
相关文章推荐
- Scrapy-Item Pipeline(项目管道)
- 运维学python之爬虫高级篇(四)Item Pipeline介绍(附爬取网站获取图片到本地代码) 推荐
- scrapy爬虫之item pipeline保存数据
- Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
- Scrapy框架学习(二)----Item Pipeline(管道)和Scrapy Shell
- 【scrapy】Item Pipeline
- 爬虫框架Scrapy之Item Pipeline
- Get field as SPUser from SPListItem -获取当中的用户
- Python:Scrapy框架中Item Pipeline组件(项目管道组件)的使用教程
- Scrapy源码分析-Item Pipeline中文文档(四)
- scrapy爬虫之Item Pipeline
- Scrapy学习篇(七)之Item Pipeline
- Python:Scrapy框架中Item Pipeline组件使用详解
- scrapy在spider中通过pipeline获取数据库内容
- Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
- Scrapy笔记(6)- Item Pipeline
- 当GridView嵌入ListView后,获取不到Listview的Item 点击事件
- javascript获取下拉列表框当中的文本值示例代码
- ListView item 中TextView 如何获取长按事件
- DevExpress 中获取 Radio,CheckBox,Combo 的repositoryItem SelectedIndex 的一般方法