Google AI Mode 스크래핑 방법: 2025년 상세 가이드
Source: Dev.to
소개
Google AI Mode는 현재 가장 빠르고 포괄적인 AI 검색 경험 중 하나로 부상했습니다. ChatGPT와 Claude와 같이 자체 학습 데이터에 의존하는 독립형 챗봇과 달리, AI Mode는 실시간 Google 검색 결과와 “query fan‑out” 기술을 활용해 여러 데이터 소스를 동시에 검색합니다. Gemini AI 모델과 검색 인프라가 모두 Google에 의해 개발되었기 때문에, 시스템은 Google Search, Lens, Image Search의 기능을 매끄럽게 통합하여 매우 빠른 성능을 제공합니다.
SEO 전문가와 기업에게 AI Mode는 사용자가 콘텐츠를 발견하는 방식에 대한 중요한 변화를 의미합니다. 이 신흥 분야는 GEO (Generative Engine Optimization) 라고 불리며, 전통적인 검색 결과가 아니라 AI가 생성한 응답에 노출되는 것을 목표로 합니다. 기존의 상위 10위 결과와 달리, AI Mode는 훨씬 더 넓은 소스 풀에서 정보를 끌어와 페이지 1에 랭크되지 않더라도 브랜드가 노출될 기회를 제공합니다. 브랜드가 이러한 AI 응답에 등장하면 다음과 같은 효과를 기대할 수 있습니다:
- 트래픽 증가
- 자격 있는 리드 생성
- 사용자가 솔루션을 조사하는 정확한 순간에 구매 결정에 영향
AI Mode 가시성을 추적하는 일은 전통적인 검색 순위 모니터링만큼이나 중요해지고 있습니다.
이 글에서는 Google AI Mode 결과를 스크래핑하는 방법을 살펴봅니다. 먼저 Playwright와 프록시 서버를 활용한 맞춤형 스크래퍼를 소개하고, 이후 지속적인 유지보수가 필요 없는 보다 확장 가능하고 프로덕션 수준의 솔루션을 검토합니다.
Google AI 모드에 포함된 내용
Google AI 모드가 제공하는 정보를 먼저 이해해 보겠습니다. 이 모드에는 다음과 같은 데이터 포인트가 포함됩니다:
- Prompt – 사용자의 질의
- Answer – AI가 생성한 응답
- Links – 답변에 언급된 URL
- Citations – 원본 페이지에 대한 링크
가장 중요한 점은 AI 모드 응답이 지역에 따라 달라진다는 것입니다. 동일한 질의라도 미국, 프랑스 또는 다른 위치에서 검색하면 서로 다른 결과가 반환됩니다. 앞서 언급했듯이, 이러한 모든 데이터 포인트와 응답을 현지화하는 기능은 GEO 및 AI Search 추적에 필수적입니다.
이 글에서는 Python을 주요 코딩 언어로 사용합니다. 보여드리는 기술은 필요에 따라 다른 언어에도 적용할 수 있습니다. 이러한 배경을 바탕으로, 첫 번째 방법인 맞춤 코드를 작성하는 것부터 시작해 보겠습니다.
Google AI 모드 웹 스크래핑의 과제
간단한 구현만으로는 AI 모드를 스크래핑할 수 없습니다. 그 이유는 다음과 같습니다:
과제 1 – Google의 안티‑스크래핑 탐지
- 프록시 없이 보낸 요청은 거의 즉시 CAPTCHA에 의해 차단됩니다.
- 프리미엄 프록시 서비스(예: Residential Proxies)를 사용하면 대부분의 차단 문제를 해결할 수 있지만, 여전히 가끔 CAPTCHA가 나타나거나 페이지 로드가 느려질 수 있습니다.
과제 2 – 레이아웃 변경으로 인한 전체 파손
Google은 페이지 레이아웃과 HTML 선택자를 자주 업데이트합니다. 선택자는 필연적으로 깨지게 되며, 이는 스크래핑 실패로 이어집니다. 가끔씩 스크래핑하는 경우는 감당할 수 있지만, (하루에 수백 건의 쿼리를 처리하는) 프로덕션 환경에서는 선택자를 지속적으로 업데이트해야 하는 부담이 크게 늘어납니다.
과제 3 – 지역 및 언어 불일치
AI 모드 응답은 지역에 크게 의존하므로, 올바른 지리적 위치를 가진 프록시를 선택하는 것이 정확한 결과를 얻는 데 중요합니다. 일부 프록시 제공업체는 프록시의 지리적 위치를 지정할 수 있게 해 주어 이 사용 사례에 이상적입니다. 또한, 요청 헤더에 Accept-Language를 설정하여 목표 로케일과 일치하도록 해야 합니다.
과제 4 – 길고 유지보수가 어려운 코드
이러한 과제들 때문에 고품질 프록시, 선택자 업데이트, 성능 모니터링, 그리고 상당한 CPU와 메모리를 소비하는 브라우저(Playwright/Selenium) 등을 지속적으로 관리해야 하는 복잡한 코드가 필요합니다. 유지보수 비용이 초기 예상보다 빠르게 증가하여, 맞춤형 스크래퍼를 프로덕션 환경에서 사용하기가 비현실적이 됩니다.
맞춤형 AI 모드 웹 스크래퍼
Google AI 모드 스크래퍼를 만들기 위해서는 세 가지 인기 있는 headless‑browser 옵션이 있습니다(링크된 페이지의 비교 표 참고): Selenium, Playwright, 그리고 Puppeteer. 여기서는 Playwright에 집중합니다. Playwright는 인기가 높고 사용이 쉬우며 최신 웹 스크래핑에 여러 장점을 제공합니다.
Playwright 스텔스 버전 설치
pip install playwright-stealth
Note: 스텔스 플러그인은 Google의 일부 봇 탐지 메커니즘을 우회하는 데 도움을 줍니다.
아래 코드는 현재 작동하지만, 선택자 변경, 차단 문제 및 앞서 논의한 기타 요인들 때문에 시간이 지나면 깨질 수 있습니다.
import json
from playwright.sync_api import sync_playwright
from playwright_stealth import Stealth
query = "most comfortable sneakers for running"
with sync_playwright() as p:
# Launch a headless Chromium browser with stealth capabilities
browser = p.chromium.launch(headless=True)
context = browser.new_context()
Stealth(context) # Apply stealth tricks
# Set proxy and locale (example values – replace with your own)
context.set_default_navigation_timeout(60000)
context.set_extra_http_headers({
"Accept-Language": "en-US,en;q=0.9"
})
# If you need a proxy, uncomment and configure:
# context = browser.new_context(proxy={"server": "http://my-proxy:3128"})
page = context.new_page()
# Navigate to Google and trigger AI Mode
page.goto("https://www.google.com")
page.wait_for_load_state("networkidle")
# Accept cookies / dismiss dialogs if they appear
try:
page.click("text=I agree")
except Exception:
pass
# Type the query and press Enter
page.fill("input[name='q']", query)
page.keyboard.press("Enter")
page.wait_for_load_state("networkidle")
# Click the “AI Mode” button (selector may change)
try:
page.click("text=AI Mode")
page.wait_for_load_state("networkidle")
except Exception as e:
print("AI Mode button not found:", e)
# Extract the answer, links, and citations
result = {
"prompt": query,
"answer": None,
"links": [],
"citations": []
}
# The selectors below are examples – inspect the page to get the current ones
try:
result["answer"] = page.inner_text("css=div[data-tts='answer']")
except Exception:
pass
# Extract links inside the answer
link_elements = page.query_selector_all("css=div[data-tts='answer'] a")
for el in link_elements:
href = el.get_attribute("href")
if href:
result["links"].append(href)
# Extract citation URLs (usually at the bottom of the AI response)
citation_elements = page.query_selector_all("css=div[data-tts='citation'] a")
for el in citation_elements:
href = el.get_attribute("href")
if href:
result["citations"].append(href)
print(json.dumps(result, indent=2))
# Clean up
context.close()
browser.close()
기억해야 할 핵심 포인트
- Proxy & Locale – 올바른 지리적 위치를 가진 주거용 프록시를 사용하고
Accept-Language헤더를 설정하세요. - Stealth –
playwright-stealth패키지는 봇으로 인식될 가능성을 낮추는 데 도움을 줍니다. - Selector Maintenance – CSS/XPath 선택자를 정기적으로 확인하세요; Google은 이를 자주 변경합니다.
- Error Handling –
try/except블록으로 상호작용을 감싸서 CAPTCHA나 누락된 요소를 우아하게 처리하세요.
다음 단계
- Scale up – 스크래퍼를 큐 기반 아키텍처(예: RabbitMQ + 워커 풀)로 이동시켜 여러 쿼리를 동시에 처리하도록 확장하세요.
- CAPTCHA Solving – 가끔 발생하는 CAPTCHA를 해결하기 위해 제3자 CAPTCHA 해결 서비스를 통합하세요.
- Monitoring – 선택자 실패, 지연 증가, 프록시 차단 등에 대한 알림을 설정하세요.
위 접근 방식을 따르고 Google의 빈번한 UI 변화를 지속적으로 주시한다면, 기능적인 프로덕션 수준의 스크래퍼를 구축할 수 있습니다.
uction‑ready 파이프라인을 사용하여 Google AI Mode 결과를 추출합니다.
import json
from playwright.sync_api import sync_playwright
from playwright_stealth import Stealth
query = "your search query here"
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
args=[
"--disable-blink-features=AutomationControlled",
"--disable-dev-shm-usage",
"--no-sandbox",
],
# Uncomment this to use proxies.
# proxy={
# "server": "http://pr.oxylabs.io:7777",
# "username": "customer-USERNAME",
# "password": "PASSWORD",
# }
)
context = browser.new_context(
user_agent=(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/143.0.0.0 Safari/537.36"
)
)
page = context.new_page()
Stealth().use_sync(page)
page.goto(
f"https://www.google.com/search?q={query.replace(' ', '+')}"
"&udm=50&hl=en&gl=US"
)
page.wait_for_load_state("networkidle")
container = None
text_content = ""
# Look for a suitable result container.
candidates = page.locator("#search div, #rso > div, div[role='main'] div").all()
for candidate in candidates[:30]:
if not candidate.is_visible():
continue
text = candidate.inner_text()
if len(text) > 200 and "http" not in text[:100]:
container = candidate
text_content = text
break
# Fallback: try to locate the query text directly.
if not container:
match = page.get_by_text(query).first
if match.is_visible():
container = match.locator("xpath=./ancestor::div[3]")
text_content = container.inner_text()
# Final fallback: use the whole page body.
if not container or len(text_content) < 100:
container = page.locator("body")
text_content = page.inner_text("body")
# Extract links from the chosen container.
links = []
if container:
for link in container.locator("a").all():
href = link.get_attribute("href")
title = link.inner_text()
if href and href.startswith("http"):
links.append({"title": title.strip(), "url": href})
output_data = {
"content": text_content.strip(),
"links": list({l["url"]: l for l in links}.values()),
}
print(json.dumps(output_data, indent=2))
with open("ai_mode_data.json", "w") as f:
json.dump(output_data, f, indent=2)
browser.close()
print("Done!")
코드를 실행하면 스크랩한 AI‑Mode 응답과 인용 정보를 포함한 JSON 파일이 저장됩니다.
참고: CAPTCHA 또는 기타 차단이 실행을 방해할 수 있습니다.
최고의 솔루션: AI‑Mode 스크래퍼 API
맞춤 코드는 지나치게 복잡하고, 길며, 신뢰성이 떨어질 수 있습니다. 훨씬 간단한 방법은 Oxylabs Web Scraper API와 같은 전용 서비스를 이용하는 것으로, Google AI‑Mode 스크래핑을 기본 지원합니다. API가 프록시, 브라우저 렌더링, CAPTCHA, 셀렉터 변경 등을 대신 처리해 줍니다.
requests 라이브러리 설치
pip install requests
최소 API 예시
import json
import requests
# API 파라미터.
payload = {
"source": "google_ai_mode",
"query": "most comfortable sneakers for running",
"render": "html",
"parse": True,
"geo_location": "United States",
}
response = requests.post(
"https://realtime.oxylabs.io/v1/queries",
# Free trial available at dashboard.oxylabs.io
auth=("USERNAME", "PASSWORD"),
json=payload,
)
response.raise_for_status()
print(response.text)
with open("AI_Mode_scraper_data.json", "w") as f:
json.dump(response.json(), f, indent=2)
print("Done!")
실행 후 저장된 JSON 파일에는 아래 스크린샷과 유사한 구조화된 결과가 들어갑니다 (가독성을 위해 링크는 축소됨):

페이로드 이해하기
payload = {
"source": "google_ai_mode",
"query": "most comfortable sneakers for running",
"render": "html",
"parse": True,
"geo_location": "United States",
}
source– 사용할 스크래퍼를 선택합니다;google_ai_mode는 AI‑Mode 결과를 가져옵니다.render– 완전히 렌더링된 HTML을 반환하여 모든 동적 콘텐츠가 로드되도록 합니다.parse– 자동 데이터 파싱을 활성화하므로 별도의 커스텀 파서를 만들 필요가 없습니다.geo_location– 결과를 지역화합니다. 국가, 주, 도시 혹은 정확한 좌표를 지정할 수 있습니다. 예:
"geo_location": "New York,New York,United States"
단일 구독으로 Google Search, Amazon, ChatGPT 등 다양한 사전 구축된 소스에 접근할 수 있으며, 차단, 중단, 유지보수에 신경 쓰지 않고 수백·수천 건의 요청을 확장해서 사용할 수 있습니다.
전체 화면 모드 종료
자세한 내용은 AI Mode scraper documentation를 확인하세요.
웹 스크래핑 API 사용의 장점
구글 AI 모드 스크래퍼 API는 맞춤 코딩 없이도 AI 응답 추출을 손쉽게 합니다. 이유는 다음과 같습니다:
- No infrastructure to maintain – 브라우저를 관리할 필요도, 재시도 로직을 신경 쓸 필요도, IP 회전을 직접 코딩할 필요도 없습니다. API 요청만 보내면 결과를 받을 수 있습니다.
- Premium proxies under the hood – API는 스마트한 머신러닝 기반 엔진이 관리하는 프록시 서버를 내장하고 있어, 프록시 관리와 CAPTCHA 처리를 대신해 줍니다.
- Resilience to Google layout changes – 구글이 UI를 업데이트하면 Oxylabs가 백엔드를 업데이트합니다. 따라서 코드는 그대로 유지됩니다.
최종 생각
Google AI 모드 스크래핑은 선택한 접근 방식에 따라 간단할 수도, 어려울 수도 있습니다.
- 직접 코드를 작성하면 완전한 제어가 가능하지만, 시간이 지남에 따라 유지 관리가 부담이 됩니다.
- 맞춤형 솔루션에는 다음이 필요합니다:
- 스마트 브라우저‑환경 관리
- 엄격한 안티‑스크래핑 시스템을 우회하는 로직
- 프리미엄 프록시 서버 통합
- 맞춤형 데이터 파싱
- 지속적인 유지 관리 등 다양한 고려 사항
Oxylabs Web Scraper API가 이러한 모든 장애물을 대신 처리합니다. 요청을 보내면 몇 초 안에 파싱된 데이터를 받을 수 있습니다. 이 API에는 Google Search, Amazon, ChatGPT와 같은 인기 사이트용 사전 구축된 스크래퍼와 파서도 포함되어 있어 각 웹사이트마다 별도의 솔루션을 구축하고 유지 관리할 필요가 없습니다.
