使用Scrapeless Deep SerpApi构建排名跟踪器
Advanced Data Extraction Specialist
简要总结:
- 排名追踪器是一个循环,而不是一个电子表格。 针对每个关键字查询谷歌,读取自然排名,找出您的域名位置,并在日程表上写下这个数字——整个机器就是这样。
- 困难的部分是获取干净、可解析的SERP。 谷歌个性化和限速结果,因此排名追踪器需要一个搜索源,该源在每次调用时返回结构化的
organic_results,并且position和link稳定。 - Scrapeless Deep SerpApi 以 JSON 格式返回谷歌结果。 对
scraper.google.search对象执行一个POST请求,内容为{"q": "<keyword>"},返回一个organic_results数组——每个条目都携带position和link,这就是排名追踪器匹配您域名所需的一切。 - 域名匹配是主机比较,而不是字符串搜索。 解析每个结果的
link到其主机,去掉www.,然后与您的目标域名进行比较——因此blog.yourdomain.com和yourdomain.com/path都算作一个命中。 - 随时间变化的快照将位置转变为增量。 按日期存储每次运行的结果,然后与上一次存储的运行进行比较,以查看哪个关键字上升、下降或完全消失。
- 免费开始。 新的Scrapeless账户包括免费的Deep SerpApi积分——在app.scrapeless.com注册,并根据您自己的关键字集合运行本指南中的追踪器。
介绍:建立排名追踪器,而不是租用它
搜索排名是列表中的一个位置。对于给定的关键字,您的域名处于自然位置3、11或在第一页上根本没有——这个数字随着谷歌的重新排名和竞争对手的发布而变化。跟踪它的区别在于您是否知道某个页面上周从4滑落到9,或在流量已经下降时才发现。
大多数“构建排名追踪器”的指南最终都是一个您手动更新的谷歌表格,或者一个每次只抓取一个单元格的公式,一旦谷歌更改其标记就会崩溃。这对于每月检查五个关键字是有效的,但对您真正关心的关键字组则不适用,并且没有历史可以进行比较。
本指南在 Scrapeless Deep SerpApi 的基础上,用Python构建一个真正的编程排名追踪器。API以结构化的JSON格式返回谷歌的自然搜索结果,因此该追踪器保持小巧:查询一个关键字,解析位置,匹配您的域名,存储快照,并在运行之间进行差异计算。到最后,您会得到一个可以指向任何关键字集并按计划运行的脚本。
您可以用程序化排名追踪器做什么
- 按计划跟踪一组关键字。 每天或每周运行相同的脚本,检查几十个关键字,构建一个位置历史,而无需动用浏览器。
- 观察单个页面的关键字分布。 将追踪器指向一个URL的目标关键字,查看它排名的术语及其位置。
- 在流量下降之前检测下降情况。 一个位置从5移动到14是您可以在发生的当天采取行动的信号,而不是在月底才知道。
- 比较区域排名。 相同的关键字在不同国家排名不同,因此一个变化
gl参数的追踪器可显示您在每个市场的位置。 - 将排名数据输入到您自己的仪表板中。 由于每个结果都是JSON格式,位置数据可以直接导入数据库、笔记本或报告工作,无需抓取中介。
- 审计迁移或重设计。 在网站变更之前拍摄排名快照,之后进行差异比较,让回归问题以掉落关键字的列表呈现。
为什么选择Scrapeless Deep SerpApi
Scrapeless Deep SerpApi是一个管理的谷歌搜索端点,以结构化JSON的形式返回SERP,而不是原始HTML。对于排名追踪器而言,它提供了:
- 结构化的
organic_results- 每个结果都是一个带有position、title和link的对象,因此无需解析HTML,也不必担心谷歌下次布局更改时的CSS选择器崩溃。 - 稳定的
position字段 - API报告每个自然结果的排名,这是排名追踪器所记录的确切值。 - 国家和语言控制 -
gl和hl参数使您能够从一个端点测量每个市场的排名。 - 底层的住宅出口 - 搜索通过195多个国家的住宅代理进行,因此结果反映了真实用户的SERP,而不是数据中心标记的结果。
- 内联响应 -
scraper.google.search对象在同一请求中返回结果,因此追踪器可以直接读取JSON,而无需轮询步骤。
在app.scrapeless.com的免费计划中获取您的API密钥。
先决条件
- Python 3.10或更新版本
requests库(pip install requests)- 一个Scrapeless账户和API密钥——在app.scrapeless.com注册
- 一组关键字和您想跟踪的目标域名
- 对终端的基本熟悉
从环境中读取您的API密钥,以确保它不会出现在脚本中:
export SCRAPELESS_API_KEY="你的_api_token_here"
---
## 第一步 — 用一个关键词查询Google
跟踪器的最小单元是一个关键词查询。向Deep SerpApi端点发送一个`POST`请求,使用`scraper.google.search`角色和一个包含查询的`input`对象。`q`字段为关键词;`gl`和`hl`设置国家和界面语言,以便每一次运行都测量相同的市场。
```python
import os
import requests
ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"
def search(query, gl="us", hl="en"):
payload = {
"actor": "scraper.google.search",
"input": {"q": query, "gl": gl, "hl": hl},
}
response = requests.post(
ENDPOINT,
json=payload,
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
)
response.raise_for_status()
return response.json()
data = search("scrapeless scraping browser")
results = data.get("organic_results", [])
print(f"{len(results)} 个自然结果")
for result in results[:5]:
print(result["position"], result["link"])
响应是一个在单次HTTP语义中返回的JSON对象;organic_results是跟踪器读取的数组。每个元素都有一个position(页面上的排名)和一个link(结果URL)。title、snippet和source也存在,但排名跟踪器只需要position和link。
第二步 — 解析自然排名
第一步中的查询返回完整的SERP对象——自然结果,加上广告、相关搜索和Google在显示时的内联视频。跟踪器只处理organic_results,且每个条目仅需两个字段。将每个结果简化为一个(position, link)对,以便匹配步骤有一个干净的列表进行扫描。
python
def organic_positions(data):
pairs = []
for result in data.get("organic_results", []):
pairs.append((result["position"], result["link"]))
return pairs
positions = organic_positions(search("scrapeless scraping browser"))
for position, link in positions:
print(position, link)
position是Google在返回页面上分配给结果的排名。直接从字段读取,而不是计算列表索引,以便即使在API省略某个结果类型或者页面构成在不同运行间发生变化时,值仍然保持正确。
第三步 — 将你的域名匹配到排名
排名就是你的域名在该列表中的position。匹配必须基于主机,而不是URL的子字符串,因此在原始链接中搜索“yourdomain”不会错误地匹配竞争对手的路径或查询字符串。解析每个link到其主机,去掉前面的www.,并将子域视为匹配。
python
from urllib.parse import urlparse
def host_of(url):
host = urlparse(url).netloc.lower()
return host[4:] if host.startswith("www.") else host
def rank_of(domain, data):
domain = domain.lower()
for result in data.get("organic_results", []):
host = host_of(result["link"])
if host == domain or host.endswith("." + domain):
return result["position"]
return None
data = search("scrapeless scraping browser")
rank = rank_of("scrapeless.com", data)
print("scrapeless.com:", rank if rank is not None else "不在返回结果中")
rank_of返回你的域名在结果中持有的第一个位置,或者在不出现于返回结果时返回None。一个None是真实数据——它意味着该域名不在API为该关键词返回的页面上,跟踪器应该记录这一点,而不是跳过它。
在免费计划上获取你的API密钥:app.scrapeless.com
第四步 — 跟踪一组关键词并存储快照
单个关键词并不是一个跟踪器。对关键词集进行匹配,标记结果日期,并将其附加到历史文件中。每个快照都是一次运行:一个日期加上关键词到排名的映射。将它们作为列表存储可以将完整的时间线保持在一个地方,以便进行差异步骤。
python
import json
from datetime import date, timezone, datetime
from pathlib import Path
HISTORY = Path("rank_history.json")
def snapshot(domain, keywords):
ranks = {}
for keyword in keywords:
ranks[keyword] = rank_of(domain, search(keyword))
return {"date": date.today().isoformat(), "domain": domain, "ranks": ranks}
def append_snapshot(snap):
history = json.loads(HISTORY.read_text()) if HISTORY.exists() else []
history.append(snap)
HISTORY.write_text(json.dumps(history, indent=2))
return history
keywords = [
"scrapeless scraping browser",
"scrapeless deep serp api",
"anti detection cloud browser",
]
snap = snapshot("scrapeless.com", keywords)
append_snapshot(snap)
for keyword, position in snap["ranks"].items():
print(f"{position if position is not None else '—':>3} {keyword}")
每次运行都会附加一个快照。关键词集由您定义;替换页面要排名的术语。返回 None 的位置在历史记录中写为 null,因此一个掉出页面的关键词是一个记录事件,而不是一个空白。
步骤5 — 计算运行之间的排名差异
历史记录只有在您进行对比时才有用。将最新的快照与同一域的前一个快照进行比较,并对每个关键词进行分类:改善、下降、不变、新排名或掉出。差异是前一个位置减去当前一个位置,因此一个正数意味着该域在页面上升高。
python
def deltas(history, domain):
runs = [s for s in history if s["domain"] == domain]
if len(runs) < 2:
return {}
previous, current = runs[-2]["ranks"], runs[-1]["ranks"]
report = {}
for keyword, now in current.items():
before = previous.get(keyword)
if now is None and before is not None:
report[keyword] = "从结果中掉出"
elif now is not None and before is None:
report[keyword] = f"在 {now} 新排名"
elif now is not None and before is not None:
move = before - now
report[keyword] = "无变化" if move == 0 else f"{move:+d} (之前 {before}, 现在 {now})"
return report
history = json.loads(HISTORY.read_text())
for keyword, change in deltas(history, "scrapeless.com").items():
print(f"{keyword}: {change}")
在第一次运行时,没有可以进行对比的内容,因此 deltas 返回空 — 跟踪器只是存储基线。从第二次运行开始,每个关键词都有一个移动标签,您可以将其路由到警报、仪表板或每周报告中。使用 cron 或 CI 作业安排步骤 4 和步骤 5 组合,排名跟踪器可以自行运行。
您得到的结果
历史文件是跟踪器的输出:每次运行一个快照,每个快照包含日期和关键词到位置的映射。下面的形状正是 append_snapshot 所写的内容。
json
// 示例样本 — 结构完全是 append_snapshot 所写;字段值为示例。
[
{
"date": "2026-06-16",
"domain": "yourdomain.com",
"ranks": {
"您的主要关键词": 4,
"您的次要关键词": 11,
"您尚未排名的关键词": null
}
},
{
"date": "2026-06-23",
"domain": "yourdomain.com",
"ranks": {
"您的主要关键词": 2,
"您的次要关键词": 9,
"您尚未排名的关键词": 18
}
}
]
一些来自实时关键词运行的真实观察:
- 位置计数来自 API 的
position字段。 直接读取它们;不要从数组索引中推断排名,因为返回的结果混合在不同的运行之间变化。 - 有机结果的计数因查询而异。 一个关键词可能在一次运行中返回六个有机结果,另一次返回八个,因此对于深度排名的域,
None仅意味着它那天在返回的集合之下。 snippet_highlighted_words是有条件的。 一些结果携带它,另一些不携带;排名跟踪器会忽略它,但任何读取其他字段的内容都应将其视为可空。- 国家很重要。 相同的关键词在不同的
gl值下排名不同,因此每个跟踪的关键词锁定一个国家,并在运行中保持不变以便于比较。
结论:扩展您的排名跟踪管道
排名跟踪器简化为五个步骤:查询一个关键词,解析有机位置,与主机上的域匹配,存储一个带日期的快照,并与上一次运行进行对比。基于 Deep SerpApi,每个步骤读取一个结构化的 organic_results 数组,而不是与 Google 的 HTML 进行斗争,因此整个跟踪器保持在一百行以内。
从这里开始,沿着重要的轴进行扩展:扩大关键词集合,根据市场变化 gl,并将快照推送到数据库中,以便历史记录超越单个文件。同样的 JSON 优先方法扩展到 Scrapeless Scraper API 指南 中覆盖的其他表面。查看 定价计划 和 Deep SerpApi 文档 以获取完整的参数集,为每个关键词锁定一个国家,从 position 字段读取位置,并将缺失的域视为真正的 null。
准备好构建您的 AI 驱动搜索管道了吗?
加入我们的社区以获取免费计划,并与构建排名跟踪和搜索管道的开发者联系: Discord · Telegram。
在 app.scrapeless.com 注册以获取免费的 Deep SerpApi 积分,并根据项目所需的关键词集合和市场调整上述跟踪器。
常见问题解答
问:通过 API 跟踪 Google 排名是否合法?
查询公众可见的搜索结果通常是排名跟踪的方式,Deep SerpApi 返回的与浏览器相同的公开 SERP — Google 爬取和索引的排名页面,与网站所有者通过 站点地图协议 公开的 URL 集相同。不同的司法管辖区和使用案例有不同的规定,因此请在查看 Google 的条款时,也查看 机器人排除协议 中的爬取指令,并咨询您特定应用的法律顾问。
问:这与 Google Sheets 排名跟踪器有什么不同?
电子表格跟踪器一次检查一个单元格,并且不存储真实的历史记录以进行差异比较。这里的脚本以编程方式查询完整的关键词集合,记录有日期的快照,并计算运行之间的变化,因此它可以扩展到大规模的关键词集合,并按计划运行。
问:我需要代理来运行跟踪器吗?
不需要单独的代理设置。Deep SerpApi 在 195 个国家内部通过家庭出口路由搜索,因此结果反映了真实用户的 SERP,而您无需管理 IP。
问:如何跟踪特定国家的排名?
调用 search 时,将 gl 参数设置为国家代码,并将 hl 设置为语言。在多次运行中保持相同的 gl 用于给定关键词,以便位置历史进行对比。
问:null 位置是什么意思?
这意味着该域在该次运行中 API 返回的有机结果中不存在 — 要么它在返回的集合以下排名,要么它已掉出页面。跟踪器将其记录为真实事件,因此跌落将在增量中显示。
问:跟踪器应该多久运行一次?
每天或每周运行可以满足大多数需求。使用 cron 或 CI 任务安排快照和差异步骤;位置在 Google 的时间线移动,因此频繁的询问通常不会带来额外的信号。
问:我可以将子域和路径与我的域匹配吗?
可以。rank_of 匹配器会根据主机进行比较,并将子域视为命中,因此 blog.yourdomain.com 和 yourdomain.com/page 都算作您的域排名。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。


