
Ethan Collins
Pattern Recognition Specialist

搜索引擎结果页面(SERPs)不断变化——精选摘要轮换,人们也问框更新,AI摘要出现或消失毫无预警。需要持续访问实时SERP数据的AI搜索代理程序,用于SEO团队监控这些功能。然而,Google和其他搜索引擎部署了激进的机器人保护措施,包括reCAPTCHA和速率限制,这会阻止自动SERP监控。本指南展示了如何使用CapSolver构建AI代理的SERP功能监控管道,以保持不间断的数据收集。
SEO和GEO(生成式引擎优化)团队依赖准确、及时的SERP数据做出决策。当AI代理监控搜索结果以检测排名变化、精选摘要机会或竞争对手动态时,它需要每天执行数百或数千次搜索查询。Google的机器人检测系统会识别这种模式并触发验证挑战。
验证墙以多种形式出现:在重复查询后出现的完整页面reCAPTCHA挑战、"异常流量"的插页页面,或完全的IP封锁。根据Google的爬虫文档(无nofollow),对搜索结果的自动访问受速率限制和验证要求的约束。
对于AI搜索代理来说,这造成了一个关键的空白。代理可以出色地分析SERP数据——识别模式、检测变化、推荐行动——但它无法收集其运行所需的数据。CapSolver通过在线清除验证挑战,弥合了这一空白,使监控管道能够不间断地继续运行。
安装所需包:
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install aiohttp beautifulsoup4 pandas schedule
设置API密钥:
export CAPSOLVER_API_KEY="your-capsolver-api-key"
其他要求:
定义你的AI代理需要跟踪的SERP功能以及如何检测它们:
from dataclasses import dataclass
from typing import List, Optional
from enum import Enum
class SERPFeature(Enum):
FEATURED_SNIPPET = "featured_snippet"
PEOPLE_ALSO_ASK = "people_also_ask"
AI_OVERVIEW = "ai_overview"
LOCAL_PACK = "local_pack"
KNOWLEDGE_PANEL = "knowledge_panel"
VIDEO_CAROUSEL = "video_carousel"
IMAGE_PACK = "image_pack"
TOP_STORIES = "top_stories"
SHOPPING_RESULTS = "shopping_results"
@dataclass
class SERPResult:
keyword: str
features_detected: List[SERPFeature]
featured_snippet_url: Optional[str]
featured_snippet_text: Optional[str]
paa_questions: List[str]
ai_overview_present: bool
ai_overview_sources: List[str]
organic_positions: List[dict] # [{url, title, position}]
timestamp: float
class SERPFeatureDetector:
"""从解析的搜索结果页面中检测SERP功能。"""
def detect_features(self, html_content: str, keyword: str) -> SERPResult:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
features = []
# 精选摘要检测
snippet_div = soup.select_one('[data-attrid="wa:/description"], .xpdopen')
featured_url = None
featured_text = None
if snippet_div:
features.append(SERPFeature.FEATURED_SNIPPET)
featured_text = snippet_div.get_text(strip=True)[:500]
link = snippet_div.find('a')
featured_url = link['href'] if link else None
# 人们也问检测
paa_questions = []
paa_section = soup.select('[data-q]')
if paa_section:
features.append(SERPFeature.PEOPLE_ALSO_ASK)
paa_questions = [q.get('data-q', '') for q in paa_section[:8]]
# AI摘要检测
ai_overview = soup.select_one('[data-attrid*="ai"], .ai-overview-container')
ai_sources = []
if ai_overview:
features.append(SERPFeature.AI_OVERVIEW)
source_links = ai_overview.select('a[href]')
ai_sources = [a['href'] for a in source_links[:5]]
# 本地包检测
if soup.select_one('.VkpGBb, [data-attrid*="local"]'):
features.append(SERPFeature.LOCAL_PACK)
return SERPResult(
keyword=keyword,
features_detected=features,
featured_snippet_url=featured_url,
featured_snippet_text=featured_text,
paa_questions=paa_questions,
ai_overview_present=SERPFeature.AI_OVERVIEW in features,
ai_overview_sources=ai_sources,
organic_positions=self._extract_organic(soup),
timestamp=time.time()
)
def _extract_organic(self, soup) -> list:
results = []
for i, item in enumerate(soup.select('.g, [data-sokoban-container]')[:10], 1):
link = item.select_one('a[href^="http"]')
title = item.select_one('h3')
if link and title:
results.append({
"position": i,
"url": link['href'],
"title": title.get_text(strip=True)
})
return results
构建处理Google验证挑战的数据收集层:
import asyncio
import aiohttp
import time
import random
from capsolver_core import create_capsolver, CaptchaType, CaptchaInfo
class SERPCollector:
"""具有自动验证码处理的SERP数据收集器。"""
def __init__(self, api_key: str, proxies: list):
self.cap = create_capsolver(api_key=api_key)
self.proxies = proxies
self.proxy_index = 0
self.stats = {"queries": 0, "captchas_solved": 0, "failures": 0}
def _get_proxy(self) -> str:
proxy = self.proxies[self.proxy_index % len(self.proxies)]
self.proxy_index += 1
return proxy
async def search(self, keyword: str, location: str = "us") -> str:
"""执行Google搜索并处理验证码。"""
proxy = self._get_proxy()
url = f"https://www.google.com/search?q={keyword}&gl={location}&hl=en"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml"
}
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers, proxy=proxy, timeout=30) as resp:
html = await resp.text()
# 检查是否为验证码页面
if self._is_captcha_page(html):
html = await self._solve_and_retry(keyword, location, proxy, session)
self.stats["queries"] += 1
return html
def _is_captcha_page(self, html: str) -> bool:
"""检测响应是否为验证码挑战页面。"""
captcha_indicators = [
"unusual traffic from your computer",
"g-recaptcha",
"recaptcha/api",
"sorry/index",
"captcha"
]
return any(indicator in html.lower() for indicator in captcha_indicators)
async def _solve_and_retry(self, keyword: str, location: str, proxy: str, session) -> str:
"""解决验证码并重试搜索。"""
# Google在其挑战页面上使用reCAPTCHA v2
info = CaptchaInfo(
type=CaptchaType.RECAPTCHA_V2,
website_url="https://www.google.com/sorry/index",
website_key="6LfwuyUTAAAAAOAmoS0fdqijC2PbbdH4kjq62Y1b"
)
solution = await self.cap.solve(info)
self.stats["captchas_solved"] += 1
# 使用解决的令牌重试搜索
retry_url = f"https://www.google.com/search?q={keyword}&gl={location}&hl=en"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}
# 在重试请求中包含验证码令牌
async with session.get(retry_url, headers=headers, proxy=proxy) as resp:
return await resp.text()
async def close():
await self.cap.aclose()
CapSolver的reCAPTCHA解决指南提供了处理Google特定reCAPTCHA实现的更多细节。
将收集和检测结合起来,形成计划的监控管道:
class SERPMonitoringPipeline:
"""完整的SERP功能监控管道。"""
def __init__(self, api_key: str, proxies: list):
self.collector = SERPCollector(api_key, proxies)
self.detector = SERPFeatureDetector()
self.results_history = []
async def monitor_keywords(self, keywords: list, location: str = "us") -> list:
"""监控一批关键词的SERP功能变化。"""
results = []
for keyword in keywords:
try:
# 收集SERP数据
html = await self.collector.search(keyword, location)
# 检测功能
serp_result = self.detector.detect_features(html, keyword)
results.append(serp_result)
# 速率限制——5-10秒随机延迟
await asyncio.sleep(random.uniform(5, 10))
except Exception as e:
results.append(SERPResult(
keyword=keyword, features_detected=[],
featured_snippet_url=None, featured_snippet_text=None,
paa_questions=[], ai_overview_present=False,
ai_overview_sources=[], organic_positions=[],
timestamp=time.time()
))
self.results_history.extend(results)
return results
def detect_changes(self, current: list, previous: list) -> list:
"""比较当前和之前的結果以检测变化。"""
changes = []
prev_map = {r.keyword: r for r in previous}
for result in current:
prev = prev_map.get(result.keyword)
if not prev:
continue
# 精选摘要获得/丢失
had_snippet = SERPFeature.FEATURED_SNIPPET in prev.features_detected
has_snippet = SERPFeature.FEATURED_SNIPPET in result.features_detected
if has_snippet and not had_snippet:
changes.append(f"[获得] '{result.keyword}' 的精选摘要:{result.featured_snippet_url}")
elif had_snippet and not has_snippet:
changes.append(f"[丢失] '{result.keyword}' 的精选摘要")
# AI摘要出现/消失
if result.ai_overview_present and not prev.ai_overview_present:
changes.append(f"[新增] '{result.keyword}' 的AI摘要出现")
elif prev.ai_overview_present and not result.ai_overview_present:
changes.append(f"[移除] '{result.keyword}' 的AI摘要移除")
return changes
对于监控数百个关键词,优化成本和性能:
| 监控的关键词数 | 每日检查次数 | 月验证码数(估计) | 月成本 |
|---|---|---|---|
| 50个关键词 | 4次/天 | ~600 | $1.2-1.8 |
| 200个关键词 | 2次/天 | ~1,200 | $2.4-3.6 |
| 500个关键词 | 2次/天 | ~3,000 | $6-9 |
| 1,000个关键词 | 1次/天 | ~3,000 | $6-9 |
优化策略:
领取您的优惠码:在CapSolver仪表板使用代码 WEBS,每次充值可额外获得5%的奖励。非常适合进行大规模SERP监控的SEO团队。
CapSolver网络爬虫文档涵盖了高容量数据收集的其他基础设施模式。对于处理Cloudflare保护的搜索工具,Turnstile解决指南提供了相关的实现细节。
为AI搜索代理构建SERP功能监控需要一个验证码感知的数据收集层、一个功能检测解析器和一个变化检测系统。CapSolver 提供了清除验证的基础设施,使您的监控管道持续运行,解决Google的reCAPTCHA挑战在3-8秒内,使您的AI代理始终拥有新鲜的SERP数据进行分析。
从您优先级最高的关键词开始,验证检测准确性,然后扩展到完整的关键词覆盖。住宅代理、智能速率限制和自动验证码解决的结合,在可管理的成本下实现了98%+的数据收集可靠性。
通过适当的代理轮换和验证码解决,您可以从单个管道实例中可靠地每天监控500-1,000个关键词。限制因素通常是代理池的大小,而不是验证码解决能力。CapSolver可以处理数千个并发任务,且没有速率限制。
是的。SERP功能检测器可以识别搜索结果中的AI摘要部分。由于AI摘要出现在标准的Google搜索结果页面上,相同的采集和验证码解决方法可以捕捉到它们。跟踪哪些关键词会触发AI摘要以及哪些来源被引用。
使用住宅代理并在查询之间设置5-10秒的延迟,验证码出现率通常为5-15%。如果没有代理或查询过于频繁,可能出现率高达30-50%。良好的代理和验证码解决组合可确保接近100%的数据采集成功率。
是的。自然排名提取功能可以捕获每个关键词的前10个结果。通过您关键词集中的竞争对手网址,跟踪其排名变化、损失和新进入者。结合精选摘要跟踪,识别内容机会。
在搜索URL中设置gl(地理位置)参数以针对特定国家。Google根据此参数提供本地化结果。验证码解决方法在所有Google域名上工作方式相同——相同的reCAPTCHA系统保护所有区域版本。