在学习 Item Pipeline 之前,或许我们应该先去了解一下 Items ,如果怕麻烦的话,就暂且把它理解成字典这个数据类型吧.
那么 Item Pipeline 又是什么鬼?
Item Pipeline
官方文档解释是:
当 Item 在 Spider 中被收集之后,它将会被传递到 Item Pipeline,一些组件会按照一定的顺序执行对 Item 的处理.
每个 item pipeline 组件 (有时称之为"Item Pipeline") 是实现了简单方法的 Python 类.他们接收到 Item 并通过它执行一些行为,同时也决定此 Item 是否继续通过 pipeline,或是被丢弃而不再进行处理.
以下是 item pipeline 的一些典型应用:
清理 html 数据
验证爬取的数据 (检查 item 包含某些字段)
查重 (并丢弃)
将爬取结果保存到数据库中
编写自己的 item pipeline
编写你自己的 item pipeline 很简单,每个 item pipiline 组件是一个独立的 Python 类,同时必须实现以下方法:
文档也给出了几个极好的例子: http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/item-pipeline.html
启用 item pipeline
实例
说了这么多,是时候动手体验一把了,那么干什么呢?
要不就看看女神呗: https://movie.douban.com/celebrity/1016930/photos/
我们的目的是下载这些图片,之前我们已经尝试写过了类似的项目,不过这次我们不妨用: http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/images.html ,可以省不少事呢!
首先自然是创建一个项目,然后就是定义好 item,如下图:
开启图片管道:
设置一个文件夹来存储图片:
我们用命令创建一个 spider:
scrapy genspider mm "movie.douban.com/celebrity/1016930/photos"
写入如下代码:
# -*- coding: utf-8 -*-
import scrapy
from satomi.items import SatomiItem
class MmSpider(scrapy.Spider):
name = 'mm'
allowed_domains = ['movie.douban.com/celebrity/1016930/photos']
start_urls = ['https://movie.douban.com/celebrity/1016930/photos/?start={number}'.format(number=str(i*30)) for i in range(11)]
def parse(self, response):
item = SatomiItem()
item['image_urls'] = response.xpath('//div[@class="cover"]/a/img/@src').extract()
yield item
运行结果如下:
目录中也有了图片:
以上.
来源: http://www.jianshu.com/p/17b0afe80200