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

标签 python scrapy

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

我正在尝试使用 FilesPipeline在 scrapy 中以下载文件(例如 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, [])]

I can also see above, that the request is made here in order to process the files into the pipeline, but is there a way to pass an extra argument in order to later use it on the file_downloaded and afterwards on persist_file function?

作为最终的解决方案,在以下管道之一下载文件后重命名/移动文件会非常简单,但它看起来很草率,不是吗?

我正在使用实现的代码 here作为自定义管道。

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

最佳答案

创建自己的管道(继承自 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 参数以在创建文件路径时使用它。

关于python - 使用基于项目的自定义路径下载 Scrapy 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549187/

相关文章:

Python,双重自动枚举defaultdict

python - 如何在python中将字符串数组拆分为二维字符数组

python - Scrapy:所有的爬虫都失败了。有语法错误的爬虫

input - 在Scrapy中获取输入值

python - scikit-learn svmlight 格式加载器中的弃用警告

Python pandas 记录来自雅虎财经的股息信息

python - 避免重定向

python - Scrapy/crawling - 检测蜘蛛陷阱或无限网站

python - azure 函数绑定(bind)日期时间昨天

python - 如何在 Scrapy Spider 中使用 Request 函数?