首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用 Python 追踪 Google SERP 关键词排名:从抓取到定时提醒

用 Python 追踪 Google SERP 关键词排名:从抓取到定时提醒

原创
作者头像
用户10730458
发布于 2026-10-02 16:34:44
发布于 2026-10-02 16:34:44
140
举报

做 SEO 或投放时,你最想知道的一件事往往很朴素:某个关键词排名到底涨没涨。但每天手动打开无痕窗口、切地区、翻页找自己网站,既费时间又不稳定。 这篇文章会带你用 Python 写一个小脚本,实现最基础的 Google SERP 关键词排名监控:输入关键词 + 目标域名,输出排名位置,并且能定时运行、发邮件提醒。

为什么“手动搜一下”经常不准

你看到的 Google 结果,可能和别人不一样:

  • 地区/语言不同:同一个关键词在不同国家排名差异很大
  • 个性化与缓存:历史搜索、账号状态、缓存都会影响结果
  • 时间成本高:一两个词还行,一旦要监控几十上百个词就崩了

所以更靠谱的方式是:用脚本把流程固定下来,持续做 关键词排名跟踪,把波动当成数据看。

思路:抓取搜索结果,匹配你的域名

核心逻辑很简单:

  1. 请求 https://www.google.com/search?q=关键词&num=结果数
  2. 解析页面里每条自然结果的链接
  3. 提取域名,和你的目标域名比对
  4. 找到就返回名次,找不到就提示不在 Top N

不过也要提前说一句:Google 页面结构会变、反爬也会更严格。 如果你希望更省心地拿到稳定的 SERP 数据(少踩验证码、少改解析规则),可以考虑用专门的 SERP 抓取服务来做底层数据获取: 你依然可以保留“比对域名算排名”的逻辑,只是把“拿页面 HTML”这一步交给更稳定的接口来做。

实操:requests + BeautifulSoup 写一个最小可用脚本

1)安装依赖

bash mkdir google-rank-tracker cd google-rank-tracker pip install requests beautifulsoup4

2)核心代码:查询 Top N 的排名

新建 rank_tracker.py:

python import requests from bs4 import BeautifulSoup from urllib.parse import urlparse

def normalize_domain(netloc: str) -> str: netloc = (netloc or "").lower() return netloc[4:] if netloc.startswith("www.") else netloc

def get_google_rank(keyword: str, target_domain: str, num_results: int = 20, gl: str = "us", hl: str = "en"): headers = { "User-Agent": ( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/120.0.0.0 Safari/537.36" ), "Referer": "https://www.google.com/", }

params = {"q": keyword, "num": num_results, "gl": gl, "hl": hl}

resp = requests.get("https://www.google.com/search", params=params, headers=headers, timeout=30)

resp.raise_for_status()

soup = BeautifulSoup(resp.text, "html.parser")

links = soup.select("div.yuRUbf > a")

target = normalize_domain(target_domain)

for idx, a in enumerate(links, start=1):

    href = a.get("href") or ""

    domain = normalize_domain(urlparse(href).netloc)

    if domain == target or domain.endswith("." + target):

        return idx

return None

if name == "main": keyword = "scrape prices" domain = "christian-schou.dk"

rank = get_google_rank(keyword, domain, num_results=20, gl="us", hl="en")

if rank:

    print(f"Found: {domain} ranks #{rank} for '{keyword}'")

else:

    print(f"Not found in top 20 for '{keyword}'")

这个版本的目标很明确:先跑通“关键词排名监控”的最短路径。你能稳定拿到名次后,再谈扩展到更多关键词、更多国家、更多通知方式。

想查不同国家/语言?先把“地区变量”固定住

Google SERP 在不同国家会显示不同结果,所以“排名”天然和地区绑定。 上面代码里 gl(国家)和 hl(界面语言)就是为了减少波动,让你的 Google SERP 关键词排名更可比。

当你需要同时监控多个国家时,建议把国家列表跑成循环,输出一组结果。 如果你不想自己处理地区切换、IP、封锁等细节,用现成方案会更省时间: 这样你更容易把精力放在“排名变化→行动策略”上,而不是天天修解析规则。

每天自动跑一次:让脚本变成“日更提醒”

手动运行脚本很快会忘,所以加一个定时任务更实用。这里给你一个纯 Python 的轻量做法。

先安装:

bash pip install schedule

然后新建 daily_job.py:

python import time import schedule from rank_tracker import get_google_rank

KEYWORD = "scrape prices" DOMAIN = "christian-schou.dk"

def job(): rank = get_google_rank(KEYWORD, DOMAIN, num_results=50, gl="us", hl="en") if rank: print(f"[OK] {DOMAIN} ranks #{rank} for '{KEYWORD}'") else: print(f"[MISS] Not found in top 50 for '{KEYWORD}'")

schedule.every().day.at("09:00").do(job)

if name == "main": job() while True: schedule.run_pending() time.sleep(1)

如果你已经有自己的数据管道(写数据库、出报表、推 Slack/邮件),也可以把“抓取 SERP”这步单独封装成服务化调用。 👉 把 Scrapingdog 接入你的 Python 排名追踪脚本,扩展到批量任务 当你从 1 个关键词扩展到 100 个关键词时,这种“模块化”会明显更稳、更省维护成本。

常见坑:为什么状态码 200,但解析不到结果

这是做 Google 搜索结果抓取时最常见的翻车点:

  • 返回的是同意页/验证页:看起来是 200,但页面不是你以为的 SERP
  • 页面结构变了:yuRUbf 这类结构并不是永远不变
  • 混入广告/特殊模块:你以为是第 3 条,其实自然结果可能是第 2 条
  • 地区不一致:同一台机器、不同网络,结果差距能很大

实用建议是:先把目标做小(比如只查 Top 20),再逐步加“翻页、地区、通知、存储”。一口气做全套,调试成本会飙升。

收尾:把关键词排名监控做成你的长期优势

用 Python 做 关键词排名监控,最大的价值不是“省一笔工具费”,而是把流程变成可控的系统:更稳定、更可扩展、覆盖更广。 下一步你可以尝试把结果存成 CSV/数据库,做趋势图,再结合内容更新或外链动作,形成真正可执行的 SEO 闭环。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 为什么“手动搜一下”经常不准
  • 思路:抓取搜索结果,匹配你的域名
  • 实操:requests + BeautifulSoup 写一个最小可用脚本
    • 1)安装依赖
    • 2)核心代码:查询 Top N 的排名
  • 想查不同国家/语言?先把“地区变量”固定住
  • 每天自动跑一次:让脚本变成“日更提醒”
  • 常见坑:为什么状态码 200,但解析不到结果
  • 收尾:把关键词排名监控做成你的长期优势
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档