codecamp

scrapy 2.3 扩展媒体管道

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

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> .

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()​ 方法返回项。

请参见以下自定义图像管道中可以覆盖的方法:

classscrapy.pipelines.images.ImagesPipeline

这个 ​ImagesPipeline​ 是 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.images import ImagesPipeline

class MyImagesPipeline(ImagesPipeline):

    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> .

get_media_requests(iteminfo)

工作方式与 FilesPipeline.get_media_requests() 方法,但对图像URL使用不同的字段名。

必须返回每个图像URL的请求。

item_completed(resultsiteminfo)

这个 ​ImagesPipeline.item_completed()​ 当一个项目的所有图像请求都已完成时(要么已完成下载,要么由于某种原因失败),将调用方法。

工作方式与 FilesPipeline.item_completed() 方法,但使用不同的字段名存储图像下载结果。

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

scrapy 2.3 下载处理其他功能
scrapy 2.3 自定义图像管道示例
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

scrapy 2.3 链接提取器

scrapy 2.3 统计数据集合

scrapy 2.3 发送电子邮件

scrapy 2.3 蜘蛛合约

scrapy 2.3 如何部署蜘蛛

scrapy 2.3 AutoThrottle扩展

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }