ImagesPipeline是scrapy自带的类,用来处理图片(爬取时将图片下载到本地)用的。
优势:
- 将下载图片转换成通用的JPG和RGB格式
- 避免重复下载
- 缩略图生成
- 图片大小过滤
- 异步下载
- ......
工作流程:
- 爬取一个Item,将图片的URLs放入
image_urls字段 - 从
Spider返回的Item,传递到Item Pipeline - 当
Item传递到ImagePipeline,将调用Scrapy 调度器和下载器完成image_urls中的url的调度和下载。 - 图片下载成功结束后,图片下载路径、url和校验和等信息会被填充到images字段中。
实现方式:
- 自定义pipeline,优势在于可以重写ImagePipeline类中的实现方法,可以根据情况对照片进行分类;
- 直接使用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