如何使用 ProxyScrape 住宅代理进行 SEO 排名跟踪
构建一个小型 Python 排名跟踪器,通过 ProxyScrape 的轮换住宅代理池抓取 SERP,并包含重试、限流、地理定位说明以及按请求记录出口 IP。
概述
搜索引擎会根据发起请求的 IP 返回不同的结果。因此,SEO 排名跟踪所需的请求必须看起来像是来自正确位置的普通用户,而这正是轮换住宅代理池所能提供的。ProxyScrape 的住宅代理池(9700 万+ IP)会为每个请求分配一个新的出口 IP,或保持粘性会话;对于不封锁托管网段的高流量端点,其数据中心代理是更便宜的选择。
本教程将构建一个通过 ProxyScrape 读取 SERP 的最小 Python 排名跟踪器。仅抓取您被允许访问的页面,并遵守目标网站的服务条款和 robots 指令。
步骤
-
收集凭据和端口。 在 ProxyScrape 仪表板中,记下住宅网关主机、其 HTTP 和 SOCKS5 端口以及您的用户名/密码。轮换端点通常为每个请求分配一个新 IP;如果您的套餐提供粘性会话选项,仪表板会显示其语法。
-
安装依赖项。
python -m venv .venv && source .venv/bin/activate pip install requests beautifulsoup4 # 仅当您打算使用 SOCKS5 端口时才添加 PySocks: pip install "requests[socks]" -
将凭据存储为环境变量,以免它们进入源代码控制:
export PS_HOST="your-host" export PS_PORT="your-http-port" export PS_USER="your-username" export PS_PASS="your-password" -
构建代理字典。 对于 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']}" -
如果您的套餐支持,请添加地理定位。 一些住宅代理套餐允许通过在用户名后附加代码来固定国家或城市。具体语法因套餐而异,因此请使用 ProxyScrape 仪表板中显示的格式,而不是猜测。
-
带重试地抓取 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 -
有意识地限流和轮换。 保持低并发(2–5 个工作进程),在查询之间添加 2–10 秒的随机延迟,并为每个关键词使用新的请求,以便每个 SERP 来自不同的 IP。HTTP 429 或 503 响应意味着您请求过快——应放慢速度,而不是立即重试。
-
解析并存储结果。
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 文件或数据库。
-
记录每个请求的出口 IP,以便区分真正的排名变化和位置变化:
curl -x "http://USER:PASS@HOST:PORT" https://ipinfo.io/json