DataForSEO 与仅链接 API 对比:你的 R 管道会发生什么变化
逐步拆解一个假设的管道。我们列出哪些部分会移动、哪些保持不变,以及将来源缩小为链接时会失去什么。
CranSEO 研究团队 ·

管道,分阶段
认证
我们的密钥作为查询参数或 Authorization Bearer 标头传输。免费操作不需要密钥,因此笔记本的前几个单元格任何人都可以运行。
请求
每个操作一个 GET 请求,使用 q 指定域名。分页使用 page 和 per(10 到 5000),排序使用 sort 和 order。
解析
每个响应都是包含 ok 字段的 JSON。经过身份验证的响应会添加 _credits,显示成本和剩余余额。
存储
将 tibble 和快照日期一起写入。图表大约每月刷新一次,因此日期是数据的一部分。
报告
从存储的文件渲染,而不是从实时调用渲染,因此 quarto 文档明天会显示相同的图表。
你获得什么以及你放弃什么
| 关注点 | 仅链接 API | 更广泛的提供商 |
|---|---|---|
| 范围 | 反向链接、引用域名、锚文本、顶级页面、DR | 通常添加 SERP 和关键词数据 |
| 计费 | 按调用计费,1 个信用点 = $0.0001,无订阅 | 查看其自身的价格表 |
| 新鲜度 | 大约每月刷新 | 查看其自身文档 |
| 每次调用的行数 | 最多 1,000 行,计费一次 | 因端点而异 |
| 故障信号 | HTTP 401 密钥错误,HTTP 402 无信用点 | 因情况而异 |

此类管道中代价最高的错误
大多数管道在资金上失败,而不是代码。一个每行调用一次端点的循环会将便宜的任务变成昂贵的任务。
使用我们的服务,一次调用处理 10 行或 1,000 行的成本相同,因此规则反转:请求你能使用的最大页面。将 per 设置为 1000,按你需要的内容排序,并在问题得到解答时停止分页。
深度分页上限为 50,000 行,这对于那些 tempted 提取所有数据的分析师来说是一个特性。如果一个域有超过该数量的链接,你可能更想要 toppages 或 anchors。
在庆祝之前,比较旧循环的支出与单次调用版本的支出。有时节省为零,因为旧提供商已经按请求计费。
对此拆解的结论
仅当报告范围狭窄时才缩小来源
如果 tibble 中的大多数列是链接,仅链接 API 可以移除解析代码和成本。如果一半的列是 SERP 数据,请保留你当前的提供商,并为我们添加其余部分。
- 在免费操作上保留演示单元格
- 在输出中固定快照日期
- 期望每月节奏,而非每日节奏
来自拆解的问题
我需要重写整个管道吗?
不需要。仅替换链接阶段。保留你的 SERP 和关键词阶段,将链接 tibble 写入其自己的文件,并在下游通过域名列连接两者。
浏览器笔记本的 CORS 是否开放?
是的。CORS 是开放的,因此 Shiny 应用或 Observable 单元格可以直接调用免费操作。将付费密钥保留在服务器端,因为浏览器代码中的任何内容都可以被访问者读取。
如何低成本测试故障处理?
发送一个故意错误的密钥以查看 HTTP 401 而不花费任何费用。HTTP 402 情况仅在余额为空时出现,因此在测试中模拟它,而不是耗尽信用点。
总数会与另一个提供商完全匹配吗?
不是。每个爬取工具的抓取方式不同,刷新周期也各异。请对比数量级和趋势,并将此处的 DR 视为一个独立的、内部对数刻度指标。
错误、重试及可预见的故障
故障是仅链接管道与更广泛管道看起来最相似的地方,代码往往在此处未完善。将故障路径纳入对比,因为一旦考虑错误,DataForSEO 与仅链接方案的决策就会有所不同。
需处理的 HTTP 401 和 HTTP 402
有两个状态码最为关键。HTTP 401 表示密钥缺失或错误,修复方法在于配置而非数据。HTTP 402 表示信用额度已耗尽,修复方法是从账户页面充值,而非更改代码。
将两者写为显式分支。通用的捕获会吞没状态码并写入空表,从而导致静默的部分拉取。
超时和部分文件
超时并非状态码,因此你的代码需将其视为故障。包装调用,使超时在写入任何输出之前终止运行。
写入临时文件,成功后再重命名。一个看似完整但实际未写完的文件是中断运行的最坏结果,因为没人会去质疑它。
重试与节奏控制
本页面未引用每秒请求数,因此请按每个周期的调用次数来调整管道规模。这是驱动成本的关键数字,也是你可以控制的变量。
仅对网络错误进行重试,并在尝试之间设置暂停。切勿重试 401 或 402,因为它们在下次尝试时将以相同的方式失败。
测试期间密钥的位置
将密钥保存在本地机器的环境变量和 CI 密钥存储库中,切勿保存在测试读取的文件中。免费操作无需密钥,因此任何克隆该项目的人首次运行测试都是安全的。
询问你涉及的每个管道同一个问题:谁能读取密钥,它记录在哪里?如果密钥出现在日志文件中,即使笔记本本身是私有的,这也是一种泄露。
记录每次调用的成本
每次经过身份验证的调用返回都包含 credits 字段,显示成本和剩余余额。将其复制到日志中,紧邻时间戳和操作名称,以便从文件中而非记忆中回答成本问题。
每月读取一次日志,而非每年一次。每个周期成本的缓慢上升在图表中容易被忽略,但在数字列中则显而易见。
失败的运行也应留下日志,包含状态码和停止步骤。仅记录成功的日志会隐藏你需要的行。

跨阶段计数
许多昂贵的管道错误都是计数错误。表格在连接、过滤或去重时丢失行,但随后的图表看起来仍然合理。
在每个交接处写入计数
将管道视为表格链:API 响应、解析后的 tibble、存储文件和报告。在每个交接处进行行数计数,可以显示哪个阶段丢失了行(如果有的话)。
分析师通常只在最后进行计数。到那时,原因可能位于三个阶段之前,且 tibble 已经重新格式化过两次。
每个域名一行,每个链接一行
粒度取决于操作。引用域名拉取每个链接站点一行,而反向链接拉取每个链接一行,一个站点可以发送多个链接。以错误的粒度计数,两个正确的数字看起来会不一致。
将粒度放入存储文件名或标题注释中,以便下一个人无需猜测。操作术语表 列出了每个操作的粒度。
分页与 50,000 行上限
使用 page 和 per 进行分页,每页最多支持 5000 行,但深度分页在 50,000 行处停止。期望超过此数量的拉取将被截断,其计数可能看起来异常整齐。
将收到的数量与预期的总数进行比较。当它们不同时,在归咎于源之前,请检查操作、排序和页面大小。
一个假设的计数示例
假设一个拉取请求为 30 个目标域名获取链接站点,并返回 30 行计数。与分数连接后,表格保留 27 行。在绘制任何图表之前,需要查看缺失的三行,从它们的键开始。
按名称记录这三行,而不仅仅是计数。计数告诉你行丢失了,而名称告诉你需要清理哪些键。
静默丢弃行的连接
左连接保留左表的所有行,因此缺失的分数显示为 NA 而非消失的行。内连接通过完全删除行来隐藏相同的问题。
有目的地选择连接类型,并在连接后计算 NA 分数的数量。该计数应记录在日志中,紧邻 credits 字段。
切换前的简短测试计划
运行两个源一个周期。相同的域名,相同的一天。
选取 30 个你熟悉的域名,从当前提供商和 CranSEO 获取引用域名计数,并在对数轴上绘制它们。你应该看到一条粗略的对角线,而不是精确的对角线,因为抓取方式不同,我们的刷新周期约为每月一次;DataForSEO、Ahrefs 和 Semrush 各自看到略有不同的网络。
阅读异常值,而非平均值。当我们的计数远低于时,检查该域名是否为新域名或近期迁移。当远高于时,检查子域名。术语表 定义了我们如何计算引用域名,运行手册 展示了如何将两次拉取并排存储。
首次生产运行之前
- 从环境变量读取密钥,测试覆盖密钥缺失的情况
- 对单个域名进行一次测试调用,记录其 credits 字段
- HTTP 401 和 HTTP 402 的显式分支
- 在每个阶段写入的行计数
- 在每个存储文件旁边写入快照日期