Scrapy 框架中的媒体管道(三十)
一、媒体管道的特性
1、媒体管道都实现了以下特性:
- 避免重新下载最近下载的媒体。
- 指定存储位置(文件系统目录,AmazonS3 bucket,谷歌云存储bucket)。
2、图像管道具有一些额外的图像处理功能:
- 将所有下载的图片转换为通用格式(JPG)和模式(RGB)。
- 生成缩略图。
- 检查图像的宽度/高度,进行最小尺寸过滤。
二、自定义图片管道案例
它的工作流是这样的:
-
1、在爬虫中,您可以返回一个item,并将所需的url放入file_urls字段。
-
2、item从爬虫返回并进入item管道。
-
3、当item到达文件管道时,file_urls字段中的url将使用标准的Scrapy调度器和下载程序(这意味着将重用调度器和下载程序中间件)计划下载,但是具有更高的优先级,在其他页面被爬取之前处理它们。在文件下载完成(或由于某种原因失败)之前,该项在特定管道阶段保持“锁定”状态。
-
4、下载文件后,将使用另一个字段(files)填充results。这个字段将包含一个包含有关下载文件信息的dicts列表,例如下载的路径、原始的剪贴url(从file_urls字段中获得)和文件校验和。文件字段列表中的文件将保持原来file_urls字段的顺序。如果某些文件下载失败,将记录一个错误,文件将不会出现在files字段中。
三、媒体管道中的API
在媒体管道中,我们可以重写的方法:
- get_media_requests(item, info)
根据item中的file_urls/image_urls生成请求。
def get_media_requests(self, item, info):
for file_url in item['file_urls']:
yield scrapy.Request(file_url)
- item_completed(requests,item, info)
当item里的所有媒体文件请求完成调用。
from scrapy.exceptions import DropItem
def item_completed(self, results, item, info):
file_paths =[x['path'] for ok, x in results if ok]
if not file_paths:
raiseDropItem("Item contains no files")
item['file_paths'] =file_paths
return item
四、媒体管道的设置
-
ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1} 启用
-
FILES_STORE ='/path/to/valid/dir' 文件管道存放位置
-
IMAGES_STORE = '/path/to/valid/dir' 图片管道存放位置
-
FILES_URLS_FIELD = 'field_name_for_your_files_urls' 自定义文件url字段
-
FILES_RESULT_FIELD = 'field_name_for_your_processed_files' 自定义结果字段
-
IMAGES_URLS_FIELD = 'field_name_for_your_images_urls' 自定义图片url字段
-
IMAGES_RESULT_FIELD ='field_name_for_your_processed_images' 结果字段
-
FILES_EXPIRES =90 文件过期时间 默认90天
-
IMAGES_EXPIRES =90 图片过期时间 默认90天
-
IMAGES_THUMBS ={'small': (50, 50), 'big':(270, 270)} 缩略图尺寸
-
IMAGES_MIN_HEIGHT = 110 过滤最小高度
-
IMAGES_MIN_WIDTH = 110 过滤最小宽度
-
MEDIA_ALLOW_REDIRECTS = True 是否重定向