
「1위인데 CTR이 떨어졌다」를 의심하지 말고 실측하라 — Search Console API로 “면적의 지반 침하”를 시각화하기
요약
Search Console API를 활용하여 검색 순위는 유지되지만 클릭률(CTR)이 하락하는 '면적의 지반 침하' 현상을 탐지하는 방법을 다룹니다. 광고 영역 확대와 AI Overviews 도입으로 인한 SERP 면적 변화를 Python 코드로 실측하는 가이드를 제공합니다.
핵심 포인트
- 순위(Rank)가 아닌 순위와 CTR의 시계열 분석 필요
- SERP 면적 변화(광고, AI Overviews)에 따른 CTR 저하 현상 설명
- Python과 Search Console API를 이용한 데이터 추출 및 비교 구현
- AI 인용과 오가닉 순위 간의 상관관계 분석
📝 이 기사는 자사 블로그의 전략 리포트(CodeQuest.work)를 엔지니어를 위해 「계측 구현」 관점으로 재구성한 것입니다. 전략적 배경에 관심이 있는 분은 원문을 참고해 주세요.
「순위는 유지되고 있는데 CTR(클릭률)이 떨어지고 있는」 쿼리는, Search Console API의 query × date 집계로 기계적으로 검출할 수 있습니다. 이는 광고주 우대 음모가 아니라, SERP(검색 결과 페이지)라는 한정된 면적을 광고 영역, AI Overviews, 리치 결과(Rich Results)가 빼앗고 있기 때문입니다.
**「면적의 지반 침하」**가 원인입니다. 순위 리포트만 보고 있으면 놓치기 쉬우므로, 본 기사에서는 Python으로 「동일 순위 CTR 저하 쿼리」를 추출하는 코드를 구현합니다.
대상 독자는 GA4나 Search Console을 보며 「최근 오가닉(Organic) 성과가 약해진 것 같다」고 느끼지만, 이를 숫자로 언어화하지 못하고 있는 개인 개발자 및 웹 제작자입니다.
순위(평균 게재 순위)는 「당신의 페이지가 검색 결과의 몇 번째에 나왔는가」만을 나타냅니다. 하지만 실제 사용자가 보는 화면에서는, 같은 「1위」라도 전후 상황이 매년 변하고 있습니다.
| 압력 요인 | SERP 면적에 미치는 영향 |
|---|---|
| 광고 영역의 확대 | 최상단 광고 수와 면적이 늘어나, 순수한 오가닉 결과가 아래로 밀려남 |
| ... | |
| 결과적으로 다음과 같은 현상이 발생합니다. |
- 「10위 이내인데, 퍼스트 뷰(First View)에 나타나지 않는다"
- 「1위인데, CTR이 이전보다 낮다"
이것이 바로 면적의 지반 침하입니다. 순위(rank)는 같더라도, 그 순위가 놓여 있는 “지반” 자체가 가라앉는 것입니다. 따라서 순위가 아니라 「순위 × CTR의 시계열」로 보지 않으면 검출할 수 없습니다.
흥미롭게도, 순위와 AI 인용은 단순한 대체 관계가 아닙니다.
- Seer Interactive의 분석: AIO(AI Overviews) 인용의 약 **55%**가 페이지 상단 30%에서 추출됨
- Ahrefs의 조사: AI 인용의 **62%**가 오가닉 Top 10 권외에서 발생함
「Google 순위가 낮아도 AI에는 인용되는」 역전 현상도 일어나고 있으며, 단일 지표인 「순위」만으로는 더 이상 현실을 충분히 설명할 수 없습니다. 그렇기에 자신의 데이터로 직접 실측해야 합니다.
Google Cloud에서 서비스 계정(Service Account)을 만들고, Search Console의 대상 프로퍼티(Property)에 「제한적」 사용자로 해당 서비스 계정의 이메일을 추가합니다. 그다음 라이브러리를 설치하기만 하면 됩니다.
pip install google-api-python-client google-auth
「지난달 vs 이번 달」과 같이 두 기간을 비교하여, 순위는 거의 비슷한데 CTR이 떨어진 쿼리를 찾아내는 것이 목표입니다. Search Console API는 dimensions에 query를 지정하면, 쿼리별 clicks / impressions / ctr / position을 반환합니다.
from googleapiclient.discovery import build
from google.oauth2 import service_account
SCOPES = ["https://www.googleapis.com/auth/webmasters.readonly"]
...
포인트는 rowLimit: 25000으로 페이징(Paging) 처리를 한다는 점입니다. 쿼리 수는 수만 건에 달하는 것이 일반적이므로, startRow를 진행하며 전체 데이터를 가져옵니다.
두 기간의 쿼리 통계를 대조하여, 순위 변동은 작지만(지반 침하 의심) CTR이 유의미하게 떨어진 쿼리를 추출합니다.
def detect_ctr_erosion(
prev: dict,
curr: dict,
...
)
def main():
service = build_client()
prev = fetch_query_stats(service, "2026-03-01", "2026-03-31")
...
출력 이미지 (수치는 샘플):
query pos CTR(before→after) drop% impr
nextjs ssg 구현 2.1→2.3 8.4%→5.1% -39.3% 1820
seo 체크 툴 1.4→1.5 12.0%→8.8% -26.7% 3400
...
순위는 거의 변하지 않았는데 CTR만 두 자릿수 %로 떨어지는 쿼리가 나열되어 있다면, 그것이 지반 침하의 후보입니다. 이러한 쿼리의 실제 SERP (Search Engine Results Page)를 직접 확인해 보면, AI Overviews가 나타나 있거나 광고 영역 및 쇼핑 영역이 늘어나 있을 것입니다.
지반 침하에 대한 대책 중 하나는 "AI에 인용되는 측이 되는 것"이지만, 그 전제로 AI 크롤러(AI Crawler)가 당신의 페이지를 읽을 수 있는지를 확인해야 합니다. AI 크롤러(GPTBot, ClaudeBot, PerplexityBot 등)는 JavaScript 렌더링 (JavaScript Rendering)을 공식적으로 보장하지 않습니다. SPA (Single Page Application) 구성이라면 "Google에는 보이지만 AI에는 보이지 않는" 상태가 되기 쉽습니다.
"JS 없이 본문 HTML이 출력되고 있는가"는 curl로 UA (User Agent)를 위장하여 간이 체크할 수 있습니다.
# AI 크롤러의 대표적인 UA로 가져와서, 본문이 HTML에 포함되는지 확인
curl -s -A "Mozilla/5.0 (compatible; GPTBot/1.0; +https://openai.com/gptbot)" \
https://example.com/your-article | grep -c "기사 내의 특징적인 한 문장"
0
이 반환된다면, 그 본문은 클라이언트 사이드 (Client-side)에서만 묘사되고 있다, 즉 AI 크롤러에게는 빈 페이지로 보이고 있을 가능성이 높습니다. Python으로 렌더링 전후를 비교하면 더욱 확실합니다.
import requests
AI_BOT_UA = "Mozilla/5.0 (compatible; GPTBot/1.0; +https://openai.com/gptbot)"
MARKER = "기사 내의 특징적인 한 문장" # 본문 중의 고유한 문구
...
대책은 명쾌합니다. SSR (Server Side Rendering) / SSG (Static Site Generation)로 본문 HTML을 출력하는 것입니다. Next.js라면 App Router의 Server Component나 generateStaticParams, 혹은 ISR (Incremental Static Regeneration)을 통해 본문이 응답 HTML에 포함된 상태를 만듭니다. 인용되기 이전에, 우선 읽히는 상태를 만드는 것이 먼저입니다.
AI에 인용되는 정보원의 조건은 심플하며, ① 논점에 대한 명확한 직접 답변이 있다 ② 근거와 출처를 가진다 ③ 구조화되어 있다의 3가지 포인트입니다. 잔꾀를 부리는 비법은 없으며, 결국 "좋은 SEO 그 자체"로 수렴합니다.
구현 측면에서 효과적인 것은 FAQ를 구조화 데이터 (Structured Data, JSON-LD)로 명시하는 것입니다. 질문과 답변의 쌍은 AI가 추출하기 쉽고, 강조 스니펫 (Featured Snippets)에도 올라가기 쉬운 형식입니다.
<script type="application/ld+json">
{
"@context": "https://schema.org",
...
포인트는 acceptedAnswer의 서두 1~2문장에서 결론을 단정적으로 말하는 것입니다. AIO (AI Overviews) 인용의 약 55%가 페이지 상부에서 추출된다는 경향 (Seer Interactive)에 맞춰, 답변문의 맨 앞에 결론, 뒤에 보충 설명을 배치합니다. 본문의 각 섹션도 마찬가지로 "결론 우선 (Conclusion First)" 방식으로 작성하면 인용률이 올라갑니다.
음모론을 원망해도 전진할 수 없습니다. "면적을 빼앗긴다"는 전제로 계측 방식을 재편하는 것이 현실적인 대응책입니다.
탐지: Search Console API로 "순위 유지 × CTR 저하 쿼리"를 정기적으로 추출 (본 기사의 코드)
가독성: AI 크롤러 UA로 SSR/SSG가 작동하고 있는지 확인
인용 최적화: 직접 답변 + FAQ 구조화 데이터로 "인용되기 쉬운 형태"로 만들기
지속적 계측: 순위가 떨어진 후가 아니라, CTR의 징후로 선제 대응하기
순위가 떨어지는 것은 결과이며, 그전에 CTR이라는 선행 지표가 움직입니다. 그 부분을 기계적으로 포착할 수 있도록 해두는 것이 지반 침하 시대의 방어법입니다.
전략적인 배경(왜 Google이 이제 와서 자사 광고를 내는지, 오가닉(Organic) = 신뢰의 해자라는 역설)을 깊이 있게 다룬 원문은 이쪽입니다.
SEO 스코어 체크 툴: SEO_CHECK — RINIA 디렉터 툴. 45개 항목 체크를 통해 자신의 페이지가 "면적과 CTR" 관점에서 건전한지 무료 진단할 수 있습니다.
웹 제작·SEO 관련 기술 정보 사이트: CodeQuest.work
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기