使用基于项目的自定义路径下载Scrapy文件

时间:2015-11-05 15:56:49

标签: python scrapy

我想做的是非常基本的,但我无法找到实现它的方法。

我正在尝试在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作为自定义管道。

有人可以帮忙吗? 提前谢谢你:)

1 个答案:

答案 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参数以在创建文件路径时使用它。