Skip to content
intermediate

如何使用 ProxyScrape 住宅代理进行 SEO 排名跟踪

构建一个小型 Python 排名跟踪器,通过 ProxyScrape 的轮换住宅代理池抓取 SERP,并包含重试、限流、地理定位说明以及按请求记录出口 IP。

网页抓取 SEO 监测

概述

搜索引擎会根据发起请求的 IP 返回不同的结果。因此,SEO 排名跟踪所需的请求必须看起来像是来自正确位置的普通用户,而这正是轮换住宅代理池所能提供的。ProxyScrape 的住宅代理池(9700 万+ IP)会为每个请求分配一个新的出口 IP,或保持粘性会话;对于不封锁托管网段的高流量端点,其数据中心代理是更便宜的选择。

本教程将构建一个通过 ProxyScrape 读取 SERP 的最小 Python 排名跟踪器。仅抓取您被允许访问的页面,并遵守目标网站的服务条款和 robots 指令。

步骤

  1. 收集凭据和端口。 在 ProxyScrape 仪表板中,记下住宅网关主机、其 HTTP 和 SOCKS5 端口以及您的用户名/密码。轮换端点通常为每个请求分配一个新 IP;如果您的套餐提供粘性会话选项,仪表板会显示其语法。

  2. 安装依赖项。

    python -m venv .venv && source .venv/bin/activate
    pip install requests beautifulsoup4
    # 仅当您打算使用 SOCKS5 端口时才添加 PySocks:
    pip install "requests[socks]"
    
  3. 将凭据存储为环境变量,以免它们进入源代码控制:

    export PS_HOST="your-host"
    export PS_PORT="your-http-port"
    export PS_USER="your-username"
    export PS_PASS="your-password"
    
  4. 构建代理字典。 对于 HTTP 端口:

    import os
    proxy_url = f"http://{os.environ['PS_USER']}:{os.environ['PS_PASS']}@{os.environ['PS_HOST']}:{os.environ['PS_PORT']}"
    proxies = {"http": proxy_url, "https": proxy_url}
    

    对于 SOCKS5 端口,请使用 socks5h:// 方案,以便在代理端解析 DNS:

    proxy_url = f"socks5h://{os.environ['PS_USER']}:{os.environ['PS_PASS']}@{os.environ['PS_HOST']}:{os.environ['PS_SOCKS_PORT']}"
    
  5. 如果您的套餐支持,请添加地理定位。 一些住宅代理套餐允许通过在用户名后附加代码来固定国家或城市。具体语法因套餐而异,因此请使用 ProxyScrape 仪表板中显示的格式,而不是猜测。

  6. 带重试地抓取 SERP。 轮换 IP,在请求之间等待,并在失败时退避:

    import random, time, requests
    
    HEADERS = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
        "Accept-Language": "en-US,en;q=0.9",
    }
    
    def fetch_serp(keyword, num=20, attempts=3):
        for attempt in range(attempts):
            try:
                r = requests.get(
                    "https://www.google.com/search",
                    params={"q": keyword, "num": num, "hl": "en"},
                    headers=HEADERS, proxies=proxies, timeout=20,
                )
                if r.status_code == 200:
                    return r.text
            except requests.RequestException:
                pass
            time.sleep(2 ** attempt + random.random())
        return None
    
  7. 有意识地限流和轮换。 保持低并发(2–5 个工作进程),在查询之间添加 2–10 秒的随机延迟,并为每个关键词使用新的请求,以便每个 SERP 来自不同的 IP。HTTP 429 或 503 响应意味着您请求过快——应放慢速度,而不是立即重试。

  8. 解析并存储结果。

    from bs4 import BeautifulSoup
    html = fetch_serp("proxy comparison")
    soup = BeautifulSoup(html, "html.parser")
    for i, a in enumerate(soup.select("a[href^=http]"), start=1):
        print(i, a.get_text(" ", strip=True)[:80], a["href"])
    

    结果标记会随时间变化,因此在依赖选择器之前,请对照实时 DOM 验证它们。将每次运行的行(关键词、位置、URL、时间戳、出口 IP)写入 CSV 文件或数据库。

  9. 记录每个请求的出口 IP,以便区分真正的排名变化和位置变化:

    curl -x "http://USER:PASS@HOST:PORT" https://ipinfo.io/json