scrapy的MediaPipeline一般会使用FilePipeline和ImagesPipeline,都具有一下特征:
避免重新下载最近已经下载过的数据
指定储存的位置和方式
ImagesPipeline还提供了一下额外特性:
将所有下载的图片转换成通用的格式和模式
生成缩略图
检测图像的宽/高,确保他们满足最小限制
使用FilePipeline时,典型的工作流程:
1.在一个爬虫里,抓取一个item,把其中文件的URL放入file_urls内
2.item从爬虫内返回,进入Item Pipeline
3.进入后file_urls内的URL将被scrapy的调度器和下载器安排下载。
使用Images Pipeline时的工作流程是大同小异的。
使用File Pipeline:
settings中ITEM_PIPELINE中设置'scrapy.pipelines.files.FilePipeline':1
item中添加两个字段:
file_urls = scrapy.Field()
files = scrapy.Field()
settings中添加下载路径FILES_STORE、文件url所在的item字段、和文件结果信息的item字段FILE_RESULT_FIELD
FILES_STORE = 'D:\\file_path'
FILES_URLS_FIELD = 'file_urls'
FILES_RESULT_FIELD = 'files'
使用FILES_EXPIRES设置过期时间
FILES_EXPIRES = 30 #30天过期
使用ImagesPipeline大同小异,增加的额外特性使用:
使用IMAGES_THUMBS制作缩略图,使用IMAGES_EXPIRES设置过期时间:
IMAGES_THUMBS = {
'small':(50,50),
'big':(270,270)
}
IMAGES_EXPIRES = 30 #30天过期
如果想过滤过小的图片可以使用IMAGES_MIN_HEIGHT和IMAGES_MIN_WIDTH来设置图片最小高和
可以改写自己的文件名的保存方式
class MyFilesPipeline(FilesPipeline):
def file_path(self, request, response=None, info=None):
split_url = str(request.url).split('/')
kind_name = split_url[-2]
file_name = split_url[-1]
return '%s/%s'%(kind_name,file_name)
# path = urlparse(request.url).path
# return join(basename(dirname(path)),basename(path))
在settings中设置
ITEM_PIPELINES = {
#'scrapy.pipelines.files.FilesPipeline':1
'download_files.pipelines.MyFilesPipeline':1
# 'download_files.pipelines.DownloadFilesPipeline': 300,
}
也可以编写自己的文本格式来保存:
class ExcelItemExporter(BaseItemExporter):
def __init__(self,file,**kwargs):
self._configure(kwargs)
self.file = file
self.row = 0
self.wb = xlwt.Workbook()
self.sheet = self.wb.add_sheet('books')
def finish_exporting(self):
self.wb.save(self.file)
def export_item(self, item):
items = self._get_serialized_fields(item)
for col,v in enumerate(x for _,x in items):
self.sheet.write(self.row,col,v)
self.row +=1
然后在settings中配置:
FEED_EXPORTERS = {'excel':'douban_books.my_exporter.ExcelItemExporter'}
FEED_EXPORT_FIELDS = ['url','ISBN','name','author','publish','publish_time','subtitle','price','pages','series','about_author','content']
FEED_EXPORT_FIELDS 可以设置保存数据字段的顺序