Scrapy 提供了两个 Item Pipeline 来下载文件和图片, 它们分别是 FilesPipeline 和 ImagesPipeline
一 FilesPipeline 和 ImagesPipeline
这两个管道都实现了:
避免重复下载
可以指定下载后保存的目录
图片也是文件, 下载图片本质上也是下载文件, Images Pipeline 是 FilesPipeline 的子类, 使用上和 FilesPipeline 差不多, 只是 Images Pipeline 为处理图片提供了额外的功能:
将所有下载的图片格式转换成普通的 JPG 并使用 RGB 颜色模式
为图片生成缩略图
检查图片的宽度和高度, 过滤掉尺寸小的图片
1 使用 Files Pipeline
一般会按照下面的步骤来使用文件管道:
1) 在配置文件 settings.py 中启用 FilesPipeline
ITEM_PIPELINES = {'tutorial.pipelines.files.FilesPipeline': 1,}
2) 在配置文件 settings.py 中使用 FILES_STORE 指定文件存储路径
- # 文件存储路径
- FILES_STORE = '/Users/huangtao/Downloads/files'
3) 实现 ExampleItem(可选), 在 items.py 定义 file_urls 和 files 两个字段
- class ExampleItem(Item):
- file_urls = Field()
- files = Field()
4) 实现 ExamplesSpider, 设置起始爬取点
parse 方法将提取文件的下载 URL 并返回, 一般情况下是把这些 URL 赋值给 ExampleItem 的 file_urls
- # 获取 360 的图片信息
- class SoSpider(scrapy.Spider):
- name = "so"
- allowed_domains = ["image.so.com"]
- def __init__(self, *args, **kwargs):
- super(SoSpider, self).__init__(*args, **kwargs)
- self.start_urls = ['http://image.so.com/z?ch=go']
- # 这里的 parse 方法将提取文件的下载 URL 并返回, 一般情况下是把这些 URL 赋值给 ExampleItem 的 file_urls
- def parse(self, response):
- pass
2 使用 Images Pipeline
ImagesPipeline 跟 FilesPipeline 的使用一样, 只是使用的 item 字段和配置选项上有一些差别
差别一: 在配置文件 settings.py 中导入路径不一样
- ITEM_PIPELINES = {
- 'tutorial.pipelines.files.FilesPipeline': 1, # 文件
- 'tutorial.pipelines.images.ImagesPipeline': 2, # 图片
- }
差别二: 在配置文件 settings.py 指定文件存储路径不一样
- FILES_STORE = '/Users/huangtao/Downloads/files' # 文件存储路径
- IMAGES_STORE = '/Users/huangtao/Downloads/files' # 图片存储路径
差别三: 在 items.py 定义的 Item 字段不一样
- class ExampleItem(Item):
- # 文件
- file_urls = Field()
- files = Field()
- # 图片
- image_urls = scrapy.Field()
- images = scrapy.Field()
3Images Pipeline 在 Files Pipeline 基础上增加了一些特有的功能
为图片生成缩略图
在配置文件 settings.py 中设置 IMAGES_THUMBS, 它是一个字典, 每一项的值是缩略图的尺寸
- IMAGES_THUMBS = {
- 'small': (50, 50),
- 'big': (270, 270),
- }
开启这个功能后, 下载一张图片时, 本地会出现 3 张图片, 1 张原图片, 2 张缩略图
检查图片的宽度和高度, 过滤掉尺寸小的图片
在配置文件 settings.py 中设置 IMAGES_MIN_HEIGHT 和 IMAGES_MIN_WIDTH, 它们分别指定需要过滤掉的最小尺寸图片的宽和高
- IMAGES_MIN_WIDTH = 110 # 最小宽度
- IMAGES_MIN_HEIGHT = 110 # 最小高度
开启这个功能后, 如果下载的图片尺寸为 109*200, 该图片就会被抛弃, 因为它的宽度不符合标准同样的, 当高度不符合时也会被抛弃
来源: http://www.jianshu.com/p/ad3aed8da099