
Emma Foster
Machine Learning Engineer

Hasil pencarian Google terus berubah—peringkat bergeser, snippets yang ditampilkan berputar, kompetitor baru muncul, dan Tinjauan AI diperbarui tanpa pemberitahuan. Mendeteksi perubahan ini secara real time memberikan keunggulan kritis bagi tim SEO: merespons penurunan peringkat dalam beberapa jam, memanfaatkan kehilangan kompetitor secara langsung, dan melacak dampak pembaruan konten segera setelah terjadi. Panduan ini membahas pembuatan sistem deteksi perubahan SERP otomatis menggunakan CapSolver untuk mempertahankan akses terus-menerus ke hasil pencarian Google.
Peringkat mesin pencari tidak statis. Untuk kata kunci kompetitif, posisi berubah beberapa kali per minggu saat Google mengevaluasi ulang kualitas konten, kekinian, dan sinyal otoritas. Halaman yang berada di posisi 3 hari ini mungkin turun ke posisi 8 besok—atau melonjak ke posisi 1—tergantung tindakan kompetitor, pembaruan algoritma, atau penurunan kekinian konten.
Tanpa deteksi perubahan otomatis, tim SEO menemukan perubahan peringkat beberapa hari atau minggu terlambat—seringkali hanya ketika laporan lalu lintas menunjukkan penurunan. Pada saat itu, jendela kompetitif untuk merespons telah tertutup. Dokumentasi Google tentang cara kerja pencarian membenarkan bahwa indeks terus diperbarui, artinya peringkat dapat berubah kapan saja.
Tantangan untuk pemantauan otomatis adalah perlindungan bot Google. Setelah 50-100 pencarian otomatis, Google menampilkan tantangan reCAPTCHA atau memblokir IP. CapSolver menyediakan lapisan penyelesaian verifikasi yang memungkinkan pemantauan SERP terus-menerus dan andal dalam skala besar.
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install aiohttp beautifulsoup4 pandas schedule
export CAPSOLVER_API_KEY="your-capsolver-api-key"
Persyaratan tambahan:
from dataclasses import dataclass, field
from typing import List, Optional
import time
@dataclass
class SERPSnapshot:
keyword: str
timestamp: float
organic_results: List[dict] # [{position, url, title}]
featured_snippet: Optional[dict]
ai_overview_present: bool
paa_questions: List[str]
@dataclass
class SERPChange:
keyword: str
change_type: str # ranking_gained, ranking_lost, snippet_gained, snippet_lost, new_competitor
details: dict
detected_at: float
severity: str # high, medium, low
class SERPChangeDetector:
"""Deteksi perubahan dalam hasil pencarian Google seiring waktu."""
def __init__(self):
self.snapshots = {} # keyword -> list of SERPSnapshot
def detect_changes(self, keyword: str, current: SERPSnapshot) -> List[SERPChange]:
"""Membandingkan snapshot saat ini dengan sebelumnya dan mendeteksi perubahan."""
changes = []
previous_list = self.snapshots.get(keyword, [])
if not previous_list:
self.snapshots[keyword] = [current]
return []
previous = previous_list[-1]
# Deteksi perubahan peringkat untuk URL yang ditelusuri
prev_positions = {r["url"]: r["position"] for r in previous.organic_results}
curr_positions = {r["url"]: r["position"] for r in current.organic_results}
for url, curr_pos in curr_positions.items():
prev_pos = prev_positions.get(url)
if prev_pos is None:
changes.append(SERPChange(
keyword=keyword, change_type="new_competitor",
details={"url": url, "position": curr_pos},
detected_at=time.time(), severity="medium"
))
elif curr_pos < prev_pos and (prev_pos - curr_pos) >= 3:
changes.append(SERPChange(
keyword=keyword, change_type="ranking_gained",
details={"url": url, "old": prev_pos, "new": curr_pos},
detected_at=time.time(), severity="high"
))
elif curr_pos > prev_pos and (curr_pos - prev_pos) >= 3:
changes.append(SERPChange(
keyword=keyword, change_type="ranking_lost",
details={"url": url, "old": prev_pos, "new": curr_pos},
detected_at=time.time(), severity="high"
))
# Deteksi perubahan snippets yang ditampilkan
if current.featured_snippet and not previous.featured_snippet:
changes.append(SERPChange(
keyword=keyword, change_type="snippet_gained",
details=current.featured_snippet,
detected_at=time.time(), severity="high"
))
elif previous.featured_snippet and not current.featured_snippet:
changes.append(SERPChange(
keyword=keyword, change_type="snippet_lost",
details=previous.featured_snippet,
detected_at=time.time(), severity="high"
))
# Simpan snapshot saat ini
self.snapshots[keyword].append(current)
self.snapshots[keyword] = self.snapshots[keyword][-30:] # Simpan 30 hari
return changes
import asyncio
from capsolver_core import create_capsolver, CaptchaType, CaptchaInfo
class SERPCollector:
"""Kumpulkan data SERP dengan penanganan CAPTCHA otomatis."""
def __init__(self, api_key: str, proxies: list):
self.cap = create_capsolver(api_key=api_key)
self.proxies = proxies
self.proxy_idx = 0
async def collect_serp(self, keyword: str, location: str = "us") -> SERPSnapshot:
"""Kumpulkan snapshot SERP lengkap untuk sebuah kata kunci."""
proxy = self.proxies[self.proxy_idx % len(self.proxies)]
self.proxy_idx += 1
html = await self._search(keyword, location, proxy)
if self._is_captcha(html):
info = CaptchaInfo(
type=CaptchaType.RECAPTCHA_V2,
website_url="https://www.google.com",
website_key="6LfwuyUTAAAAAOAmoS0fdqijC2PbbdH4kjq62Y1b"
)
solution = await self.cap.solve(info)
html = await self._retry(keyword, location, proxy)
return self._parse_serp(html, keyword)
async def monitor_keywords(self, keywords: list, detector: SERPChangeDetector) -> List[SERPChange]:
"""Pantau sejumlah kata kunci dan deteksi perubahan."""
all_changes = []
for keyword in keywords:
snapshot = await self.collect_serp(keyword)
changes = detector.detect_changes(keyword, snapshot)
all_changes.extend(changes)
await asyncio.sleep(7)
return all_changes
async def close(self):
await self.cap.aclose()
class SERPAlertSystem:
"""Menghasilkan pemberitahuan untuk perubahan SERP yang signifikan."""
def __init__(self, tracked_domains: list):
self.tracked_domains = tracked_domains
def filter_relevant_changes(self, changes: List[SERPChange]) -> List[SERPChange]:
"""Filter perubahan yang relevan dengan domain yang ditelusuri."""
relevant = []
for change in changes:
url = change.details.get("url", "")
if any(domain in url for domain in self.tracked_domains):
relevant.append(change)
elif change.change_type == "new_competitor" and change.severity == "high":
relevant.append(change)
return relevant
def generate_alert_message(self, changes: List[SERPChange]) -> str:
"""Menghasilkan pesan pemberitahuan yang mudah dibaca."""
if not changes:
return "Tidak ada perubahan SERP signifikan yang terdeteksi."
lines = [f"🔔 {len(changes)} perubahan SERP terdeteksi:\n"]
for c in changes:
if c.change_type == "ranking_gained":
lines.append(f" 📈 [{c.keyword}] {c.details['url']} bergerak dari #{c.details['old']} ke #{c.details['new']}")
elif c.change_type == "ranking_lost":
lines.append(f" 📉 [{c.keyword}] {c.details['url']} turun dari #{c.details['old']} ke #{c.details['new']}")
elif c.change_type == "snippet_gained":
lines.append(f" ⭐ [{c.keyword}] Snippet yang ditampilkan diperoleh")
elif c.change_type == "new_competitor":
lines.append(f" 🆕 [{c.keyword}] Kompetitor baru di #{c.details['position']}: {c.details['url']}")
return "\n".join(lines)
| Kata Kunci yang Dimonitor | Frekuensi Pemeriksaan | CAPTCHA Bulanan | Biaya Bulanan |
|---|---|---|---|
| 50 kata kunci | 2x sehari | ~900 | $1.80-2.70 |
| 200 kata kunci | sehari | ~1.800 | $3.60-5.40 |
| 500 kata kunci | sehari | ~4.500 | $9-13.50 |
| 1.000 kata kunci | 3x seminggu | ~5.400 | $10.80-16.20 |
Dapatkan Kode Bonus Anda: Gunakan kode WEBS di Dashboard CapSolver untuk mendapatkan bonus tambahan 5% pada setiap pengisian ulang.
Dokumentasi reCAPTCHA CapSolver ini menjelaskan implementasi khusus Google. Panduan web scraping CapSolver menyediakan pola infrastruktur untuk pemantauan volume tinggi. Untuk pola pengumpulan data SERP tambahan, blog otomasi CapSolver menutupi alur kerja terkait.
Deteksi perubahan hasil pencarian Google otomatis memerlukan pengumpulan data SERP terus-menerus dengan penanganan CAPTCHA, logika perbandingan snapshot, dan sistem pemberitahuan untuk perubahan signifikan. CapSolver menyediakan infrastruktur penyelesaian verifikasi yang memungkinkan pemantauan andal dalam skala besar, menyelesaikan reCAPTCHA Google dalam 3-8 detik sehingga sistem deteksi perubahan selalu memiliki data terbaru. Hasilnya adalah visibilitas real-time terhadap pergeseran peringkat, pergerakan kompetitor, dan perubahan fitur SERP—mengizinkan respons cepat yang mengubah volatilitas pencarian menjadi keunggulan kompetitif.
Sistem mendeteksi: penurunan/pengambilan peringkat organik (perubahan 3+ posisi), kehilangan/pengambilan snippets yang ditampilkan, kompetitor baru masuk ke 10 teratas, munculnya/Tidak adanya Tinjauan AI, perubahan People Also Ask, dan modifikasi paket lokal.
Untuk kata kunci prioritas tinggi (istilah merek, penggerak pendapatan utama), periksa dua kali sehari. Untuk kumpulan kata kunci yang lebih luas, pemantauan harian menangkap kebanyakan perubahan. Pemantauan mingguan cukup untuk kata kunci panjang dengan kompetisi rendah.
Ya. Ketika beberapa kata kunci menunjukkan perubahan peringkat bersamaan (10+ kata kunci bergerak dalam arah yang sama dalam 24 jam), ini menunjukkan dengan kuat pembaruan algoritma. Sistem dapat menandai pola ini secara otomatis.
Dengan proxy residensial dan jeda 7-10 detik antar query, tingkat pertemuan biasanya 10-15%. Tanpa proxy, bisa mencapai 40-50%. Kombinasi proxy berkualitas dan penyelesaian CapSolver memastikan keberhasilan pengumpulan data hampir 100%.
Pelajari arsitektur pengambilan data web Rust yang dapat diskalakan dengan reqwest, scraper, pengambilan data asinkron, pengambilan data browser tanpa tampilan, rotasi proxy, dan penanganan CAPTCHA yang sesuai aturan.

Mengotomasi penyelesaian CAPTCHA dengan Nanobot dan CapSolver. Gunakan Playwright untuk menyelesaikan reCAPTCHA dan Cloudflare secara otomatis.
