<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>dodou88 (dodou)</title>
    <link>https://www.w2solo.com/dodou88</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>我给 5 个网站做了个关键词排名监控，一个月光 API 不到 $3</title>
      <description>&lt;p&gt;我手上跑着 5 个 side project，每个都想做点 SEO。但市面上能用的排名追踪工具全是给 agency 准备的——Ahrefs $99/月起，SEMrush $130/月起。对一个还在 MVP 阶段的小项目来说，这笔钱投出去肉疼。&lt;/p&gt;

&lt;p&gt;不投的话，我完全不知道"react server components 教程"这种我花了 3 周打底的关键词，到底有没有从第 47 名爬到第 30 名。Google Search Console 数据滞后 2-3 天，免费工具又只能看自家站。&lt;/p&gt;

&lt;p&gt;所以我给自己写了一个小工具。每天早上 8 点自动跑一遍我关心的关键词，存到 SQLite 里。一共写了不到 80 行 Python。下面是过程和成本。&lt;/p&gt;
&lt;h2 id="第一次尝试：又去爬 Google"&gt;第一次尝试：又去爬 Google&lt;/h2&gt;
&lt;p&gt;老规矩，先试试自己爬。Python 写个 &lt;code&gt;requests&lt;/code&gt;，模拟浏览器，parse HTML。20 分钟后 IP 被 ban。&lt;/p&gt;

&lt;p&gt;换个方案：用 Playwright 跑 headless Chrome，加住宅代理。一个月下来：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;代理费用：$0.005/次 × 每天 100 次 × 30 天 = $15&lt;/li&gt;
&lt;li&gt;维护时间：每周大概 2 小时调试（Google 改 selector 就崩一次）&lt;/li&gt;
&lt;li&gt;失败率：30% 左右&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这还没算上"我的网站突然被 Google 标记"的风险。一个小项目不值得冒这个险。&lt;/p&gt;
&lt;h2 id="试过的 SERP API"&gt;试过的 SERP API&lt;/h2&gt;
&lt;p&gt;我对比了四个 SERP API，按"独立开发者友好"程度排：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SerpApi&lt;/strong&gt;：$50/月，5000 次。功能全，但订阅制 + 月底清零，对低频使用不友好。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serper.dev&lt;/strong&gt;：$50/月，50000 次。比 SerpApi 单价低，但同样订阅 + 清零。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DataForSEO&lt;/strong&gt;：按次 $0.0006 起，但要签合同 + 预充值 + 月结。对个人开发者来说流程太重。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SerpBase&lt;/strong&gt;：$3 买 10,000 次搜索（Starter Boost），1 个月内有效。不用订阅，$10 以上的包不过期。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;$3 = 10,000 次搜索这个组合对我正合适。我每天只用 100 次左右，10,000 次能撑一个季度。&lt;/p&gt;
&lt;h2 id="实际接入：80 行 Python"&gt;实际接入：80 行 Python&lt;/h2&gt;
&lt;p&gt;我用 &lt;code&gt;/google/search&lt;/code&gt; 端点，1 次搜索 1 credit。核心代码：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sqlite3&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"你的 key"&lt;/span&gt;
&lt;span class="n"&gt;DB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ranks.db"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_serp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"https://api.serpbase.dev/google/search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"X-API-Key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"q"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"num"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"gl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"hl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"device"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"desktop"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"organic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_my_rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_serp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;gl&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;my_domain&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"INSERT INTO ranks (date, keyword, domain, rank) VALUES (?, ?, ?, ?)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每天跑一次，把"哪个关键词、哪个网站、今天第几名"写进 SQLite。一个月下来我就有了一条完整曲线。&lt;/p&gt;
&lt;h2 id="成本核算"&gt;成本核算&lt;/h2&gt;
&lt;p&gt;我的实际用量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5 个网站 × 20 个关键词 = 100 个关键词&lt;/li&gt;
&lt;li&gt;每天 1 次 = 100 次/天&lt;/li&gt;
&lt;li&gt;30 天 = 3,000 次/月&lt;/li&gt;
&lt;li&gt;$0.30/1k 单价 = $0.90/月&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;实际上我没买按 $0.30 的 Enterprise 包——我用 $3 的 Starter Boost 撑了 3 个月（10,000 次 ÷ 3,000/月 ≈ 3 个月）。Boost 过期后我换 $10 的 Starter 包（20,000 次，$0.50/1k，不过期），又够跑半年。&lt;/p&gt;

&lt;p&gt;对独立开发者来说，这个成本结构才是友好的：先花 $3 试，跑通了再决定要不要升级。&lt;/p&gt;
&lt;h2 id="加个本地 SEO 模块"&gt;加个本地 SEO 模块&lt;/h2&gt;
&lt;p&gt;做了主流程之后，我又给其中一个本地服务类的 side project 加了地图排名监控。&lt;/p&gt;

&lt;p&gt;两个端点串着用：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;/google/maps/search&lt;/code&gt; 找商家（每次 2 credit）&lt;/li&gt;
&lt;li&gt;拿到 &lt;code&gt;feature_id&lt;/code&gt; 之后调 &lt;code&gt;/google/maps/detail&lt;/code&gt; 拿完整商家信息（每次 2 credit）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"https://api.serpbase.dev/google/maps/search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"X-API-Key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"q"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"lng"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"zoom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s"&gt;"places"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_place_detail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"https://api.serpbase.dev/google/maps/detail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"X-API-Key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"feature_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;feature_id&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s"&gt;"place"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;lat&lt;/code&gt;/&lt;code&gt;lng&lt;/code&gt;/&lt;code&gt;zoom&lt;/code&gt; 这三个参数很重要——传了之后 SERP 会模拟"在这个坐标点附近搜"的结果，跟你从 Google Maps 网页端搜的体验一致。本地 SEO 不传坐标等于白搜。&lt;/p&gt;

&lt;p&gt;加这个模块之后，我的用量翻倍——但 $3 的额度还是撑得住。&lt;/p&gt;
&lt;h2 id="几个坑"&gt;几个坑&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;desktop vs mobile&lt;/strong&gt;：SERP 的桌面端和移动端排名差异巨大。我两个都查，desktop 用来看主关键词，mobile 用来看本地化结果（Google 移动端更偏本地包）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Overview&lt;/strong&gt;：从 2025 年开始，越来越多的关键词会触发 &lt;code&gt;ai_overview&lt;/code&gt; 字段（Google 自己生成的 AI 总结）。我没把它当成一个排名——AI Overview 是抢流量的，不是抢排名的。我只追踪 organic。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IP / 语言地区差异&lt;/strong&gt;：同一个关键词 &lt;code&gt;hl=en&amp;amp;gl=us&lt;/code&gt; 和 &lt;code&gt;hl=zh&amp;amp;gl=cn&lt;/code&gt; 出来的结果完全不同。我的 SaaS 是面向全球的，所以两个区都查。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Starter Boost 限制&lt;/strong&gt;：$3 包每月只能买一次，过期 1 个月。$10 以上不限次、永不过期。记清楚。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="一点感受"&gt;一点感受&lt;/h2&gt;
&lt;p&gt;我现在的方案：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;每天早上 8 点 cron 跑一次&lt;/li&gt;
&lt;li&gt;100 个关键词 + 20 个本地商家 = 120 次搜索&lt;/li&gt;
&lt;li&gt;一个月 3,600 次 = $1.08（按 $0.30/1k 单价算）&lt;/li&gt;
&lt;li&gt;实际花了 $3（Starter Boost），撑 3 个月&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;成本几乎可以忽略。关键是现在我每天都能看到自己的排名曲线，知道哪篇文章在涨、哪篇在掉、哪个关键词被 AI Overview 抢了流量。&lt;/p&gt;

&lt;p&gt;独立开发者做 SEO 的最大障碍不是"不懂"，是"看不到"。看不到就没法迭代。$3 起步的工具就能把这件事闭环了，比 $99/月的工具更适合早期项目。&lt;/p&gt;

&lt;p&gt;新手可以先用免费 100 次额度（注册就送，不用绑卡）验证自己的查询逻辑：&lt;a href="https://serpbase.dev/register" rel="nofollow" target="_blank"&gt;https://serpbase.dev/register&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;剩下的就看你的网站到底要打什么关键词了。&lt;/p&gt;</description>
      <author>dodou88</author>
      <pubDate>Thu, 16 Jul 2026 08:23:37 +0800</pubDate>
      <link>https://www.w2solo.com/topics/7769</link>
      <guid>https://www.w2solo.com/topics/7769</guid>
    </item>
  </channel>
</rss>
