向本地企业主询问他们的”emergency plumber”排名,他们通常只会给出一个数字,往往是他们从自己办公室搜索时看到的那个。这个数字是真实的,但它只描述了地图上的一个点。Google 对本地结果的排名部分取决于与搜索者的距离,因此同一家企业可能在自己所在的街道上排名第一,在一英里外排名第八,而在城市的另一端则完全消失。
地理网格(geo-grid)通过同时从多个点测量排名来解决这个问题。你在企业服务的区域上铺设一个坐标网格,从每个点运行相同的地图搜索,并记录该企业出现的位置。结果是一张排名地图,而不是一个单一的排名,它能准确显示企业在哪里胜出,在哪里消失。
本指南将介绍如何设计网格、运行它所需的代码、如何解读团队从中得出的三个指标,以及会让网格产生误导的常见错误。
为什么一个排名数字是不够的
Google 自己的指南指出了影响本地结果的三个因素:相关性(列表与搜索的匹配程度)、距离(结果与搜索者或搜索中指定位置的距离)和知名度(企业的知名程度,来自评论、链接和其他信号)。相关性和知名度在相邻街区之间几乎不变。而距离在每走一步都会变化。
这使得本地排名成为一个曲面,而非一个数字。一家资料完善的牙医诊所可能在整个区域占据前三名,而一个较新的竞争对手只在自家门口附近有排名。从办公室进行一次检查会掩盖这两个事实。城市层面的检查也是如此:询问”芝加哥”的结果会把本地企业最关心的那种变化平均掉。
如果你想了解位置如何更广泛地影响搜索结果,我们关于本地 SEO 地理定位 SERP API 的指南涵盖了从国家到坐标的粒度阶梯。地理网格正位于这个阶梯的最后一级。
设计网格
网格有三个设置项,每一个都会改变地图能告诉你的信息。
| 设置 | 它控制什么 | 合理的起点 |
|---|---|---|
| 尺寸 | 每边的点数(7 表示 7 x 7 = 49 个点) | 社区型企业用 7,服务区域型企业用 9 到 13 |
| 间距 | 相邻点之间的距离 | 密集城市 0.5 到 1 公里,郊区和农村地区 2 到 5 公里 |
| 缩放 | 执行搜索时的地图缩放级别 | 街道级别用 15,更广区域用 13 |
三条规则能保证网格的可靠性:
- 使用奇数尺寸,并将其以企业为中心。 这样中间的点就正好位于该地址上,地图就能始终显示最佳情况以及周边的一切情况。
- 将间距与人们实际搜索的方式相匹配。 一家咖啡店在步行距离内竞争;一家屋顶公司则在整个县范围内竞争。网格太密只会显示一片绿色,太宽则只会显示大量空单元格。
- 在各次运行之间保持所有设置不变。 尺寸、间距、缩放、关键词、语言和设备必须保持完全一致,否则两张地图无法比较。
代码
下面的模块构建网格,为每个点准备一次地图搜索,在每个响应中找到该企业,并汇总结果。它仅使用标准库。
import math
EARTH_RADIUS_KM = 6371.0088
NOT_FOUND = 21 # one past the 20 places a Maps search returns
def grid_points(lat, lng, size=7, spacing_km=1.0):
"""A size x size grid centred on (lat, lng), points spacing_km apart."""
if size % 2 == 0:
raise ValueError("size must be odd so the business sits on the centre point")
half = size // 2
points = []
for row in range(size):
for col in range(size):
north_km = (half - row) * spacing_km
east_km = (col - half) * spacing_km
p_lat = lat + math.degrees(north_km / EARTH_RADIUS_KM)
p_lng = lng + math.degrees(east_km / (EARTH_RADIUS_KM * math.cos(math.radians(p_lat))))
points.append({"row": row, "col": col, "lat": round(p_lat, 6), "lng": round(p_lng, 6)})
return points
def maps_params(keyword, lat, lng, zoom=15, api_key="YOUR_API_KEY"):
"""Query parameters for one Google Maps search seen from (lat, lng)."""
return {
"engine": "google_maps",
"api_key": api_key,
"q": keyword,
"type": "search",
"ll": f"@{lat},{lng},{zoom}z",
"hl": "en",
}
def rank_of(response, place_id):
"""Position of the business in one response, or None when it is not listed."""
for place in response.get("places_results", []):
if place.get("place_id") == place_id:
return place.get("position")
return None
def summarise(ranks, top=3):
"""ranks: one rank (or None) per grid point."""
found = [r for r in ranks if r is not None]
return {
"points": len(ranks),
"found": len(found),
"arp": round(sum(found) / len(found), 2) if found else None,
"atrp": round(sum(r if r is not None else NOT_FOUND for r in ranks) / len(ranks), 2),
"solv": round(sum(1 for r in found if r <= top) / len(ranks), 3),
}
def render(points, ranks, size):
"""The grid as text, north at the top: rank per point, '--' when not found."""
cells = {(p["row"], p["col"]): r for p, r in zip(points, ranks)}
return "\n".join(
" ".join(f"{cells[(row, col)]:>2}" if cells[(row, col)] is not None else "--" for col in range(size))
for row in range(size)
)
grid_points 在球面上将公里转换为度数,因此无论纬度如何,间距都保持均匀,而不会随着远离赤道而拉伸。第 0 个点是西北角,行从北到南排列。
对一个企业和一个关键词运行这个程序只需一个简短的循环。每个点通过 Shifter 的 SERP API 变成一次 Google Maps 搜索,坐标通过 ll 参数传递,这样搜索就会从该点发起:
import json
import os
import time
import requests
from geogrid import grid_points, maps_params, rank_of, render, summarise
API = "https://serp.shifter.io/v1"
KEYWORD = "emergency plumber"
PLACE_ID = "ChIJ_YOUR_PLACE_ID" # the business you are tracking
CENTER = (41.8781, -87.6298) # its address
SIZE, SPACING_KM = 7, 1.0
points = grid_points(*CENTER, size=SIZE, spacing_km=SPACING_KM)
ranks = []
for p in points:
params = maps_params(KEYWORD, p["lat"], p["lng"], api_key=os.environ["SERP_API_KEY"])
response = requests.get(API, params=params, timeout=60).json()
ranks.append(rank_of(response, PLACE_ID))
time.sleep(0.2)
print(render(points, ranks, SIZE))
print(json.dumps(summarise(ranks)))
要匹配到正确的列表,请使用企业的 place_id 而非其名称:名称会重复出现,连锁店也会共用同一名称。你可以在任何包含该企业的地图响应中找到 place_id。
我们针对一个合成响应器测试了该模块,该响应器根据与中心点的距离对企业进行排名,且东侧略弱。输出如下所示(这些数字来自合成测试,而非真实企业):
12 10 9 8 11 12 14
10 8 6 6 8 10 12
9 6 4 3 6 8 11
8 6 3 1 5 8 10
9 6 4 3 6 8 11
10 8 6 6 8 10 12
12 10 9 8 11 12 14
{"points": 49, "found": 49, "arp": 8.31, "atrp": 8.31, "solv": 0.082}
这个模式正是真实网格所呈现的:在地址处最强,随距离衰减,并且在不同方向上不均匀。
解读地图:三个指标
团队用三个数字来汇总一个网格,每个数字回答一个不同的问题。
| 指标 | 计算方式 | 它告诉你什么 |
|---|---|---|
| ARP,平均排名位置 | 在企业出现的各点上的排名平均值 | 在它确实有排名的地方排名有多好 |
| ATRP,平均总排名位置 | 在所有点上的排名平均值,“未找到”计为 21 | 整个区域的整体可见度 |
| SoLV,本地声量份额 | 企业排名进入前 3 的点所占的比例 | 它在地图包中占据了多少版图 |
这些指标需要结合起来看。一个只在五个点被找到、且全部进入前三的企业,ARP 优秀但 ATRP 很差。地图揭示了原因:它主导一个小区域,而在其他地方毫无踪迹。这指向的是距离问题,而非相关性问题,改进页面内容并不能解决它。
对于依赖地图包(Google 在常规列表上方显示的三个本地结果)的企业来说,SoLV 最为重要。第四到第二十名的结果虽然存在于完整的地图列表中,但滚动到那么远的搜索者要少得多。
利用网格做决策
一次性的网格是一次诊断。反复进行的网格才是价值所在。
- 在同一网格上与竞争对手进行比较。 对在中心点击败你的那两三家企业运行相同的点位。它们的地图通常会显示,某个竞争对手凭借知名度取胜(一个大而均匀的区域),而你凭借距离优势取胜。
- 衡量行动之后的变化。 新的评论、更正的分类或修正的地址,应该在几周后体现为更大的绿色区域。没有固定的网格,你就无法区分改进与噪声。
- 追踪边缘地带。 企业强势区域边界上的单元格会最先发生变化,无论是向好还是向坏。观察它们比观察中心能更早地发出预警。
- 仔细检查服务区域型企业。 隐藏地址、上门为客户提供服务的企业,其排名往往与实体店大相径庭。更宽的网格能显示它们是否在客户所在的地方出现。
对大多数企业来说,每周运行一次就足够了。本地排名确实每天都会变动,但在固定设置下每周运行一次就能展示趋势,而无需为每一次波动付费。如果你同时还在跟踪常规自然排名,我们关于检测 SERP 波动的指南介绍了如何区分真实的变动与日常噪声。
会让网格产生误导的错误
- 在关键词中加入城市名称进行搜索。 “Plumber Chicago” 会告诉 Google 要在哪里搜索,从而覆盖该点的位置设定。应使用附近搜索者会用的那种普通服务词语。
- 在不同运行之间混用设备或语言。 移动端和桌面端的地图结果不同。选定一种并保持一致。
- 把”未找到”当作第 20 名处理。 一个完全没有出现的企业,比排在第二十名的企业更差。应单独计数,就像 ATRP 用 21 来处理那样,并报告被找到的点数。
- 在水域或空地上运行网格。 位于湖泊或森林中的点会增加永远不会有客户从那里搜索的单元格。在求平均值之前应移动中心点或剔除这些单元格。
- 把单次运行的结果当作真相。 相同的搜索之间结果会略有差异。应依据跨多次运行都成立的模式采取行动,而不是依据单个单元格颜色的变化。
关于更干净、更一致的排名测量(个性化、设备和时间)的更广泛内容,请参阅如何测量准确的关键词排名。
成本与规模
网格的成本就是点数乘以关键词数乘以运行次数。一个 7 x 7 的网格每个关键词需要 49 次搜索。每周跟踪十个关键词就是每周 490 次搜索,即每月约 2,100 次。对同样的十个关键词使用 13 x 13 网格,则每周需要 1,690 次搜索。
这笔账是应当刻意选择网格尺寸的主要原因。先从一个 7 x 7 的网格开始,针对带来客户的关键词进行跟踪,只对那些地图边缘仍在变化的关键词扩大网格。
常见问题
地理网格应该有多少个点?
对于服务一个社区的企业来说,一个 7 x 7 的网格(49 个点)通常就足够了。服务整个城市或整个县的企业需要更大的间距,有时需要 9 x 9 到 13 x 13 的网格,才能看清其可见度的边界在哪里。
地理网格和按邮政编码检查排名是一回事吗?
不是。按邮政编码检查是对一个区域运行一次搜索并返回一个排名。地理网格则是从每个坐标运行一次搜索,因此能显示排名在一个区域内部是如何变化的,而这正是基于距离的本地结果所依赖的东西。
为什么我的企业在办公室排名第一,但在城市另一端却没有排名?
距离是 Google 本地结果中的主要因素之一。在地址附近,距离对你有利。而在更远的地方,离搜索者更近或者更知名的竞争对手会占据前排位置。
我应该多久运行一次地理网格?
对大多数企业来说,每周一次就足够了。在重大变化(例如新评论或更正的企业分类)发生几周后,再额外运行一次网格,看看强势区域是否有所扩大。
结论
本地排名是一张地图,而不是一个数字。地理网格通过从多个点进行相同的搜索来测量这张地图,而三个指标(ARP、ATRP 和本地声量份额)则对其进行汇总。让网格以企业为中心、尺寸匹配其真实市场,并在各次运行之间保持固定,它就会成为了解一家本地企业在哪里可见、在哪里不可见、以及这种状况是否正在变化的最直接方式。