실제로 잘 작동하는 Gemini 웹 스크래핑 (코드 + 노코드)

최종 업데이트: April 15, 2026

대부분의 "gemini web scraping" 튜토리얼은 마치 같은 사람을 위해 쓴 것처럼 보입니다. 이미 가상 환경이 세팅돼 있고, Pydantic 스키마를 다룰 줄 알며, 비동기 라이브러리에 대한 확고한 취향까지 있는 Python 개발자를 전제로 하죠. 당신이 그런 사람이라면 좋습니다 — 바로 코드를 보면 됩니다. 하지만 영업, 마케팅, 이커머스 운영 업무를 하면서 markdownify가 뭔지 따로 배울 필요 없이 웹페이지 여러 개에서 구조화된 데이터만 얻고 싶다면, 당신만 그런 게 아닙니다.

Gemini는 Google의 멀티모달 AI 제품군이며, 웹 데이터 추출용 엔진으로 빠르게 자리 잡고 있습니다. 2025 Stack Overflow Developer Survey에 따르면 개발자의 이라고 답했고, LLM 기반 스크래핑은 그 흐름의 큰 축을 차지합니다. 하지만 "한 개 URL에서 멋지게 돌아가는 데모"와, 페이지네이션·하위 페이지·봇 차단·지저분한 HTML까지 대규모로 처리하는 실제 파이프라인 사이에는 큰 간극이 있습니다. 이 가이드는 Python(코드) 방식과 노코드 방식 모두를 다루고, 실제 토큰 계산을 통해 모델 선택법을 설명하며, 대부분의 다른 튜토리얼이 건너뛰는 멀티페이지 스크래핑까지 짚어드립니다. 또한 Gemini 스크래핑이 어디서 무너지는지도 솔직하게 말씀드리겠습니다. 끝까지 읽으시면 어떤 방식이 자신의 업무 흐름에 맞는지, 그리고 개발자와 비개발자 모두가 흔히 빠지는 함정을 어떻게 피할 수 있는지 알게 되실 겁니다.

Gemini 웹 스크래핑이란?

Gemini 웹 스크래핑은 웹페이지의 내용 — HTML, Markdown, 심지어 스크린샷까지 — 를 Google의 Gemini AI 모델에 넣어 페이지를 해석하고 구조화된 데이터로 돌려받는 방식입니다. CSS 선택자도, XPath도, 사이트가 레이아웃을 조금만 바꿔도 깨지는 불안정한 규칙도 필요하지 않습니다.

핵심 흐름은 다음과 같습니다.

  1. 페이지 가져오기 (requests, 헤드리스 브라우저, 또는 Chrome 확장 프로그램 사용)
  2. 내용 정리 및 변환 (보통 HTML → Markdown으로 바꿔 토큰 비용 절감)
  3. 원하는 필드를 설명한 스키마와 함께 Gemini로 전송
  4. 구조화된 JSON 수신 — 스프레드시트, CRM, 데이터베이스에 바로 활용 가능

전통적인 BeautifulSoup나 Selenium 기반 스크래핑과 비교해 보세요. 그 방식은 div.product-title > span.price 같은 셀렉터를 하드코딩해 두고, 사이트가 다음 주 화요일에 리디자인하지 않기만을 바라는 식입니다. 반면 Gemini는 사람이 페이지를 읽는 방식으로 콘텐츠를 이해합니다. 문맥을 파악하고, 레이아웃 변화에 적응하며, 커스텀 규칙 없이도 복잡한 포맷을 처리합니다.

한 가지 더 주목할 점이 있습니다. Gemini는 기본적으로 멀티모달입니다. 텍스트, 이미지, 영상, 오디오, PDF, 코드까지 한 번의 요청으로 처리하죠. 덕분에 HTML 대신 스크린샷을 보내는 방식처럼, 다른 LLM으로는 따라오기 어려운 스크래핑 방법도 가능합니다. 이 부분은 뒤에서 다시 보겠습니다.

Gemini 웹 스크래핑이 비즈니스 팀에 중요한 이유

마케팅 매니저나 이커머스 애널리스트가 왜 LLM과 웹 스크래핑을 신경 써야 하냐고 묻는다면, 답은 간단합니다. 엄청난 시간을 아껴 주고, 웹사이트가 업데이트될 때마다 깨지지 않기 때문입니다.

은 2025년 약 10억 달러에서 2030년 20억 달러 이상으로 성장할 것으로 예상됩니다. 그중에서도 AI 기반 추출은 가장 빠르게 성장하는 분야입니다. 이건 단순한 과장이 아니라, 데이터 수집 방식이 실제로 바뀌고 있다는 뜻입니다.

Gemini 스크래핑은 일상적인 비즈니스 업무에서 이렇게 활용됩니다.

활용 사례추출 대상주요 수혜자
리드 생성디렉터리, LinkedIn(공개 정보), 회사 웹사이트의 연락처 정보영업, BDR
경쟁사 가격 모니터링제품 가격, 재고 상태, 프로모션이커머스, 가격 전략팀
상품 카탈로그 추출상품명, 사양, 이미지, 리뷰머천다이징, 마켓플레이스 운영
부동산 매물 수집매물 정보, 가격, 중개인 정보중개인, 투자자
콘텐츠 수집뉴스, 블로그 글, 소셜 미디어 언급마케팅, PR
채용 시장 조사직무명, 연봉, 지역HR, 채용

실질적인 장점은 두 가지입니다. 첫째, 파싱 스크립트를 쓰고, 테스트하고, 디버깅하는 과정을 건너뛸 수 있습니다. 모델이 매번 페이지를 새로 읽기 때문이죠. 둘째, 사이트가 <div> 위치를 바꿀 때마다 개발자를 다시 투입할 필요가 없습니다. Gemini 무료 티어 덕분에 소규모 작업은 거의 비용 없이 실험할 수 있습니다. 요청이 가능하며, 신용카드도 필요 없습니다.

어떤 Gemini 모델을 선택해야 할까? (Flash Lite vs. Flash vs. Pro)

스크래핑에 모든 Gemini 모델이 같은 성능을 내는 건 아닙니다. 잘못 고르면 돈만 낭비하거나, 엉망인 데이터를 얻게 됩니다. 그래서 대부분의 튜토리얼에서 꼭 빠져 있는 실용적인 비교를 준비했습니다.

현재의 Gemini 2.5 모델 3종은 모두 1,048,576 토큰 컨텍스트 윈도우를 공유하고 멀티모달을 지원합니다. 차이는 비용, 속도, 복잡한 추출 처리 능력입니다.

모델입력 비용(100만 토큰당)출력 비용(100만 토큰당)적합한 용도복잡한 스키마 정확도속도
Gemini 2.5 Flash Lite약 $0.025약 $0.10단순한 평면 데이터, 대량 처리⚠️ 중첩/선택 필드에 약함가장 빠름
Gemini 2.5 Flash약 $0.075약 $0.625대부분의 스크래핑 작업✅ 구조화 추출에 적합빠름
Gemini 2.5 Pro약 $0.3125약 $2.50복잡한 중첩 스키마, 예외 케이스✅ 최고 수준의 정확도가장 느림

(가격은 기준입니다. Batch API는 이 요금의 50%입니다.)

Gemini 2.5 Flash Lite: 빠르고 저렴하지만 누락을 조심해야 합니다

Flash Lite는 예산 친화적인 옵션입니다. 상품명, 가격, 단일 레벨 목록처럼 단순하고 평면적인 데이터를 대량으로 처리할 때 적합합니다. 하지만 선택 필드, 타임스탬프, 중첩 데이터에서 문제를 일으킨 사례가 문서화돼 있습니다. Google 포럼의 한 개발자는 며, 토큰 한도에 도달할 때까지 반복 텍스트를 출력한다고 보고했습니다. 스키마가 2단계 이상 중첩되거나 일부 페이지에 없을 수도 있는 필드가 있다면, Flash Lite는 토큰도, 인내심도 모두 소모시킬 수 있습니다.

Gemini 2.5 Flash: 대부분의 스크래핑 작업에 가장 균형이 좋습니다

실제 스크래핑 작업이라면 저는 거의 무조건 Flash부터 시작합니다. 구조화 추출을 잘 처리하고, 페이지네이션 로직도 무난하게 다루며, 입력 비용은 Flash Lite보다 약 3배 비싸지만 정확도 향상이 충분히 그 값을 합니다. 에서도 Flash는 Pro와 몇 점 차이밖에 나지 않는데, 이는 스크래핑에 필요한 추론, 정규화, 평탄화를 잘 수행한다는 뜻입니다.

Gemini 2.5 Pro: 복잡한 데이터에는 최고 정확도

Pro는 정밀 도구입니다. 다층 중첩 스키마를 추출할 때, 또는 허위 필드가 절대 허용되지 않는 경우(법률, 금융, 의료 데이터)에 사용하세요. 입력 비용은 Flash Lite의 약 12배이므로, 가격보다 정확도가 훨씬 중요한 작업에만 쓰는 것이 좋습니다.

실제 비용 예시: 상품 페이지 10,000개

HTML을 Markdown으로 전처리한다고 가정해 보겠습니다. 그래야 합니다. 이 부분은 아래에서 더 설명하겠지만, 일반적인 상품 페이지는 원시 HTML 기준 약 20,000 토큰이지만 Markdown으로 바꾸면 약 4,000 토큰으로 줄어듭니다. 출력 JSON은 페이지당 약 500 토큰 정도입니다.

모델입력 비용(4,000만 토큰)출력 비용(500만 토큰)10,000페이지 총비용
Flash Lite$1.00$0.50약 $1.50
Flash$3.00$3.13약 $6.13
Pro$12.50$12.50약 $25.00

Markdown 전처리를 하지 않고 원시 HTML을 그대로 넣으면(입력이 약 2억 토큰 수준), 이 비용은 4~5배까지 치솟습니다. 전처리는 파이프라인에서 가장 효과가 큰 최적화입니다.

코드 vs. 노코드: Gemini 웹 스크래핑의 두 가지 경로

이제 갈림길입니다. 커스텀 파이프라인을 만드는 개발자라면 Python + Gemini API가 가장 큰 제어권을 줍니다. 반대로 터미널을 건드리지 않고 지금 당장 데이터를 얻고 싶은 비즈니스 사용자라면 노코드 AI 스크래퍼가 훨씬 빠릅니다.

기준Gemini API (Python)Thunderbit (노코드)
설정 시간15~30분(환경, 키, 라이브러리)1분 미만(Chrome 확장 설치)
코딩 필요 여부예(Python, Pydantic)없음
페이지네이션 처리수동 스크립팅내장 지원(클릭 또는 무한 스크롤)
하위 페이지 보강사이트별 커스텀 코드 필요1클릭 "하위 페이지 스크래핑"
토큰 비용 관리수동(HTML 정리, 모델 선택)AI 엔진이 자동 처리
내보내기 옵션스크립트를 통한 JSON/CSVExcel, Google Sheets, Airtable, Notion
적합한 사용자커스텀 파이프라인을 만드는 개발자지금 당장 데이터가 필요한 비개발자

은 Thunderbit에서 만든 노코드 옵션입니다. AI(내부적으로 Gemini, ChatGPT, Claude 등 활용)를 사용해 필드를 추천하고, 두 번의 클릭으로 스크래핑하며, 원하는 도구로 바로 내보낼 수 있는 Chrome 확장 프로그램이죠. 아래에서 두 가지 경로를 모두 살펴보겠습니다.

스프레드시트 중심 사용자라면 Quadratic도 알아둘 만합니다. 시트 안에서 Gemini 기반 웹 스크래핑을 실행할 수 있는 AI 스프레드시트입니다. 다만 이미 알고 있는 웹페이지에서 시작하는 워크플로(상품 목록, 디렉터리, 리드 데이터베이스 등)라면 Thunderbit가 사용자의 사고 방식과 더 잘 맞습니다.

단계별: Python으로 Gemini 웹 스크래핑하기

이 섹션은 개발자용입니다. 노코드 경로를 원하시면 다음 섹션으로 넘어가세요.

시작 전 준비:

  • 난이도: 중급(Python 이해 필요)
  • 소요 시간: 첫 스크래핑 약 20~30분
  • 필요한 것: Python 3.10+, Google AI Studio 계정(무료), 대상 URL

1단계: Python 환경과 Gemini API 키 설정

프로젝트 폴더와 가상 환경을 만든 뒤 필요한 라이브러리를 설치합니다.

1mkdir gemini-scraper && cd gemini-scraper
2python -m venv venv && source venv/bin/activate
3pip install -U google-genai requests beautifulsoup4 markdownify pydantic

중요: 2026년에 올바른 SDK는 google-genai뿐입니다. 예전의 google-generativeai 패키지는 2025-11-30에 서비스 종료되었고 이제는 deprecated 상태입니다. 튜토리얼에서 import google.generativeai as genai를 보면, 그 코드는 이미 오래된 것입니다.

다음으로 에서 API 키를 발급받습니다. "Get API Key"를 클릭하고 새 키를 생성한 뒤 환경 변수로 저장하세요.

1export GEMINI_API_KEY="your-key-here"

이제 필요한 의존성이 설치되고 API 키까지 준비된 Python 환경이 완성됩니다.

2단계: 대상 페이지의 HTML 가져오기

requests로 페이지를 가져옵니다. 예시로 상품 페이지를 스크래핑해 보겠습니다.

1import requests
2url = "https://example.com/product/widget-pro"
3response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=30)
4html = response.text

사이트가 JavaScript 렌더링이 강하거나 봇 차단이 심하면 requests.get()이 빈 껍데기만 반환하거나 403을 돌려줄 수 있습니다. 이런 경우는 뒤의 한계 섹션에서 해결법을 설명하겠지만, 많은 공개 사이트에서는 이 방법이 잘 작동합니다.

3단계: HTML을 정리하고 Markdown으로 변환하기

대부분의 튜토리얼이 언급만 하고 수치는 제시하지 않는 단계입니다. 일반적인 상품 페이지의 원시 HTML은 약 20,000 토큰 수준입니다. BeautifulSoup로 불필요한 부분을 제거하고 Markdown으로 바꾸면 대략 765~4,000 토큰 수준으로 줄어들어 이 가능합니다. 실제 비용도 줄고, 환각 가능성도 낮아집니다.

1from bs4 import BeautifulSoup
2from markdownify import markdownify
3soup = BeautifulSoup(html, "html.parser")
4main = soup.select_one("main") or soup  # 콘텐츠 영역만 가져오기
5markdown_content = markdownify(str(main))

select_one("main")는 헤더, 푸터, 내비게이션, 스크립트 같은 잡음을 제거해 줍니다. 토큰을 낭비하고 모델을 헷갈리게 하는 요소들이죠. 사이트에 <main> 태그가 없다면 .product-detail, #content 같은 실제 데이터가 들어 있는 래퍼를 찾아보세요.

이 단계가 끝나면 페이지의 핵심 내용만 들어 있는 깔끔한 Markdown 문자열이 남습니다.

4단계: 데이터 스키마를 정의하고 Gemini로 전송하기

Pydantic으로 받아올 데이터를 정의합니다. google-genai SDK는 response_schema에 Pydantic BaseModel을 직접 받을 수 있습니다.

1from google import genai
2from google.genai import types
3from pydantic import BaseModel
4class Product(BaseModel):
5    name: str
6    price: str
7    sku: str | None = None
8    description: str
9    sizes: list[str] = []
10    colors: list[str] = []
11client = genai.Client()  # 환경 변수 GEMINI_API_KEY를 읽음
12response = client.models.generate_content(
13    model="gemini-2.5-flash",
14    contents=f"이 페이지에서 상품 세부 정보를 추출해 주세요:\n\n{markdown_content}",
15    config=types.GenerateContentConfig(
16        response_mime_type="application/json",
17        response_schema=Product,
18    ),
19)
20product = response.parsed
21print(product)

에서 나온 몇 가지 주의점이 있습니다.

  • Gemini에 보낼 스키마에서는 Field(default=...)를 사용하지 마세요 — API가 ValueError를 발생시킵니다. 대신 sku: str | None = None처럼 타입 수준에서 처리하세요.
  • 중첩은 얕게 유지하세요(최대 3단계). 깊게 중첩된 스키마는 Flash와 Flash Lite에서 재귀 출력이나 닫히지 않은 괄호를 유발할 수 있습니다.
  • Flash Lite를 사용할 때는 필드를 필수로 지정하고, 생략 대신 빈 문자열 같은 센티널 값을 쓰는 편이 낫습니다. Flash Lite는 선택 필드 처리에 .

이제 페이지에서 구조화된 데이터를 담은 Product 객체를 얻을 수 있습니다.

5단계: 추출한 데이터 내보내기 및 저장하기

결과를 JSON 또는 CSV로 저장합니다.

1import json
2with open("products.json", "w") as f:
3    json.dump(product.model_dump(), f, indent=2)

Google Sheets로 넘기려면 gspread 라이브러리를 사용할 수 있습니다. 데이터베이스라면 원하는 ORM에 맞춰 직렬화하면 됩니다. Gemini의 구조화 출력은 대부분의 후속 도구에 바로 넣을 수 있을 만큼 깔끔합니다.

단계별: 코드 없이 Gemini 웹 스크래핑하기 (Thunderbit 사용)

이 경로는 비즈니스 사용자, 또는 일회성 스크래핑 스크립트를 쓰고 싶지 않은 개발자를 위한 것입니다.

시작 전 준비:

  • 난이도: 초급
  • 소요 시간: 첫 스크래핑 약 5분
  • 필요한 것: Chrome 브라우저, (무료 티어 가능)

1단계: Thunderbit Chrome 확장 프로그램 설치

로 이동해 "Add to Chrome"을 클릭하세요. 이메일로 가입하면 끝입니다. 전체 과정은 1분도 걸리지 않습니다. 위의 Python 설정과 비교하면 훨씬 간단하죠.

2단계: 대상 페이지를 열고 "AI Suggest Fields" 클릭

스크래핑하려는 웹사이트로 이동하세요. 상품 목록, 부동산 디렉터리, 리드 데이터베이스 등 무엇이든 좋습니다. 브라우저 툴바에서 Thunderbit 아이콘을 클릭한 뒤 **"AI Suggest Fields"**를 누르세요.

Thunderbit의 AI가 페이지를 읽고 "Product Name", "Price", "Rating", "Image URL" 같은 열 이름과 데이터 유형을 자동으로 추천합니다. 열 이름을 수정하거나, 필요 없는 필드를 제거하거나, 각 열에 맞춤 AI 프롬프트를 추가할 수도 있습니다(예: "High/Medium/Low로 분류", "영어로 번역").

스크래핑을 시작하기 전에 설정한 열이 표 미리보기로 먼저 표시됩니다.

3단계: "Scrape" 클릭 후 결과 확인

한 번 클릭하면 됩니다. Thunderbit는 페이지네이션을 처리하고 — 클릭 방식의 "Next" 버튼도, 무한 스크롤도 — 데이터를 구조화된 표로 추출합니다. 다음 중 하나를 선택할 수 있습니다.

  • Cloud Scraping: 더 빠르며 최대 50페이지를 동시에 처리합니다. 공개 사이트에 적합합니다.
  • Browser Scraping: 로그인된 브라우저 탭에서 실행됩니다. 인증이 필요한 사이트(CRM, 접근 제한 디렉터리, 내부 도구)에 사용하세요.

결과는 확장 프로그램 사이드바의 표에 바로 나타납니다. 내보내기 전에 눈에 띄는 오류가 있는지 확인하세요.

4단계: Excel, Google Sheets, Airtable 또는 Notion으로 내보내기

내보내기 버튼을 클릭하고 원하는 형식을 선택하세요. Thunderbit는 Excel, Google Sheets, Airtable, Notion으로 무료 내보내기를 지원합니다. 추가 결제도 없습니다. 이미지 필드는 Notion과 Airtable의 이미지 라이브러리에 직접 업로드되므로, 상품 사진이나 프로필 사진을 스크래핑할 때 특히 유용합니다.

JSON 파싱도, 스크립트도 필요 없습니다. 데이터는 바로 사용할 수 있습니다.

Gemini로 멀티페이지 및 하위 페이지 스크래핑하기

대부분의 튜토리얼은 조용히 URL 하나에서 끝납니다. 실제 스크래핑 업무는 그렇지 않죠.

페이지네이션과 상세 하위 페이지가 있는 상품 페이지 500개를 스크래핑하는 일은 하나의 업무입니다. 그리고 단일 URL 데모와 실제 업무 사이의 간극은 매우 큽니다.

Gemini API로 페이지네이션 처리하기(코드 방식)

페이지 번호가 붙은 URL 패턴이 가장 흔합니다. 결과가 비어 있을 때까지 페이지를 반복하면 됩니다.

1import time
2all_products = []
3for page in range(1, 101):  # 최대 100페이지
4    url = f"https://example.com/products?page={page}"
5    md = fetch_clean(url)  # 앞에서 만든 HTML→Markdown 함수
6    response = client.models.generate_content(
7        model="gemini-2.5-flash-lite",  # 목록 페이지는 저렴한 모델 사용
8        contents=f"상품명과 URL을 추출해 주세요:\n\n{md}",
9        config=types.GenerateContentConfig(
10            response_mime_type="application/json",
11            response_schema=list[ListingItem],
12        ),
13    )
14    items = response.parsed
15    if not items:
16        break
17    all_products.extend(items)
18    time.sleep(4)  # 무료 티어 한도 준수

커서 기반 또는 무한 스크롤 사이트라면, 프런트엔드가 호출하는 XHR 엔드포인트를 브라우저 Network 탭에서 찾아 직접 반복 호출해야 합니다. 페이지를 다시 렌더링하는 것보다 훨씬 저렴하며, LLM 정리가 필요한 필드가 있을 때만 Gemini를 통과시키면 됩니다.

여기서는 토큰 비용을 꼭 주의하세요. 페이지가 늘어날수록 요금도 같이 늘어납니다. 단순한 목록 페이지는 Flash Lite를 사용하고, 상세 추출이 필요할 때만 Flash로 올리세요.

더 풍부한 데이터를 위한 하위 페이지 스크래핑(코드 방식)

클래식한 2단계 패턴입니다. 1단계에서 목록 페이지의 URL을 수집하고, 2단계에서 각 상세 페이지로 들어가 더 많은 정보를 추출합니다.

1# 1단계: 저렴한 Flash Lite로 URL 수집
2class Listing(BaseModel):
3    product_urls: list[str]
4listing = client.models.generate_content(
5    model="gemini-2.5-flash-lite",
6    contents=f"상품 URL을 추출해 주세요:\n{listing_md}",
7    config=types.GenerateContentConfig(
8        response_mime_type="application/json",
9        response_schema=Listing,
10    ),
11).parsed
12# 2단계: Flash로 상세 정보 추출
13class ProductDetail(BaseModel):
14    name: str
15    price: str
16    specs: dict[str, str]
17    reviews: list[str]
18for url in listing.product_urls:
19    md = fetch_clean(url)
20    detail = client.models.generate_content(
21        model="gemini-2.5-flash",
22        contents=f"상품 상세 정보를 추출해 주세요:\n{md}",
23        config=types.GenerateContentConfig(
24            response_mime_type="application/json",
25            response_schema=ProductDetail,
26        ),
27    ).parsed
28    # detail 저장...
29    time.sleep(0.5)

이 방식은 동작하지만, URL 중복 제거, 오류 처리, 속도 제한 관리, 재시도 로직, 스키마를 수정해도 다시 가져오지 않도록 원본 HTML 캐싱 등 붙여야 할 장치가 많습니다. 50페이지 정도는 감당할 수 있지만, 5,000페이지가 되면 인프라를 만드는 셈입니다.

노코드 대안: Thunderbit의 내장 페이지네이션 및 하위 페이지 스크래핑

Thunderbit는 클릭 방식과 무한 스크롤 페이지네이션을 자동으로 처리하므로 반복문을 직접 짤 필요가 없습니다. 하위 페이지 보강은 "Scrape Subpages" 기능으로 목록에 연결된 각 상세 페이지를 방문해 원본 표에 더 깊은 필드를 채워 넣습니다. 스크립트 한 줄보다 버튼 한 번이 더 간단합니다.

Cloud Scraping 모드는 최대 50페이지를 동시에 처리하므로, 상품 카탈로그나 부동산 디렉터리를 대규모로 스크래핑할 때 큰 차이를 만듭니다. Python 루프와 재시도 로직을 직접 관리하고 싶지 않은 사람에게는 가장 실용적인 선택입니다. (도 별도 가이드로 정리해 두었습니다.)

스크린샷 스크래핑: Gemini의 멀티모달 지름길

대부분의 튜토리얼이 완전히 건너뛰는 방식이 있습니다. 바로 웹페이지의 스크린샷을 Gemini의 비전 API에 보내는 것입니다. 원시 HTML 대신 이미지 한 장만 보내는 셈이죠. 한 개발자는 고 보고했는데, 이는 정리된 Markdown보다도 훨씬 저렴할 수 있습니다. 단순 추출 작업에서는 비용 차이가 꽤 큽니다.

Gemini 비전 API로 웹 스크래핑하는 방법

Playwright로 스크린샷을 찍고, 이를 인코딩한 뒤 Gemini로 보냅니다.

1from playwright.sync_api import sync_playwright
2from google import genai
3from google.genai import types
4from pydantic import BaseModel
5class Product(BaseModel):
6    title: str
7    price: str
8with sync_playwright() as p:
9    page = p.chromium.launch().new_page()
10    page.goto("https://example.com/product/widget-pro")
11    page.wait_for_load_state("networkidle")
12    png_bytes = page.screenshot(full_page=False)  # 화면 상단 영역만
13client = genai.Client()
14resp = client.models.generate_content(
15    model="gemini-2.5-flash",
16    contents=[
17        {"inline_data": {"mime_type": "image/png", "data": png_bytes}},
18        "상품 제목과 가격을 JSON으로 추출해 주세요.",
19    ],
20    config=types.GenerateContentConfig(
21        response_mime_type="application/json",
22        response_schema=Product,
23    ),
24)
25print(resp.parsed)

Google의 에 따르면, 가로세로가 모두 384px 이하인 이미지는 258 토큰입니다. 더 큰 이미지는 768×768 타일로 나뉘며 타일 하나당 258 토큰이 듭니다. 짧은 상단 화면 스크린샷(258~1,600 토큰)은 원시 HTML보다 훨씬 유리하지만, 아주 긴 전체 페이지 스크린샷(~5,000 토큰)은 정리된 Markdown(~765~1,200 토큰)보다 오히려 비쌀 수 있습니다.

스크린샷 스크래핑의 한계

  • 밀도 높은 표에는 정밀도가 떨어집니다: 여러 열이 겹치거나 글자가 작거나 요소가 겹치는 레이아웃은 일부를 놓칠 수 있습니다. 환각이라기보다 레이블 누락이나 헤더 정렬 오류에 가깝습니다.
  • 링크를 따라갈 수 없습니다: 비전 모델은 클릭 가능한 앵커가 아니라 텍스트를 반환합니다. 페이지네이션도, 하위 페이지 보강도 불가능합니다.
  • 해상도 한계: 약 10px보다 작은 텍스트는 자주 잘못 읽힙니다. Google은 긴 변을 약 1,568px 정도로 다운샘플링합니다.
  • 캡처 오버헤드: Playwright 실행 + networkidle 대기만 해도 페이지당 2~5초가 걸려 대규모 작업에서는 누적됩니다.

스크린샷 스크래핑은 JavaScript가 많은 페이지, 봇 차단 사이트(requests.get()은 403을 주지만 브라우저에서는 정상 표시되는 경우), 차트나 이미지 안에 데이터가 들어 있는 페이지에서 특히 강합니다. 반면 텍스트가 많은 긴 페이지라면 여전히 Markdown이 더 좋습니다.

Thunderbit의 이미지 및 PDF 스크래핑도 비슷한 AI 비전 접근을 사용합니다. 이미지를 넣으면 구조화된 표로 변환해 주며, 스크린샷 스크립트나 base64 작업이 필요 없습니다. (도 참고해 보세요.)

Gemini 웹 스크래핑이 실패하는 경우와 대안

Gemini는 추출 엔진이지, 가져오기 엔진이 아닙니다. 페이지 내용을 Gemini까지 가져오지 못하면 아무 소용이 없습니다. 끝입니다.

이 접근법이 통째로 무너지는 대표적인 상황이 몇 가지 있는데, 대부분의 튜토리얼은 이를 뒷부분에 슬쩍 넣어 둡니다. 저는 더 솔직하게 말씀드리겠습니다.

한계무슨 일이 벌어지는가대응 방법
안티봇 / CloudflareAPI 요청이 차단되고 requests.get()은 403 또는 챌린지 페이지를 반환TLS 지문 회전 프록시를 사용하거나 브라우저 기반 도구 사용(Thunderbit의 브라우저 스크래핑은 로그인 세션 활용)
토큰 윈도우 한계큰 페이지가 사용 가능한 컨텍스트를 초과함(기술적으로는 100만 토큰이지만, 안정적인 추출은 약 20만~30만 토큰이 현실적)HTML→Markdown 정리, 페이지 분할, 또는 스크린샷 사용
시각 콘텐츠 환각Gemini가 실제 이미지 내용 대신 alt 텍스트나 캡션을 추측출력 검증, 이미지 데이터는 비전 API 명시 사용, grounding validator 추가
API 속도 제한대량 처리 시 제한 발생 — 무료 티어는 Pro 약 100 RPD, Flash Lite 약 1,000 RPD큐 관리, 배치 처리(50% 할인), 또는 사전 구축 도구 사용
추출 일관성 부족(Lite 모델)선택 필드, 타임스탬프, 중첩 데이터 누락 또는 조작Flash/Pro로 업그레이드하거나 명시적 스키마 제약 추가
보호된 사이트(LinkedIn 등)오류 또는 빈 데이터 반환활성 세션을 사용하는 브라우저 기반 스크래핑(Thunderbit 지원), 이용약관 준수

이 중 몇 가지는 추가 설명이 필요합니다.

안티봇은 이제 LLM도 의식합니다. Cloudflare는 2025년 7월부터 하고 있으며, 첫 5개월 동안 4160억 건의 AI 봇 요청을 차단했습니다. Datadome도 2025년에 LLM 전용 탐지를 추가했고, LLM 봇 트래픽이 4배 증가했다고 밝혔습니다. 단순한 requests.get() + Gemini 조합은 Datadome 보호 사이트 앞에서는 사실상 끝났습니다. 문제는 IP가 아니라 지문입니다. TLS 지문이 "Python requests"라고 말하는데 IP만 바꿔 봐야 소용이 없습니다.

환각은 미묘합니다. 유용하다고 학습된 LLM은 선택 필드를 null로 두기보다 그럴듯한 내용을 지어내는 경향이 있습니다. 모델이 URL 슬러그에서 상품 브랜드를 추측하거나, TLD에서 통화를 유추하거나, 스켈레톤 로더를 보고 그럴듯하지만 가짜인 리뷰 수를 써 넣는 경우를 봤습니다. 대응 스택은 다음과 같습니다. 엄격한 Pydantic 스키마, 검증 피드백을 포함한 재시도 루프, 추출값이 실제 원본 HTML에 존재하는지 확인하는 grounding validator, 그리고 (Flash가 추출하고 Pro가 샘플을 검증)입니다.

100만 토큰 컨텍스트 윈도우를 100만 토큰까지 실사용할 수 있는 것은 아닙니다. 와 다른 연구들에 따르면, 추론 품질은 토큰 한도 훨씬 이전부터 떨어집니다. 구조화 추출에서는 약 20만~30만 토큰을 실질적인 상한으로 보는 것이 좋습니다.

의사결정 트리: 어떤 도구를 써야 할까?

  • 작은 규모 + 단순 페이지 + 개발자 → Gemini API 무료 티어 + Python
  • 중간 규모 + 복잡한 스키마 + 개발자 → Gemini 2.5 Flash 유료 + Python + 구조화 출력 + 전처리
  • 어떤 규모든 + 비개발자 + 로그인 벽/페이지네이션 많음
  • 매우 큰 규모 + 강한 봇 차단 + 미션 크리티컬 → 관리형 스크래핑 인프라(프록시 서비스) + 추출 계층으로 Gemini

Gemini 웹 스크래핑: 시간과 비용을 아끼는 팁

Python으로 짜든 버튼을 클릭하든, 아래 팁들은 분명 도움이 됩니다.

  1. Gemini에 보내기 전에 항상 HTML을 Markdown으로 전처리하세요. 일반적으로 이 가능하며, BeautifulSoup로 미리 잘라내면 95% 절감도 가능합니다.
  2. google-genai만 사용하세요. deprecated 된 google-generativeai 패키지는 쓰지 마세요.
  3. Flash Lite는 평면 스키마에서만 시작하세요. 중첩이나 선택 필드가 보이면 즉시 Flash로 올리세요.
  4. Gemini에 넘기는 Pydantic 스키마에서는 Field(default=...)를 피하세요. 대신 sku: str | None = None처럼 타입 수준에서 처리하세요.
  5. Pydantic + response_schema는 핵심 방어선입니다. 계약이자 환각 방지 장치입니다.
  6. 1,000페이지가 넘는 작업에는 를 사용하세요. 50% 할인되고 실시간 RPM에도 영향을 덜 줍니다.
  7. 새 추출기를 대규모로 돌리기 전에 10~50개 행을 직접 샘플링해 검증하세요. 정확도 저하는 직접 보기 전까지는 잘 안 보입니다.
  8. 원본 HTML은 디스크에 캐시하세요. 스키마를 조금 수정했다고 다시 가져올 필요는 없습니다.
  9. 모든 행에 원본 URL을 기록하세요. 전체 작업을 다시 돌리지 않고도 개별 페이지를 재크롤링할 수 있습니다.
  10. 노코드 사용자라면 Thunderbit의 열별 AI 프롬프트를 활용해 프롬프트 엔지니어링을 스프레드시트 레이어로 옮기세요. 번역, 분류, 요약을 열 단위로 처리할 수 있습니다.

그리고 하나 더: 무료 티어를 프로덕션에 그대로 올리면 안 됩니다. 2025년 12월에 제한이 50~80% 줄었고, 예고 없이 또 줄어들 수 있습니다.

마무리

단일 URL Gemini 데모와 실제 운영 파이프라인 사이의 거리는 대부분의 튜토리얼이 보여주는 것보다 훨씬 큽니다.

Python + Gemini API 경로는 개발자에게 모델 선택, 전처리, 페이지네이션, 스키마 설계를 전부 통제할 수 있게 해 줍니다. 반면 같은 노코드 도구는 비즈니스 사용자가 터미널을 건드리지 않고도 같은 수준의 구조화 데이터 추출을 가능하게 해 줍니다.

제가 꼭 전하고 싶은 핵심은 이렇습니다.

  • 모델 선택이 중요합니다. 대량 처리에는 Flash Lite, 균형은 Flash, 복잡성은 Pro입니다. 가장 싼 옵션을 기본값으로 두고 왜 데이터가 틀렸는지 의아해하지 마세요.
  • 멀티페이지와 하위 페이지 스크래핑이야말로 튜토리얼이 가장 자주 놓치는 부분이고, 실제 업무가 벌어지는 지점입니다. 이 글의 두 경로는 그 공백을 메웁니다.
  • 한계를 솔직하게 알면 시간을 아낄 수 있습니다. 사이트가 API 요청을 막는다면 아무리 프롬프트를 잘 써도 소용없습니다. 가장 화려한 도구가 아니라, 작업에 맞는 도구를 고르세요.
  • HTML을 Markdown으로 전처리하는 것이 가장 효과가 큰 최적화입니다. 비용을 75% 이상 줄이고 환각도 낮춰 줍니다.

노코드 경로를 시험해 보고 싶다면 로 몇 페이지를 직접 스크래핑해 결과를 확인해 보세요. 코딩을 선호한다면 Gemini 무료 API 티어만으로도 오후 한나절이면 파이프라인 프로토타입을 만들 수 있습니다. 어느 쪽이든 복붙보다 훨씬 빠르게 구조화된 데이터를 얻을 수 있습니다. 이나 도 블로그에서 자세히 다뤘습니다.

AI 웹 스크래핑용 Thunderbit 사용해 보기

FAQ

Gemini로 웹 스크래핑하는 데 비용은 얼마나 드나요?

Gemini API는 무료 티어가 있으며, 2026년 초 기준으로 Pro는 하루 약 100회, Flash는 500회, Flash Lite는 1,000회 정도 요청할 수 있습니다(이 제한은 2025년 12월에 축소되었습니다). 유료 티어에서는 HTML을 먼저 Markdown으로 전처리한다고 가정할 때, 10,000개 상품 페이지 스크래핑 비용이 Flash Lite 약 $1.50, Flash 약 $6, Pro 약 $25 정도입니다. 전처리를 하지 않으면 비용이 4~5배로 증가합니다. Batch API는 실시간이 아닌 작업에 50% 할인을 제공합니다.

Gemini로 로그인 필요한 웹사이트도 스크래핑할 수 있나요?

Gemini API 자체는 웹사이트에 로그인할 수 없습니다. 사용자가 보내는 콘텐츠만 처리할 뿐입니다. 따라서 본인이 인증된 세션으로 HTML을 직접 가져와야 합니다(예: 헤드리스 브라우저와 저장된 쿠키 사용). Thunderbit의 Browser Scraping 모드는 이 과정을 기본으로 처리합니다. 로그인된 Chrome 탭 안에서 동작하므로, 브라우저에서 볼 수 있는 사이트라면 Thunderbit가 스크래핑할 수 있습니다.

Gemini 웹 스크래핑은 합법인가요?

합법성은 웹사이트의 이용약관, 데이터 유형, 관할 지역에 따라 다릅니다. 미국에서는 hiQ v. LinkedInMeta v. Bright Data 이후, 로그인 없이 공개 접근 가능한 데이터를 스크래핑하는 것은 대체로 허용되는 것으로 여겨집니다. 다만 모든 사례는 사실관계에 따라 달라집니다. 로그인 뒤에 있는 데이터를 스크래핑하면 법적 위험이 더 큽니다. EU 거주자의 개인정보는 공개 사이트인지 여부와 관계없이 GDPR 적용 대상입니다. 항상 robots.txt와 이용약관을 준수하고, 법적 근거 없이 개인정보를 스크래핑하지 마세요.

Gemini로 JavaScript가 많은 동적 사이트도 스크래핑할 수 있나요?

가능합니다. 다만 먼저 JavaScript를 렌더링해야 합니다. 헤드리스 브라우저(Playwright, Puppeteer)를 쓰거나 사이트의 API 엔드포인트를 직접 가로채면 됩니다. 렌더링된 HTML을 얻은 뒤에는 평소처럼 정리해서 Gemini로 보내면 됩니다. 또는 Gemini의 비전 API로 스크린샷 스크래핑을 쓰면 JS 렌더링을 완전히 건너뛸 수 있습니다. 브라우저에 보이는 내용이라면 Gemini도 볼 수 있습니다. Thunderbit는 Cloud와 Browser 스크래핑 모드 모두에서 JS 렌더링 페이지를 자동 처리합니다.

Gemini로 스크래핑하는 것과 Thunderbit 같은 전용 스크래핑 도구를 쓰는 것의 차이는 무엇인가요?

Gemini는 추출 엔진입니다. 콘텐츠를 해석해서 구조화된 데이터를 돌려주죠. 웹사이트를 방문하거나, 페이지네이션을 처리하거나, 인증을 관리하거나, 스프레드시트로 내보내는 일을 직접 하지는 않습니다. 따라서 페이지 내용을 Gemini로 가져오는 도구와, 결과를 활용하는 도구가 따로 필요합니다. 같은 전용 도구는 가져오기, 렌더링, AI 추출, 페이지네이션, 하위 페이지 보강, 내보내기를 하나의 패키지로 묶어 제공합니다. 별도 연결 작업이 필요 없습니다.

더 알아보기

Shuai Guan
Shuai Guan
Co-founder/CEO @ Thunderbit. Passionate about cross section of AI and Automation. He's a big advocate of automation and loves making it more accessible to everyone. Beyond tech, he channels his creativity through a passion for photography, capturing stories one picture at a time.
목차

Thunderbit 사용해보기

리드와 기타 데이터를 단 2번 클릭으로 수집하세요. AI로 구동됩니다.

Thunderbit 받기 무료예요
AI로 데이터 추출하기
Google Sheets, Airtable, Notion으로 데이터를 쉽게 옮기세요
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week