
Anh Tuan
Data Science Expert

Các trang kết quả tìm kiếm (SERPs) thay đổi liên tục — các đoạn trích dẫn nổi bật xoay vòng, các hộp "Câu hỏi cũng được hỏi" được cập nhật, và các phần xem xét AI xuất hiện hoặc biến mất bất ngờ. Các trợ lý tìm kiếm AI theo dõi các tính năng này cho các nhóm SEO cần truy cập liên tục vào dữ liệu SERP trực tiếp. Tuy nhiên, Google và các công cụ tìm kiếm khác triển khai các biện pháp bảo vệ bot nghiêm ngặt bao gồm reCAPTCHA và giới hạn tốc độ, chặn việc theo dõi SERP tự động. Hướng dẫn này sẽ chỉ cho bạn cách xây dựng một dòng chảy theo dõi tính năng SERP cho các trợ lý AI sử dụng CapSolver để duy trì thu thập dữ liệu không gián đoạn.
Các nhóm SEO và GEO (Tối ưu hóa Công cụ Tìm kiếm Tạo ra) phụ thuộc vào dữ liệu SERP chính xác và kịp thời để đưa ra quyết định. Khi một trợ lý AI theo dõi kết quả tìm kiếm để phát hiện thay đổi xếp hạng, cơ hội đoạn trích dẫn nổi bật hoặc di chuyển đối thủ, nó cần thực hiện hàng trăm hoặc hàng nghìn truy vấn tìm kiếm mỗi ngày. Các hệ thống phát hiện bot của Google nhận diện mô hình này và kích hoạt các thách thức xác minh.
Tường xác minh xuất hiện ở nhiều dạng: thách thức reCAPTCHA toàn trang sau nhiều truy vấn liên tiếp, trang giao diện "giao thông bất thường", hoặc chặn IP hoàn toàn. Theo tài liệu crawler của Google, truy cập tự động vào kết quả tìm kiếm bị giới hạn tốc độ và yêu cầu xác minh.
Đối với các trợ lý tìm kiếm AI, điều này tạo ra một khoảng trống quan trọng. Trợ lý có thể phân tích dữ liệu SERP một cách xuất sắc — phát hiện các mô hình, phát hiện thay đổi, đề xuất hành động — nhưng nó không thể thu thập dữ liệu cần thiết để hoạt động. CapSolver lấp đầy khoảng trống này bằng cách xóa các thách thức xác minh trực tiếp, cho phép quy trình theo dõi tiếp tục mà không gián đoạn.
Cài đặt các gói cần thiết:
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install aiohttp beautifulsoup4 pandas schedule
Thiết lập khóa API của bạn:
export CAPSOLVER_API_KEY="your-capsolver-api-key"
Yêu cầu bổ sung:
Xác định các tính năng SERP mà trợ lý AI cần theo dõi và cách phát hiện chúng:
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:
"""Phát hiện các tính năng SERP từ các trang kết quả tìm kiếm đã phân tích."""
def detect_features(self, html_content: str, keyword: str) -> SERPResult:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
features = []
# Phát hiện đoạn trích dẫn nổi bật
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
# Phát hiện hộp "Câu hỏi cũng được hỏi"
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]]
# Phát hiện phần xem xét 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]]
# Phát hiện gói địa phương
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
Xây dựng lớp thu thập dữ liệu xử lý các thách thức xác minh của Google:
import asyncio
import aiohttp
import time
import random
from capsolver_core import create_capsolver, CaptchaType, CaptchaInfo
class SERPCollector:
"""Thu thập dữ liệu SERP với xử lý CAPTCHA tự động."""
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:
"""Thực hiện tìm kiếm Google với xử lý CAPTCHA."""
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()
# Kiểm tra xem có trang CAPTCHA không
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:
"""Phát hiện xem phản hồi có phải là trang thách thức CAPTCHA không."""
captcha_indicators = [
"giao thông bất thường từ máy tính của bạn",
"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:
"""Giải CAPTCHA và thử lại tìm kiếm."""
# Google sử dụng reCAPTCHA v2 trên các trang thách thức của nó
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
# Thử lại tìm kiếm với token đã giải
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"}
# Bao gồm token CAPTCHA trong yêu cầu thử lại
async with session.get(retry_url, headers=headers, proxy=proxy) as resp:
return await resp.text()
async def close(self):
await self.cap.aclose()
Hướng dẫn giải CAPTCHA reCAPTCHA của CapSolver cung cấp thêm chi tiết về việc xử lý triển khai reCAPTCHA cụ thể của Google.
Kết hợp thu thập và phát hiện thành một quy trình theo dõi được lên lịch:
class SERPMonitoringPipeline:
"""Quy trình theo dõi toàn diện các tính năng 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:
"""Theo dõi một loạt từ khóa để phát hiện thay đổi tính năng SERP."""
results = []
for keyword in keywords:
try:
# Thu thập dữ liệu SERP
html = await self.collector.search(keyword, location)
# Phát hiện tính năng
serp_result = self.detector.detect_features(html, keyword)
results.append(serp_result)
# Giới hạn tốc độ — độ trễ ngẫu nhiên 5-10 giây
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:
"""So sánh kết quả hiện tại và trước đó để phát hiện thay đổi."""
changes = []
prev_map = {r.keyword: r for r in previous}
for result in current:
prev = prev_map.get(result.keyword)
if not prev:
continue
# Đoạn trích dẫn nổi bật được nhận được/mất đi
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"[NHẬN ĐƯỢC] Đoạn trích dẫn nổi bật cho '{result.keyword}': {result.featured_snippet_url}")
elif had_snippet and not has_snippet:
changes.append(f"[MẤT ĐI] Đoạn trích dẫn nổi bật cho '{result.keyword}'")
# Phần xem xét AI xuất hiện/biến mất
if result.ai_overview_present and not prev.ai_overview_present:
changes.append(f"[MỚI] Phần xem xét AI xuất hiện cho '{result.keyword}'")
elif prev.ai_overview_present and not result.ai_overview_present:
changes.append(f"[LOẠI BỎ] Phần xem xét AI bị xóa cho '{result.keyword}'")
return changes
Đối với theo dõi hàng trăm từ khóa, tối ưu chi phí và hiệu suất:
| Số từ khóa được theo dõi | Kiểm tra hàng ngày | CAPTCHA hàng tháng (ước tính) | Chi phí hàng tháng |
|---|---|---|---|
| 50 từ khóa | 4 lần/ngày | ~600 | $1.2-1.8 |
| 200 từ khóa | 2 lần/ngày | ~1,200 | $2.4-3.6 |
| 500 từ khóa | 2 lần/ngày | ~3,000 | $6-9 |
| 1,000 từ khóa | 1 lần/ngày | ~3,000 | $6-9 |
Chiến lược tối ưu hóa:
Nhận Mã Khuyến Mãi Của Bạn: Sử dụng mã WEBS tại Bảng điều khiển CapSolver để nhận thêm 5% khuyến mãi cho mỗi lần nạp tiền. Hoàn hảo cho các nhóm SEO chạy theo dõi SERP quy mô lớn.
Tài liệu giải mã web scraping của CapSolver đề cập đến các mô hình cơ sở hạ tầng bổ sung cho thu thập dữ liệu khối lượng lớn. Đối với các công cụ tìm kiếm được bảo vệ bởi Cloudflare, hướng dẫn giải Cloudflare Turnstile cung cấp chi tiết triển khai liên quan.
Việc xây dựng theo dõi tính năng SERP cho các trợ lý tìm kiếm AI yêu cầu lớp thu thập dữ liệu có xử lý CAPTCHA, bộ phân tích phát hiện tính năng và hệ thống phát hiện thay đổi. CapSolver cung cấp cơ sở hạ tầng xóa bỏ xác minh, giữ cho quy trình theo dõi của bạn hoạt động liên tục, giải các thách thức reCAPTCHA của Google trong 3-8 giây để trợ lý AI luôn có dữ liệu SERP mới để phân tích.
Bắt đầu với các từ khóa ưu tiên cao nhất, xác minh độ chính xác của phát hiện, sau đó mở rộng sang toàn bộ danh sách từ khóa. Sự kết hợp giữa proxy nhà ở, giới hạn tốc độ thông minh và giải CAPTCHA tự động mang lại độ tin cậy thu thập dữ liệu 98%+ với chi phí quản lý được.
Với việc quay vòng proxy hợp lý và giải CAPTCHA, bạn có thể đáng tin cậy theo dõi 500-1.000 từ khóa mỗi ngày từ một thể hiện đường ống. Yếu tố giới hạn thường là kích thước bộ lưu trữ proxy thay vì khả năng giải CAPTCHA. CapSolver xử lý hàng nghìn tác vụ đồng thời mà không bị giới hạn tốc độ.
Có. Bộ phát hiện tính năng SERP xác định các phần AI Overview trong kết quả tìm kiếm. Vì AI Overviews xuất hiện trên trang kết quả tìm kiếm tiêu chuẩn của Google, cách thu thập và giải CAPTCHA giống nhau sẽ bắt được chúng. Theo dõi các từ khóa nào kích hoạt AI Overviews và nguồn nào được trích dẫn.
Với proxy nhà ở và khoảng cách 5-10 giây giữa các truy vấn, tỷ lệ gặp CAPTCHA thường là 5-15%. Không có proxy hoặc với thời gian nhanh, tỷ lệ có thể đạt 30-50%. Sự kết hợp giữa proxy tốt và giải CAPTCHA đảm bảo thành công thu thập dữ liệu gần 100%.
Có. Trích xuất vị trí hữu cơ bắt được 10 kết quả hàng đầu cho mỗi từ khóa. Theo dõi các URL đối thủ trong bộ từ khóa của bạn để phát hiện sự tăng/giảm thứ hạng và các đối thủ mới. Kết hợp với theo dõi đoạn trích nổi bật để xác định cơ hội nội dung.
Thiết lập tham số gl (vị trí địa lý) trong URL tìm kiếm của bạn để nhắm đến các quốc gia cụ thể. Google cung cấp kết quả địa phương dựa trên tham số này. Phương pháp giải CAPTCHA hoạt động giống nhau trên tất cả các miền Google — cùng hệ thống reCAPTCHA bảo vệ các phiên bản khu vực.
Học kiến trúc gỡ mã web Rust có thể mở rộng với reqwest, scraper, gỡ mã bất đồng bộ, gỡ mã trình duyệt không đầu, xoay proxy và xử lý CAPTCHA tuân thủ.

Tự động hóa việc giải CAPTCHA với Nanobot và CapSolver. Sử dụng Playwright để giải reCAPTCHA và Cloudflare tự động.
