笨鸟编程-零基础入门Pyhton教程

 找回密码
 立即注册

下载和处理文件和图像

发布者: 笨鸟自学网



过滤掉小图像

使用图像管道时,可以删除过小的图像,方法是在 IMAGES_MIN_HEIGHT 和 IMAGES_MIN_WIDTH 设置。

例如::

IMAGES_MIN_HEIGHT = 110
IMAGES_MIN_WIDTH = 110

注解

大小约束根本不影响缩略图的生成。

可以只设置一个大小约束或同时设置两个大小约束。当同时设置这两种尺寸时,将只保存满足这两种最小尺寸的图像。对于上面的示例,大小为(105 x 105)或(105 x 200)或(200 x 105)的图像都将被删除,因为至少有一个维度比约束短。

默认情况下,没有大小约束,因此所有图像都会被处理。

允许重定向

默认情况下,媒体管道忽略重定向,即HTTP重定向到媒体文件URL请求将意味着媒体下载失败。

要处理媒体重定向,请将此设置设置为 True ::

MEDIA_ALLOW_REDIRECTS = True

扩展媒体管道

请参见以下自定义文件管道中可以重写的方法:

classscrapy.pipelines.files.FilesPipeline
file_path(selfrequestresponse=Noneinfo=None*item=None)

每个下载的项调用一次此方法。它返回源于指定的 response .

除了……之外 response ,此方法接收原始的 request , info 和 item

可以重写此方法以自定义每个文件的下载路径。

例如,如果文件URL以常规路径结束(例如 https://example.com/a/b/c/foo.png ,您可以使用以下方法将所有文件下载到 files 文件夹及其原始文件名(例如 files/foo.png ):

import os
from urllib.parse import urlparse

from scrapy.pipelines.files import FilesPipeline

class MyFilesPipeline(FilesPipeline):

    def file_path(self, request, response=None, info=None, *, item=None):
        return 'files/' + os.path.basename(urlparse(request.url).path)

同样,您可以使用 item 根据某些项属性确定文件路径。

默认情况下 file_path() 方法返回 full/<request URL hash>.<extension> .

2.4 新版功能: 这个 item 参数。

get_media_requests(iteminfo)

如工作流上所示,管道将从项目中获取要下载的图像的URL。为此,可以重写 get_media_requests() 方法并返回每个文件的请求URL::

from itemadapter import ItemAdapter

def get_media_requests(self, item, info):
    adapter = ItemAdapter(item)
    for file_url in adapter['file_urls']:
        yield scrapy.Request(file_url)

这些请求将由管道处理,下载完成后,结果将发送到 item_completed() 方法,作为2元素元组的列表。每个元组将包含 (success, file_info_or_error) 在哪里?

  • success 是一个布尔值,它是 True 如果图像下载成功或 False 如果因为某种原因失败了

  • file_info_or_error 是包含以下键的dict(如果成功是 True 或A Failure 如果有问题的话。

    • url -从中下载文件的URL。这是从 get_media_requests() 方法。

    • path -路径(相对于 FILES_STORE )文件的存储位置

    • checksum -A MD5 hash 图像内容的

    • status -文件状态指示。

      2.2 新版功能.

      它可以是以下类型之一:

      • downloaded -文件已下载。

      • uptodate -根据文件过期策略,文件未下载,因为它是最近下载的。

      • cached -文件已被共享同一文件的另一个项目计划下载。

接收的元组列表 item_completed() 保证保留从 get_media_requests() 方法。

以下是 results 论点:

[(True,
  {'checksum': '2b00042f7481c7b056c4b410d28f33cf',
   'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg',
   'url': 'http://www.example.com/files/product1.pdf',
   'status': 'downloaded'}),
 (False,
  Failure(...))]

默认情况下 get_media_requests() 方法返回 None 这意味着该项目没有可下载的文件。

item_completed(resultsiteminfo)

这个 FilesPipeline.item_completed() 当单个项的所有文件请求都已完成时调用的方法(要么已完成下载,要么由于某种原因失败)。

这个 item_completed() 方法必须返回将发送到后续项管道阶段的输出,因此必须返回(或删除)该项,就像在任何管道中一样。

下面是一个 item_completed() 方法,将下载的文件路径(传入结果)存储在 file_paths 项目字段,如果该项目不包含任何文件,则将其删除::

from itemadapter import ItemAdapter
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:
        raise DropItem("Item contains no files")
    adapter = ItemAdapter(item)
    adapter['file_paths'] = file_paths
    return item

默认情况下, item_completed() 方法返回项。


上一篇:调试内存泄漏下一篇:部署蜘蛛

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2024-9-8 13:06 , Processed in 0.017001 second(s), 17 queries .

© 2001-2020

返回顶部