ImagesPipeline是scrapy自带的类,用来处理图片(爬取时将图片下载到本地)用的。

优势:

  1. 将下载图片转换成通用的JPG和RGB格式
  2. 避免重复下载
  3. 缩略图生成
  4. 图片大小过滤
  5. 异步下载
  6. ......

工作流程:

  1. 爬取一个Item,将图片的URLs放入image_urls字段
  2. Spider返回的Item,传递到Item Pipeline
  3. Item传递到ImagePipeline,将调用Scrapy 调度器和下载器完成image_urls中的url的调度和下载。
  4. 图片下载成功结束后,图片下载路径、url和校验和等信息会被填充到images字段中。

实现方式:

  1. 自定义pipeline,优势在于可以重写ImagePipeline类中的实现方法,可以根据情况对照片进行分类;
  2. 直接使用ImagePipeline类,简单但不够灵活;所有的图片都是保存在full文件夹下,不能进行分类

 

代码示范

1.无非类版本

# -*- coding: utf-8 -*-
import scrapy
from bmw.items import BmwItem


class BmwHcSpider(scrapy.Spider):
    name = 'bmw_hc'
    # allowed_domains = ['https://car.autohome.com.cn/pic/series/65.html']
    start_urls = ['https://car.autohome.com.cn/pic/series/65.html']

    def parse(self, response):
        uiboxs = response.xpath('//div[@class="column grid-16"]//div[@class="uibox"]')[1:]

        for uibox in uiboxs:
            category = uibox.xpath("./div[@class='uibox-title']/a/text()").get()
            urls = uibox.xpath('.//ul/li/a/img/@src').getall()
            urls = list(map(lambda x: response.urljoin(x), urls))

            item = BmwItem(category=category, image_urls=urls)
            yield item
spider文件

相关文章: