【WebDav】坚果云使用WebDav访问文件夹内文档大于750份无法返回问题

news/2025/2/26 17:35:48
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

坚果云分页多次加载解决办法

  • 问题
    • 坚果云使用WebDav访问限制
  • 现象
    • PropFind请求返回数据少于文件夹内数据
    • 坚果云请求响应体
    • 坚果云请求响应头
  • 结论
  • 文档遍历实现
    • python循环方式实现

问题

坚果云使用WebDav访问限制

  在批量请求时使用大部份的WebDav库请求坚果云时都会出现仅请求到前750条数据,当询问客服后得到回复是如下图所示限制:
在这里插入图片描述

现象

PropFind请求返回数据少于文件夹内数据

WebDav协议使用的请求是PropFind方法(释意如下):
  主要用于获取指定资源的属性集合。它属于WebDAV(Web Distributed Authoring and Versioning)协议的一部分,允许客户端查询与给定资源相关的元数据、配置和状态信息‌。

坚果云请求响应体

若直接请求目录会仅返回750个文件,若文件数量超过750个无法再次返回
响应体(仅返回750个数据):
坚果云响应体

坚果云请求响应头

观察响应头(值得注意的是响应头中返回了一个link字段,该字段的值为一个链接):
在这里插入图片描述
使用PropFind方法再次访问此链接(链接需要通过url编码变换后进行访问,可以看出返回了另外750行数据):
在这里插入图片描述

结论

  由上述现象可以发现,请求时若数据过多(超过750条)会在响应头中带上link字段(即下一组数据的访问链接),故多页多次加载最简单的实现方式仅需要使用递归请求(展平为循环请求)即可拿到文件夹内所有的数据。

  • 1.QPM数限制:请求时注意请求次数限制1500/30min的请求次数,超过请求限制,需要等待解封获取数据时间变长。
  • 2.按需请求:请求时应注意避免过度请求数据导致数据返回时间长,可计算后按需请求,例如仅需要文件夹内前850份数据单文件内有2800份数据,那仅需请求两次即可,无需请求四次拿到全量数据。

文档遍历实现

python循环方式实现

class DavClient:
    """
    默认:1500/30min
    """
    def __init__(self, dav_url, username, password, req_frequency=100):
        auth_str = f'{username}:{password}'
        auth_bytes = auth_str.encode('ascii')
        auth_base = base64.b64encode(auth_bytes).decode('ascii')
        self.headers = {'Authorization': f'Basic {auth_base}'}
        self.dav_url = dav_url
        self.req_frequency = req_frequency

    def _req_data(self, step_url) -> tuple[str, str, str]:
        response = requests.request('PROPFIND', step_url, headers=self.headers, verify=False)
        # 获取响应头link及rel
        next_link = ""
        rel = ''
        if "Link" in response.headers:
            link_str = response.headers.get("Link")
            next_link, rel = re.findall(pattern="<(.*)>; rel=\"(.*)\"", string=link_str)[0]
        response.raise_for_status()
        return unquote(next_link), rel, response.text

    def _analysis_res_data(self, response_text):
        tree = ElementTree.fromstring(response_text)
        namespace = {'d': 'DAV:'}
        file_data_list = [{"fileName": response.find('.//d:displayname', namespace).text, "href": unquote(response.find('d:href', namespace).text)} for response in tree.findall('d:response', namespace)]
        return file_data_list

    def ls(self, path, detail: bool=False):
        """
        QPM: 控制请求速率,防止失败 50qpm
        """
        document_list = []
        current_link = f'{self.dav_url}{path}'
        req_count = 0
        std_qpm = self.req_frequency / 60
        start_time = time.perf_counter()
        while current_link:
            end_time = time.perf_counter()
            delta_time = end_time - start_time
            print("QPM", std_qpm, req_count, delta_time, req_count / delta_time)
            if delta_time == 0 or (std_qpm > (req_count / delta_time)):
                req_count += 1
                next_link, rel, res_text = self._req_data(step_url=current_link)
                current_link = next_link
                file_list = self._analysis_res_data(res_text)
                document_list.extend(file_list)
            else:
                print(f'停一下{req_count}')
                time.sleep(1)
        return document_list

http://www.niftyadmin.cn/n/5868994.html

相关文章

Fisher信息矩阵与Hessian矩阵:区别与联系全解析

Fisher信息矩阵与Hessian矩阵&#xff1a;区别与联系全解析 在统计学和机器学习中&#xff0c;Fisher信息矩阵&#xff08;FIM&#xff09;和Hessian矩阵是两个经常出现的概念&#xff0c;它们都与“二阶信息”有关&#xff0c;常用来描述函数的曲率或参数的敏感性。你可能听说…

AI 编码 2.0 分析、思考与探索实践:从 Cursor Composer 到 AutoDev Sketch

在周末的公司【AI4SE 效能革命与实践&#xff1a;软件研发的未来已来】直播里&#xff0c;我分享了《AI编码工具 2.0 从 Cursor 到 AutoDev Composer》主题演讲&#xff0c;分享了 AI 编码工具 2.0 的核心、我们的思考、以及我们的 AI 编码工具 2.0 探索实践。 在这篇文章中&am…

docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结

官方网站 官方网址&#xff1a;etcd 二进制包下载&#xff1a;Install | etcd GitHub社区项目&#xff1a;etcd-io GitHub GitHub社区项目版本历史&#xff1a;Releases etcd-io/etcd GitHub 一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令…

【PGCCC】PostgreSQL 的弊端(第一部分):临时表

PostgreSQL 是世界上最强大的数据库系统之一。我一直对它的强大功能充满热情&#xff0c;尤其是它的现代 SQL 语言功能。 然而&#xff0c;这并不意味着一切都很好。有些地方还是很麻烦。新手用户如果不知道这个问题&#xff0c;可能会遇到麻烦&#xff0c;而且我发现这种情况…

【含文档+PPT+源码】基于微信小程序的农产品自主供销商城系统

项目介绍 本课程演示的是一款基于微信小程序的农产品自主供销商城系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3…

基于RISC-V内核完全自主可控国产化MCU芯片

国科安芯MCU芯片采用开放、灵活的RISC-V指令集架构&#xff0c;RISC-V的开源特性不仅大幅降低研发成本&#xff0c;更赋予芯片设计高度定制化能力。例如&#xff0c;国科安芯的AS32S601抗辐照MCU基于32位RV32IMZicsr指令集&#xff0c;主频达180MHz&#xff0c;内置2MB Flash与…

使用 Containerd 通过 HTTP 协议拉取 Harbor 私有镜像仓库的镜像

在 Kubernetes 1.24及以上版本环境中&#xff0c;docker不再被支持&#xff0c;主要使用Containerd 是常用的容器运行。默认情况下&#xff0c;Containerd 使用 HTTPS 协议与镜像仓库通信。然而&#xff0c;在某些场景下&#xff08;如测试环境或内部网络&#xff09;&#xff…

【TVM教程】为 NVIDIA GPU 自动调度神经网络

Apache TVM 是一个深度的深度学习编译框架&#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者&#xff1a;Lianmin Zheng 针对特定设备和工作负载的自动调优对于获得最佳性能至关重要。本文介绍如何使用 auto-sched…