scrapy内置图片和文件的下载方式MediaPipeline

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 可以设置保存数据字段的顺序


你可能感兴趣的:(python爬虫)