我想做的是非常基本的,但我无法找到实现它的方法。
我正在尝试在scrapy中使用FilesPipeline以下载文件(例如Image1.jpg)并将其保存在相对于首先放置该请求的项目的路径上(例如, item.name)。
与此问题here非常相似,但我希望将item.name或item.something字段作为参数传递,以便根据item.name将每个文件保存在自定义路径中
路径在persist_file
函数中定义,但该函数无权访问项目本身,只能访问文件请求和响应。
def get_media_requests(self, item, info): return [Request(x) for x in item.get(self.FILES_URLS_FIELD, [])]
我上面还可以看到,请求是在这里进行的,以便将文件处理到管道中,但有没有办法传递额外的参数,以便以后在
file_downloaded
上使用它然后在persist_file
函数?
作为最终解决方案,在将文件下载到以下某个管道中之后重命名/移动文件会非常简单,但它似乎很草率,不是吗?
我使用实现的代码here作为自定义管道。
有人可以帮忙吗? 提前谢谢你:)
答案 0 :(得分:0)
创建自己的管道(继承自FilesPipeline
),覆盖管道的process_item
方法,将当前项目传递给其他函数
def process_item(self, item, spider):
info = self.spiderinfo
requests = arg_to_iter(self.get_media_requests(item, info))
dlist = [self._process_request(r, info, item) for r in requests]
dfd = DeferredList(dlist, consumeErrors=1)
return dfd.addCallback(self.item_completed, item, info)
然后你需要覆盖_process_request
并继续传递item参数以在创建文件路径时使用它。