scrapy中下载文件和图片
下载文件是一种很常见的需求,例如当你在使用爬虫爬取网站中的图片、视频、word、pdf、压缩包等的时候
scrapy中提供了FilesPipeline和ImagesPipeline,专门用来下载文件和图片:
我们其实可以把这两个item pipeline看成是特殊的下载器,用户使用的时候只需要通过item的一个特殊的字段就可以将要下载的文件或者图片的url传递给它们,它们会自动将文件或者图片下载到本地,并将下载的结果信息存入到item的另一个特殊的字段,方便用户在导出文件的时候查阅
FilesPipeline
使用FilesPipeline下载页面中所有的PDF文件,
- 在配置文件settings中启用FilesPipeline,通常将其至于其它的item pipeline的前面
- 在配置文件中settings中,使用FILES_STORE指定文件的下载目录
- 在spider解析一个包含文件下载链接的页面的时候,将所有的需要下载文件的url地址都收集到一个列表中,赋值给item的file_urls字段(item['file_urls'])。FilesPipeline在处理每一项item的时候会去读item['file_urls'],对其中的每一个url进行下载
当FilesPipeline下载完item['file_urls']所有的文件后,会讲各个文件的下载结果收集到另一个列表,赋值给item的files字段item['files']。下载的结果包括以下内容:
- Path:文件下载到本地的路径(相对于FILES_STORE的相对路径)。
- Checksum:文件的校验
- url:文件的url地址
ImagesPipeline
图片也是文件,所以下载图片本质上其实也是下载文件,ImagesPipeline是FilesPipeline的子类,使用上和FilesPipeline大同小异,只是在所使用的item字段和配置选项上略有差别,
ImagesPipeline在FilesPipeline的基础上针对图片增加了一些特有的功能:
- 为图片生成缩略图
- 开启这个功能,只需要在settings中设置IMAGES_THUMBS,它是一个字典,每一项的值都是缩略图的尺寸
IMAGES_THUMBS = { 'small': (50, 50), 'big': (270, 270), }
- 当你下载图片的时候,本地会出现三张图片(一张原图,两张缩略图)
- 开启这个功能,只需要在settings中设置IMAGES_THUMBS,它是一个字典,每一项的值都是缩略图的尺寸
- 过滤掉尺寸过小的图片
- 开启这个功能后,如果下载一张指定宽高的图片,该图片就会被抛弃掉,因为他的宽高不符合标准
- 需要在settings中配置IMAGES_MIN_WIDTH和IMAGES_MIN_HEIGHT,它们分别是指定图片的最小宽和高
IMAGES_MIN_WIDTH = 110 IMAGES_MIN_HEIGHT = 110
- 为图片生成缩略图