scrapy中ImagePipeline的使用
# ImagesPipeline管道(自动图片下载)
Scrapy提供了一个 item pipeline ,来下载属于某个特定项目的图片,比如,当你抓取产品时,也想把它们的图片下载到本地。本文接豆瓣top250电影,爬取海报图片。
# 一、ImagesPipeline的工作流程
首先在爬虫项目中获取图片的image_urls item[‘image_urls’]进入管道中 当项目进入 ImagesPipeline,image_urls 组内的URLs将被Scrapy的调度器和下载器(这意味着调度器和下载器的中间件可以复用)安排下载 下载完回返回一个results,这是一个二组,包括success(布尔值,提示图片是否下载成功)和image_info_or_error(图片下载的url,图片存储的路径,图片内容的 MD5 hash)
# 二、ImagesPipeline的使用
1.首先在item.py中写入
import scrapy
class MyItem(scrapy.Item):
image_urls = scrapy.Field() #保存图片地址
images = scrapy.Field() #保存图片的信息
1
2
3
4
5
6
2
3
4
5
6
2.在setting.py中写入
ITEM_PIPELINES = { 'top250.pipelines.Top250Pipeline': 1,}
IMAGES_STORE = 'images' #存储图片的文件夹位置
1
2
2
3.在pipeline中写入
class Top250Pipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['image_urls']:
yield scrapy.Request(image_url)
def item_completed(self, results, item, info):
image_paths = [x['path'] for ok, x in results if ok] # ok判断是否下载成功
if not image_paths:
raise DropItem("Item contains no images")
#item['image_paths'] = image_paths
return item
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
编辑 (opens new window)