过滤掉小图像¶使用图像管道时,可以删除过小的图像,方法是在 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(self, request, response=None, info=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(item, info)¶
如工作流上所示,管道将从项目中获取要下载的图像的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) 在哪里? 接收的元组列表 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(results, item, info)¶
这个 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() 方法返回项。
|