什么是基于光标的分页?
无抓取挖掘浏览器在页面交互中保持浏览器会话,以便数据工作流可以跟随基于光标的、加载更多和无限滚动状态在公共网站上。
简而言之
- 基于光标的分页将有序结果集划分为页面,并向客户端提供一个不透明的续值,表示在该排序中的位置。 典型响应包含一个项目数组以及一个下光标、一个上光标或页面信息字段,例如hasNextPage。
- 建立稳定的排序。 服务器按一个或多个字段对结果进行排序,并添加一个唯一的决胜因素。排序方向、过滤条件和范围构成遍历合同的一部分,在客户端浏览页面时应保持不变。
- 保持令牌不变。 下一个请求包括文档参数中的确切令牌。服务器验证该令牌,恢复相关边界,并在选择下一个切片之前应用相同的过滤和排序。
- 在一次遍历中保持过滤条件、账户范围、排序字段和方向不变。 重复页面通常意味着客户端发送了错误的令牌,丢弃了一个过滤器,或跟随了一个过时的续链接。
- 基于光标的分页用服务器定义的续边界替换数值位置。
定义和简短答案
基于光标的分页将有序结果集划分为页面,并向客户端提供一个不透明的续值,表示在该排序中的位置。客户端发送返回的光标以请求下一个或上一个切片。与页码不同,光标不是类似于第五页的人类可读取的位置。它是服务器定义的状态,通常源自最后一条记录的排序值快照标记或编码令牌,使服务能够有效地继续。
典型响应包含一个项目数组以及一个下光标、一个上光标或页面信息字段,例如hasNextPage。客户端必须精确保存返回的光标。解码、编辑或合成光标将客户端与实现细节关联在一起,并且当服务更改其令牌格式时可能会中断。缺少下光标或显式假结束标记通常意味着遍历已完成。
光标分页在确定性顺序下效果最佳。仅按非唯一字段(例如创建时间)排序可能会导致记录在页面边界处绑定。稳定设计添加了唯一的决胜因素,通常是不可变标识符,因此每条记录都有一个总顺序。续条件可以选择最后元组之后的记录,例如比给定的创建时间和标识符晚的值。
这种方法对于数据流和变化的数据集尤其有用。深页面不要求数据库计数并丢弃每一行早期行,在当前职位之前新插入的记录不太可能在后续页面中移动。然而,光标分页不会自动创建冻结快照。删除、对排序字段的编辑以及光标边界外的变化仍可能影响客户端所见,除非API文档说明快照语义。
光标如何在有序集上推进
- 建立稳定的排序。 服务器按一个或多个字段对结果进行排序,并添加一个唯一的决胜因素。排序方向、过滤条件和范围构成遍历合同的一部分,在客户端浏览页面时应保持不变。
- 返回第一页和令牌。 初始请求省略光标或使用文档中的起始值。服务器返回一个受限项目集和一个表示最终项目后续边界的不透明令牌。
- 保持令牌不变。 下一个请求包括文档参数中的确切令牌。服务器验证该令牌,恢复相关边界,并在选择下一个切片之前应用相同的过滤和排序。
- 在显式终止信号上停止。 当下一个光标缺失、为null或与结束标志配对时,遍历结束。客户端还应通过稳定的记录身份去重,并为格式错误或重复的令牌保持一个受限页面保护。
实际系统中的基于光标的分页
活动流
新事件可能在阅读器继续从稳定边界时到达前面,而不会改变会话下的页码。
大型API集合
键集风格的查询可以从索引排序值继续,而不是扫描深层的数值偏移。
无限滚动
用户界面可以追加每个批次,并在服务报告结束之前将下一个光标保留在内存中。
数据收集
爬虫可以在最后提交的批次旁边检查光标,并在故意停止后从已知的续状态恢复。
您常见的光标字段
并排视图防止附近概念被视为可互换。利用对比来识别哪个合同处于活动状态,然后再改变客户端或服务器行为。
| 概念或信号 | 意义 | 操作说明 |
|---|---|---|
| 下一个游标 | 下一个页面的模糊令牌 | 精确存储;在缺失时停止 |
| 上一个游标 | 上一个页面的模糊令牌 | 在支持时有利于双向导航 |
| 有下一页 | 布尔结束信号 | 与返回的游标一起使用,而不是作为游标替代品 |
| 结束游标 | 与最后一个边界相关的边界 | 在GraphQL连接响应中常见 |
| 页面大小或首个 | 请求的最大项目 | 该服务仍然可以返回更少的项目 |
基于游标的分页诊断和操作设计
重复的页面通常意味着客户端正在发送错误的令牌,丢失了过滤器,或跟随一个过时的续接链接。 当令牌可能包含敏感状态时,记录每个游标的哈希而不是完整值。 记录每页的第一个和最后一个稳定记录标识符。 如果令牌变化但项目边界不变,请检查服务器排序和平局处理。
当排序不稳定或可变字段是游标的一部分时,常常会出现缺失记录。 记录的得分或更新时间发生变化的记录可以在遍历过程中跨越当前边界。 尽可能使用不可变排序,添加唯一的打破平局者,并记录API是否承诺快照一致性或仅在实时集合中的前进。
基于浏览器的页面可能在内部网络响应中隐藏游标,而不是可见的URL。 检查页面的提取或GraphQL流量、加载更多控制和应用状态。 当令牌与cookie或会话状态绑定时,请保持相同的浏览器会话,即使返回的令牌看起来像base64或可读的JSON,也要将其视为模糊的。
基于游标的分页实施检查表
下面的检查表将概念转化为可验证的工程工作。 仅应用符合活动协议和产品合同的项目,但将证据保留在一起,以便其他工程师可以重建决策。
- 在一次遍历中保持过滤器、帐户范围、排序字段和方向不变。
- 准确存储每个续接令牌,避免从中推导页面号码。
- 通过持久的记录标识符而不是页面位置去重输出。
- 仅在相应的批次成功提交后检查点游标。
- 在文档化的结束信号上停止,并为意外循环添加一个有限页面保护。
- 记录页面边界和游标哈希,以便调查重复或跳过的段落。
- 在声称快照行为之前,在页面边界测试插入、删除和排序字段更改。
实施后,测试正常行为、边界、错误输入、缺失状态、并发活动和故意访问拒绝在受控环境中。 对每种情况记录预期状态、主体形状、结束条件和状态转换。 生产监控应报告测试期间使用的相同维度,以便将事件与已知基准进行比较。
文档应在接口的每一侧命名责任。 客户需要必需字段、稳定标识符、排序规则、限制、终端信号和错误含义。 操作员需要内部政策、存储或路由决策、可观测字段和安全的公共响应。 模糊合同导致团队在错误层面修复可见症状。
基于游标的分页常见错误
不要仅凭一个字段推导成功、缺失、权限、排序或完成,而不考虑周围的合同。 状态码、令牌、页面大小和传输头各自回答一个狭窄的问题。 响应主体、方法、身份、过滤器、协议版本和服务器文档提供其余的意义。
不要以简单为名移除诊断上下文。 省略请求标识符、目标、版本、范围或边界的简短日志行可以将一个小缺陷变成数小时的猜测。 同时,可观测性必须删除凭据、会话密钥、签名URL和敏感负载字段。
不要将临时的操作变通方案变为永久合同。 修复潜在的排序、权限、路由、节奏、框架或错误映射问题,并添加回归检查。 一个系统在失败是明确和受限时变得可靠,而不是当一次手动运行恰好完成时。
结论
基于游标的分页用服务器定义的续接边界替代了数字位置。 其优势在于稳定的排序、索引的续接查询、模糊令牌和明显的结束信号。 客户在保持游标不变、固定遍历参数、仅检查提交的页面以及区分实时数据上的前进与保证快照时取得成功。
准备构建一个更可靠的数据工作流程了吗?
将本指南中的协议概念与文档化的Scrapeless产品表面相连接,确保每个请求从提交到结果都可测量。
今天注册并获取 5美元的免费信用 — 无需信用卡.
领取您的5美元信用→常见问题
游标是否总是一个数据库记录ID?
不。 游标可以编码多个排序值、快照标记、帐户范围或服务器端状态。 客户应将其视为模糊的,仅依赖API的文档请求和响应字段。
游标分页可以直接跳到第50页吗?
通常不可以。 游标分页设计用于顺序续接,因此到达远程位置需要早期响应或单独的搜索边界的游标。 数字随机访问是偏移分页更简单的一个领域。
光标分页会导致重复吗?
不会。稳定的排序减少了页面移动,但实时更新、可变排序字段和服务行为仍然可以导致重叠。客户端应该通过稳定的记录标识进行去重,并监控页面边界。
客户端应该解码光标吗?
客户端不应该依赖解码的光标内容,除非 API 明确将格式定义为公开。一个看似可读的令牌可能会在没有通知的情况下变化,包含签名,或包含必须不被修改的状态。
爬虫应该如何继续光标分页?
将光标与提交的批次边界、过滤器、排序顺序和范围一起持久化。仅以相同的遍历参数恢复,并保留稳定的记录标识符以进行去重和审计。