본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 30. 10:11

전통적인 웹 스크래핑이 실패할 때: 실용적인 AI 접근 방식

요약

HTML 구조가 빈번하게 변경되는 동적 웹사이트에서 전통적인 스크래핑 방식의 한계를 극복하기 위해 LLM을 활용한 데이터 추출 방식을 제안합니다. CSS 셀렉터 대신 자연어 지시를 통해 데이터의 의미를 파악함으로써 유지보수 효율을 높이는 접근법을 다룹니다.

핵심 포인트

  • HTML 구조 변화에 유연한 AI 기반 데이터 추출 방식 제안
  • LLM을 활용하면 클래스명 변경과 관계없이 문맥 기반 추출 가능
  • 정확도, 비용, 지연 시간, 토큰 제한 등 실무적 트레이드오프 고려 필요
  • 대규모 스크래핑보다는 소규모 및 배치 작업에 적합

저는 수년 동안 웹 스크래퍼(web scrapers)를 구축해 왔습니다. BeautifulSoup, Scrapy, Selenium — 저는 이 모든 것을 사용해 보았습니다. 하지만 지난달에 벽에 부딪혔습니다. 한 고객이 며칠마다 HTML 구조가 바뀌는 사이트에서 제품 데이터를 추출해 달라고 요청했기 때문입니다. 어떤 주에는 가격이 <span class="price">에 있었지만, 다음 주에는 무작위 ID를 가진 <div> 안에 들어 있었습니다. 제 스크래퍼는 계속 고장 났고, 저는 실제로 데이터를 가져오는 것보다 셀렉터(selectors)를 수정하는 데 더 많은 시간을 소비하고 있었습니다.

문제점

해당 사이트는 동적인 이커머스(e-commerce) 플랫폼이었습니다. 콘텐츠를 렌더링하기 위해 JavaScript를 사용했고, 개발자들은 클래스 이름(class names)을 뒤섞는 것을 즐기는 듯했습니다. 저는 평소 사용하던 도구들을 시도해 보았습니다:

  • BeautifulSoup + requests: 콘텐츠가 JS를 통해 로드되었기 때문에 실패했습니다.
  • Selenium: 작동은 했지만, 느리고 취약했습니다. 레이아웃이 바뀔 때마다 XPath를 업데이트해야 했습니다.
  • Playwright: 마찬가지였습니다. 단지 더 빠를 뿐이었습니다.

저에게는 단순히 DOM에서의 위치가 아니라 데이터의 '의미'를 이해할 수 있는 무언가가 필요했습니다. 그때 이런 생각이 들었습니다: 왜 AI 모델을 사용하여 사람이 페이지를 읽는 것처럼 읽게 하지 않을까?

아이디어

CSS 셀렉터(CSS selectors)를 작성하는 대신, 가공되지 않은 HTML(또는 스크린샷)을 언어 모델(language model)에 입력하고 구조화된 데이터를 추출하도록 요청하는 것입니다. 모델은 클래스 이름에 신경 쓰지 않습니다. 모델은 문맥(context)을 이해합니다. "가격을 찾아줘"라는 명령은 자연어 지시(natural language instruction)가 됩니다.

저는 OpenAI의 GPT-4를 사용하여 이를 테스트하기로 결정했지만, 동일한 접근 방식은 성능이 뛰어난 어떤 LLM(Claude, Ollama를 통한 로컬 모델, 또는 https://ai.interwestinfo.com/과 같은 특화된 API)에서도 작동합니다.

코드

다음은 GPT-4를 사용하여 웹페이지에서 제품 정보를 추출하는 간단한 Python 스크립트입니다. OpenAI API 키가 필요합니다.

import requests
from bs4 import BeautifulSoup
import openai
...

이것은 최소한의 예시입니다. 실제 운영 환경(production)에서는 페이지네이션(pagination), 재시도(retries), 그리고 속도 제한(rate limiting)을 처리해야 합니다.

배운 점

작동은 합니다 — 하지만 마법은 아닙니다.

  • 정확도 (Accuracy): 단순한 페이지의 경우 모델이 약 90%의 확률로 정확하게 파악합니다. 하지만 페이지에 광고가 가득하거나 제품 정보가 모호할 경우, 환각 (hallucination) 현상이 발생할 수 있습니다.
  • 비용 (Cost): GPT-4는 비쌉니다. 요청당 몇 센트의 비용이 발생하므로, 이 접근 방식은 소규모 스크래핑 (수백 페이지 단위, 수백만 페이지 아님)에만 실행 가능합니다.
  • 지연 시간 (Latency): 페이지당 2~5초 정도를 예상해야 합니다. 실시간 처리에는 적합하지 않지만, 배치 작업 (batch jobs)에는 괜찮습니다.
  • 토큰 제한 (Token limits): 페이지가 크면 다듬는 과정이 필요합니다. 저는 종종 HTML을 청크 (chunks) 단위로 나누고 결과를 병합해야 했습니다.

트레이드오프 (Trade-offs) 및 대안

접근 방식장점단점
전통적인 스크래핑 (CSS/XPath)빠르고, 저렴하며, 예측 가능함취약하며, 지속적인 유지보수가 필요함
...

제 클라이언트의 경우, 결국 하이브리드 (hybrid) 방식을 사용했습니다. 안정적인 부분(제품 제목 등)에는 전통적인 셀렉터 (selectors)를 사용하고, 셀렉터가 실패할 때 AI를 폴백 (fallback)으로 사용하는 방식입니다. 이를 통해 신뢰성을 높게 유지하면서 비용을 절감할 수 있었습니다.

이 방식을 사용하지 말아야 할 때

  • 대규모 스크래핑 (High-volume scraping) (수백만 페이지) — 비용이 감당할 수 없는 수준이 됩니다.
  • 실시간 API (Real-time APIs) — 지연 시간이 너무 높습니다.
  • 민감한 데이터가 포함된 페이지 — HTML을 제3자 API로 전송하는 것은 서비스 약관을 위반할 수 있습니다.

다음에 다시 한다면 다르게 할 점

  1. 로컬 모델 (local model) 사용: API 비용을 피하기 위해 Ollama를 통해 Llama 3 또는 Mistral 같은 모델을 사용하겠습니다. 정확도는 낮아질 수 있지만, 비용이 들지 않습니다.
  2. 소형 모델 미세 조정 (Fine-tune a small model): 특정 사이트의 HTML 패턴에 맞춰 모델을 미세 조정하겠습니다. 대부분의 프로젝트에는 과할 수 있지만, 재미있는 시도가 될 것입니다.
  3. 공격적인 캐싱 (Cache aggressively): 동일한 페이지에 대해 모델에게 다시 묻지 않도록 하겠습니다.

마치며

AI가 전통적인 스크래핑을 완전히 대체하지는 않겠지만, 셀렉터가 깨지는 짜증 나는 예외 상황(edge cases)에서는 강력한 도구가 될 것입니다. 여기서 보여드린 기술은 하나의 예시일 뿐입니다. 스크린샷에 비전 모델 (vision models)을 사용하거나, 구조화된 추출 API (structured extraction APIs)를 사용할 수도 있습니다.

데이터 추출을 위해 LLM을 사용해 보신 적이 있나요? 여러분의 설정은 어떤 모습인가요?

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0