什么是分页?页面、偏移量、游标与滚动
Scrapeless Agent Browser 自动化页面导航和浏览器交互,用于从分页的公共界面收集数据。
摘要
- 分页以有界的部分返回一个集合。 导航约定决定客户端如何发现下一部分。
- 可见控件并不能标识后端算法。 加载更多界面可以使用偏移量、游标或其他延续方案。
- 排序和过滤定义了正在遍历的集合。 在中途更改它们会使已保存位置的含义失效。
- 完整捕获需要一个经过验证的结束条件。 统计接受的记录数,并报告实际观察到的来源边界。
分页将集合划分为可检索的部分
分页是将一个集合拆分为更小部分的过程,客户端分别检索或显示这些部分。搜索界面可以显示编号结果页,信息流可以在滚动时添加更多条目,API 可以返回一个延续令牌。每种设计都限制一次处理的信息量,同时为使用方提供获取更多内容的方式。
分页的原因超出了视觉页面设计的范畴。大型集合在查询、序列化、传输、解析和渲染方面都可能耗费大量时间。返回一个有界部分有助于管理这些成本。它还创建了一个客户端必须理解的约定:集合包含哪些项目,它们如何排序,下一部分如何请求,以及什么表示遍历已经结束。
分页并不意味着每一页长度相同、总数可用,或集合在遍历期间保持不变。这些属性取决于服务本身。在收集记录之前,应阅读端点或界面的行为并定义数据集边界。否则,程序即使导航正确,也可能对完整性或历史一致性做出不受支持的声明。
编号页面和偏移量体现位置式导航
页码分页根据特定的页面大小约定请求一个具名页面。偏移量分页要求服务器在返回一个有界部分之前跳过一定数量的项目。当已知它们的索引和页面大小规则时,两者可以进行算术换算,但客户端不应推断这些规则。有些接口的页码从 0 开始,有些则从 1 开始。
当人们希望在一个稳定的集合中找到熟悉的位置或直接跳转页面时,位置式接口很有用。当在请求之间添加或删除项目时,它就更难解释了。在开头附近新增一条记录会移动后续偏移量,因此消费者即使按顺序正确请求位置,也可能两次遇到同一项目或错过某个项目。
“ PostgreSQL LIMIT and OFFSET behavior ”解释了为什么需要可预测的排序,以及为什么一个很大的偏移量仍可能要求服务器计算被跳过的行。这是数据库特定的实现事实,而不是证明每个基于偏移量的 API 都很慢。应评估实际的后端和工作负载,而不是仅凭名称对接口风格进行排序。
游标体现延续边界
游标分页返回一个值,用于标识客户端在有序查询中应从哪里继续。消费者通常会原样发送该值而不去解释它。不透明游标使 API 约定独立于存储细节,而 next 链接还可以保留正确的端点和查询参数。应使用服务明确提供的任一延续机制。
AIP-158 pagination guidance 展示了一种页面令牌约定,在该约定中,请求参数在延续过程中保持一致。它还明确说明,一页包含的项目数可以少于请求数,但仍然包含另一个页面令牌。这就是为什么仅凭页面长度作为通用终止规则并不安全。文档中规定的延续字段比对页面“看起来有多满”的假设更具权威性。游标通常适用于顺序信息流和大规模有序遍历,但它们本身并不会创建固定快照。令牌可能过期,权限可能变化,可变的排序字段可能移动记录。历史导出需要来源约定在一致性和保留方面满足要求,而不仅仅是某个端点暴露了名为 cursor 的字段。
| 方法 | 延续机制 | 需要确认的问题 |
|---|---|---|
| 编号页面 | 在特定页面大小约定下的页面索引 | 编号从哪里开始,能否发生变化? |
| 偏移量 | 要跳过的记录数量 | 排序是否稳定,是否支持深度访问? |
| 游标 | 服务器提供的位置令牌或 next 链接 | 令牌有效期多长,以及何时遍历结束? |
| 加载更多 | 追加可见记录的交互 | 该控件代表什么数据请求和结束状态? |
| 无限滚动 | 由视口触发的数据加载交互 | 哪种观察可以证明新记录已经到达? |
浏览器分页是一个用户界面约定
浏览器分页描述了人或自动化如何获取另一组可见记录。下一页按钮可以导航到新文档、替换当前列表,或追加更多条目。加载更多控件可以在末尾消失,也可以保持禁用状态。无限滚动可能只在视口达到某个阈值后才触发请求。在选择自动化操作之前,应先观察这些状态。
界面无法可靠透露底层存储方式。编号页面可能调用一个 API,而无限列表可能使用偏移量而不是游标。应将可见操作和网络层的延续视为独立观察。未文档化的内部请求,并不会因为开发者工具能显示它就自动成为稳定的公共 API。
统计记录标识,而不是只依赖 DOM 元素数量。虚拟化界面可以重复利用少量元素来展示更大的集合。追加的重复项可以在不增加新记录的情况下增加元素数量。集合逻辑应识别任务所需的标识字段,并保留已观察到的卡片与新接受记录之间的区别。
排序、过滤和快照边界定义覆盖范围
只有在查询保持可识别时,分页遍历才有清晰含义。将集合名称、过滤条件、排序顺序以及任何受支持的时间边界与结果一起存储。如果用户在任务中途从一个类别切换到另一个,已保存的页面位置就不再描述同一个集合。应开始一次独立的遍历,或遵循服务对该变更的文档化行为。
这份 OpenStack 分页和排序指南 将过滤和排序视为集合接口的一部分。使用方应保留这些规则,而不是将分页视为一个孤立的循环。为了稳定遍历,当多个记录具有相同的可见排序值时,有序键需要一个确定性的决策规则。
对一个在线接口进行完整遍历时,仍然可能跨越不同的源状态。新记录会在采集期间出现,被删除的记录会消失。需要定义报告是描述固定导出中的全部记录,还是描述采集窗口期间观察到的记录。当源不提供快照保证时,应在报告中保留这一限制,而不是把成功的导航转化为更强的完整性声明。
从文档化信号中识别结束位置
结束条件告诉采集器何时不再有属于此次遍历的内容。API 可以省略下一页 token,返回一个为假的继续标志,或不提供下一页链接。浏览器可以禁用其导航控件或显示终止消息。正确的信号取决于接口,而使用方应记录它所采用的是哪一种。
HTTP Web Linking 定义了 API 可用于表达相关资源(包括导航)的链接关系。当服务返回 next 链接时,应遵循其文档化语义,而不是根据猜测的参数重建 URL。保留相关的授权边界,并避免仅仅因为响应中出现了一个链接就将凭证转发到意料之外的主机。时间限制、页数上限或屏幕内容不变,并不自动等同于来源的结束条件。它们可以是合理的任务边界,但当源中可能还有更多记录时,这些只会产生有界的部分采集。要明确标注这种差异。一个有用的结果应说明是来源结束了、预算用完了、观察窗口结束了,还是接口没有提供足够的证据以继续。
在推进检查点之前存储记录
检查点应代表已经写入持久存储的页面内容。应将查询定义与续传状态一并捕获,提交已接受记录,然后再推进已存储的位置。若反过来操作,若程序在位置更新与记录写入之间停止,就可能跳过数据。应将存储边界视为遍历设计的一部分,而不是事后补充。
在源提供稳定记录标识的情况下,使用这些标识去重。根据任务不同,URL、产品 ID 或其他有文档说明的键都可能适用。仅依赖可见标题文本通常是较弱的标识,因为标题可能重复或改变。保留源标识和观察时间,以便后续处理可以区分重复观察与外观相似但实际上不同的记录。
不要通过猜测未来的 token 来并行化单一的、相互依赖的游标链。下一个位置可能依赖于前一个响应。当源支持独立分区且合并后的范围仍然界定清晰时,可以分别处理这些分区。要考虑这些分区之间共享的请求预算,并记录足够的分区元数据,以便说明它们的结果是如何组合的。
将分页概念应用到托管浏览器
Scrapeless Agent Browser 为页面导航和交互提供浏览器环境。 Agent Browser 概览 阐述了这一能力,而你的自动化逻辑则负责定义选择器、可接受记录以及停止条件。受管浏览器不会替你决定哪些页面构成你的数据集,也不会代表你建立源快照。其中的 浏览器分页模式 区分了“下一页”控件、页码、加载更多按钮以及无限滚动。在实现具体行为之前,先使用这些模式识别接口类型。每次跳转后都要保留记录校验,以免访问提示或空的应用外壳在无声无息中变成表面上看似有效的终页。
在评估采集所需资源成本时,请查看 Scrapeless 定价 。一个假设性的类别审计可以从一组有界的、被允许访问的页面开始,记录每个被接受的产品标识,并在接口的明确终止状态处停止。生成的报告应说明观察到的类别、排序顺序、采集窗口和结束证据,以便他人评估其覆盖范围。
根据用户与数据需求选择导航方式
根据任务在导航、一致性和成本方面的需求选择分页设计。人类用户可能需要直接跳页,而自动导出则可能需要稳定的顺序遍历和可靠的续传能力。移动界面可能偏好“加载更多”,但这种便利性并不构成后端一致性保证。将展示方式与记录契约区分开来。
在扩展采集器之前,先使用一个具有代表性的授权集合验证第一次跳转、中间的一次跳转以及最终状态。检查筛选器是否保持激活,记录标识是否保持稳定。有少量但证据清晰的遍历,比一个结尾无法解释的大文件更有用。验收标准应让这些证据对数据集的使用者清晰可见。
结论
分页将导航机制与有序集合契约结合在一起。识别下一步操作,保留查询状态,在每次跳转后验证记录,并记录真实的结束位置。无论来源使用页码、不透明令牌还是动态浏览器界面,这种方法都能生成覆盖范围可评估的数据集。
构建你的 Web 数据工作流
使用 Agent Browser 浏览带有清晰记录标识、查询边界和完成证据的分页界面。
立即注册即可获得 $5 免费额度 — 无需信用卡.
领取你的 $5 额度 →常见问题解答
无限滚动是一种分页吗?
无限滚动是一种用于检索和显示集合额外部分的用户界面模式。其后端可以使用游标、偏移量或其他续传方法。应观察实际数据和终态契约,而不是仅从滚动行为推断后端算法。
空页面之后还能有下一页吗?
当 API 的契约允许时,空页面之后仍然可能有后续页面。过滤条件或服务特定行为会影响页面长度。应使用文档说明的令牌、链接或续传标记,而不是假定短页或空页就一定意味着集合已经结束。
分页能保证结果稳定吗?
仅有分页并不能保证结果稳定。排序、并发变更以及快照规则共同决定跨页的一致性。要保持筛选条件和排序顺序,使用稳定的记录标识,并报告来源是否提供了固定的数据集边界,还是一次实时遍历。
所有页面都应该并行抓取吗?
只有当页面位置可以彼此独立获取且来源允许合并后的流量时,才应并行抓取页面。游标链通常依赖前序响应。并行工作还需要共享的整体预算以及清晰的规则来协调分片覆盖范围。
什么可以证明一次分页抓取是完整的?
当达到来源定义的结束条件,且每一个被接受的页面都已存储时,分页抓取才是完整的。页面上限或时间限制是作业边界,因此当可能仍有更多来源页面时,应报告为部分结果。