返回介绍

9.1 FilesPipeline 和 ImagesPipeline

发布于 2024-02-05 21:13:20 字数 2746 浏览 0 评论 0 收藏 0

Scrapy框架内部提供了两个Item Pipeline,专门用于下载文件和图片:

FilesPipeline

ImagesPipeline

我们可以将这两个Item Pipeline看作特殊的下载器,用户使用时只需要通过item的一个特殊字段将要下载文件或图片的url传递给它们,它们会自动将文件或图片下载到本地,并将下载结果信息存入item的另一个特殊字段,以便用户在导出文件中查阅。下面详细介绍如何使用它们。

9.1.1 FilesPipeline使用说明

通过一个简单的例子讲解FilesPipeline的使用,在如下页面中可以下载多本PDF格式的小说:

<html>
 <body>
   ...
   <a href='/book/sg.pdf'>下载《三国演义》</a>
   <a href='/book/shz.pdf'>下载《水浒传》</a>
   <a href='/book/hlm.pdf'>下载《红楼梦》</a>
   <a href='/book/xyj.pdf'>下载《西游记》</a>
   ...
 </body>
</html>

使用FilesPipeline下载页面中所有PDF文件,可按以下步骤进行:

步骤 01 在配置文件settings.py中启用FilesPipeline,通常将其置于其他Item Pipeline之前:

ITEM_PIPELINES = {'scrapy.pipelines.files.FilesPipeline': 1}

步骤 02 在配置文件settings.py中,使用FILES_STORE指定文件下载目录,如:

FILES_STORE = '/home/liushuo/Download/scrapy'

步骤 03 在Spider解析一个包含文件下载链接的页面时,将所有需要下载文件的url地址收集到一个列表,赋给item的file_urls字段(item['file_urls'])。FilesPipeline在处理每一项item时,会读取item['file_urls'],对其中每一个url进行下载,Spider示例代码如下:

class DownloadBookSpider(scrapy.Spider):
 ...

 def parse(response):
  item = {}
  # 下载列表
  item['file_urls'] = []
for url in response.xpath('//a/@href').extract():
 download_url = response.urljoin(url)
 # 将url 填入下载列表
 item['file_urls'].append(download_url)

yield item

当FilesPipeline下载完item['file_urls']中的所有文件后,会将各文件的下载结果信息收集到另一个列表,赋给item的files字段(item['files'])。下载结果信息包括以下内容:

Path文件下载到本地的路径(相对于FILES_STORE的相对路径)。

Checksum文件的校验和。

url文件的url地址。

9.1.2 ImagesPipeline使用说明

图片也是文件,所以下载图片本质上也是下载文件,ImagesPipeline是FilesPipeline的子类,使用上和FilesPipeline大同小异,只是在所使用的item字段和配置选项上略有差别,如表9-1所示。

表9-1 ImagesPipeline和FilesPipeline

ImagesPipeline在FilesPipleline的基础上针对图片增加了一些特有的功能:

为图片生成缩略图

开启该功能,只需在配置文件settings.py中设置IMAGES_THUMBS,它是一个字典,每一项的值是缩略图的尺寸,代码如下:

IMAGES_THUMBS = {
 'small': (50, 50),
 'big': (270, 270),
}

开启该功能后,下载一张图片时,本地会出现3张图片(1张原图片,2张缩略图),路径如下:

[IMAGES_STORE]/full/63bbfea82b8880ed33cdb762aa11fab722a90a24.jpg
[IMAGES_STORE]/thumbs/small/63bbfea82b8880ed33cdb762aa11fab722a90a24.jpg
[IMAGES_STORE]/thumbs/big/63bbfea82b8880ed33cdb762aa11fab722a90a24.jpg

过滤掉尺寸过小的图片

开启该功能,需在配置文件settings.py中设置IMAGES_MIN_WIDTH和IMAGES_MIN_HEIGHT,它们分别指定图片最小的宽和高,代码如下:

IMAGES_MIN_WIDTH = 110
IMAGES_MIN_HEIGHT = 110

开启该功能后,如果下载了一张105×200的图片,该图片就会被抛弃掉,因为它的宽度不符合标准。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文