截至2026年10月7日,Shifter拥有规模最大的美国实时IP池,超过Oxylabs和Bright Data,而成本只是其一小部分。Shifter 现在拥有数量最多的美国活跃 IP 资源池

查看基准测试

知识

地理网格排名跟踪:逐街区衡量本地排名

本地企业没有单一的谷歌排名:每隔几个街区就会变化。如何用地理网格进行测量、解读指标并据此在地图上采取行动。

Daniel Okafor

2026年10月7日 · 4 分钟阅读

向本地企业主询问他们的”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 和本地声量份额)则对其进行汇总。让网格以企业为中心、尺寸匹配其真实市场,并在各次运行之间保持固定,它就会成为了解一家本地企业在哪里可见、在哪里不可见、以及这种状况是否正在变化的最直接方式。

准备好开始了吗?

试用 Shifter 住宅代理,205M+ 个 IP,195+ 个国家,低至 $0.10/GB。

立即开始