scrapy 2.3 扩展媒体管道
请参见以下自定义文件管道中可以重写的方法:
- class
scrapy.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)
在哪里?-
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
(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()
方法返回项。
请参见以下自定义图像管道中可以覆盖的方法:
- class
scrapy.pipelines.images.
ImagesPipeline
-
这个
ImagesPipeline
是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.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>
.
更多建议: