"타겟 웹사이트의 레이아웃이나 HTML 구조가 갑자기 변경되었을 때, 웹 크롤링/데이터 수집 에이전트의 파싱 로직이 멈추고 에러를 내뿜으며 전체 수집 파이프라인이 마비되는 '데이터 스키마 박살 현상' 때문에 매번 수동 수정하느라 고통받았습니다."
AI 에이전트를 활용해 실시간 뉴스, 시장 가격, 기업 정보, 외부 웹 페이지 데이터를 자동으로 크롤링하고 수집하는 파이프라인을 운영할 때 개발자를 가장 지치게 만드는 예기치 못한 사고가 있습니다. 바로 '수집 대상 사이트의 HTML 구조 변경에 따른 크롤러 마비 현상'입니다.
잘 돌아가던 웹 크롤러 에이전트가 어느 날 갑자기 먹통이 되어 확인해 보면, 타겟 사이트가 리뉴얼을 진행했거나 CSS 클래스명 하나를 바꾸는 바람에 기존에 지정해둔 HTML 파싱 태그(DOM Selector)를 찾지 못해 에이전트가 무한 에러를 내뿜는 일(Scraping Breakdown)이 비일비재하지요. 오늘은 제가 직접 경험했던 '새벽에 타겟 사이트 개편으로 수집 에이전트가 뻗어 서비스 데이터가 몽땅 펑크 났던 잔혹사'와 이를 완벽하게 해결해 낸 '자가 수복(Self-Healing) 동적 스키마 복구 파이프라인' 구축기를 이야기해 볼게요.
1. "어제까지 잘 긁어오던 데이터가 왜 죄다 None이지?" - 크롤러 마비의 비극
수십 개 외부 매체의 주요 동향을 실시간으로 수집해 요약 리포트를 생성하는 자동화 에이전트를 운용할 때였습니다. 크롤링 노드가 정해진 시간마다 알아서 신규 데이터를 척척 가져오니 아주 든든하다고 생각했지요.
하지만 월요일 아침, 출근해서 확인한 모니터링 시스템은 빨간색 에러 알람으로 도배되어 있었습니다. 주요 타겟 사이트 중 한 곳이 주말 사이 사이트 UI를 전면 개편하면서 기존의 `div.article-content` 태그가 사라져 버린 것입니다. 에이전트는 빈 값(None)을 받아온 것도 모자라, 비어있는 데이터를 억지로 분석하려다 연쇄 파이프라인 에러를 내뿜으며 서버 자원을 고갈시키고 있었습니다.
정적 HTML 구조(CSS Selector/XPath)에 고정된 크롤링 방식은 외부 환경이 조금만 바뀌어도 손쉽게 무너지는 모래성 아키텍처라는 사실을 뼈저리게 깨달은 순간이었습니다.
2. 시행착오: 매번 LLM에게 전체 HTML을 던져서 긁어오라고 시켰더니...
HTML 변경에 유연하게 대응하겠다고 크롤링할 때마다 웹 페이지 전체 HTML 코드를 통째로 복사해서 LLM 프롬프트에 밀어 넣고 "여기서 본문 텍스트만 찾아서 뽑아줘"라고 시켜보았습니다.
결과는 엄청난 API 요금 폭탄과 속도 저하로 이어졌습니다. 웹 페이지 하나당 수만 토큰에 달하는 자바스크립트와 스타일시트 코드까지 무식하게 전달되다 보니, 수집 건당 비용이 수백 원씩 깨졌고 응답 시간도 수십 초로 늘어져 실시간 자동화가 불가능해졌습니다. 전체 코드 통째 전달 방식은 비용과 속도 면에서 전혀 현실적인 대안이 못 되었던 것이지요.
💡 몬이쌤의 생각: 학원에서 아이들에게 신문 기사를 오려오라고 숙제를 줬을 때, 신문사 이름이나 편집 디자인이 좀 바뀌었다고 신문 전체를 돋보기로 다 읽고 있을 필요는 없습니다. 보통 때에는 익숙한 헤드라인 위치(Fast Selector)를 빠르게 오려내고, 혹시 신문 양식이 바뀌어 위치를 못 찾을 때에만 '기사 제목과 본문처럼 보이는 덩어리'를 스스로 추론해 찾아내는 '2단계 비상 복구 체계(Self-Healing)'가 있어야 합니다.
3. 해결책: '서킷 브레이커 & LLM 동적 자가 수복' 3단계 데이터 수집 프로토콜
평소에는 0.001초 만에 가벼운 정적 파서로 초고속 수집을 진행하다가, 구조 변경이 감지되는 순간에만 AI가 스스로 새로운 HTML 구조를 학습해 셀렉터를 자동 재구성하도록 '3단계 자가 수복(Self-Healing) 데이터 수집 파이프라인'을 구축했습니다.
- 1단계 [초고속 정적 수집 & 서킷 브레이커 감지(Light Fast Parsing & Anomaly Detect)]: 평시에는 가벼운 BeautifulSoup/Cheerio 파서를 통해 기존 셀렉터로 초고속 수집을 진행합니다. 이때 추출된 데이터가 비어있거나(Null) 비정상적인 형태일 경우 서킷 브레이커(Circuit Breaker)가 작동해 비상 모드로 전환됩니다.
- 2단계 [시맨틱 DOM 트라이밍 & LLM 셀렉터 추론(DOM Trimming & LLM Healing)]: 서킷 브레이커가 켜지면 무거운 전체 코드 대신, 불필요한 태그(script, style, nav)를 제거하고 뼈대 구조만 요약한 시맨틱 DOM 트리(DOM Tree)를 최소 토큰으로 LLM에 전달합니다. LLM은 이 뼈대를 분석해 변경된 최신 'CSS 셀렉터'를 실시간으로 재추론해 냅니다.
- 3단계 [동적 스키마 자동 갱신 및 재수집(Schema Auto-Update & Retry)]: AI가 새로 찾아낸 최신 셀렉터 값을 DB 스키마 저장소에 자동으로 갱신(Self-Healing) 시키고, 즉시 해당 셀렉터로 파이프라인을 재가동하여 손실 없는 데이터를 완벽하게 수집합니다.
4. 결과: 수집 성공률 92% 달성 & 긴급 수동 수리 작업 0건!
3단계 자가 수복 데이터 수집 파이프라인을 도입한 이후, 외부 타겟 사이트들이 리뉴얼을 감행하거나 HTML 레이아웃을 전면 개편하더라도 크롤링 에이전트가 스스로 스키마를 고쳐내며 끊김 없이 작동했습니다!
수집 실패율이 비약적으로 줄어들어 수집 성공률 92% 이상을 안정적으로 유지했을 뿐만 아니라, 새벽마다 깨어나 웹 구조를 재분석하고 코드 태그를 고치던 번거로운 수동 트러블슈팅 노가다에서 완전히 탈출하게 되었지요.
강력한 데이터 수집 에이전트를 설계한다는 것은 단지 고정된 크롤링 코드를 짜는 것에 머물지 않습니다. '평소에는 가볍고 빠르게 수집하되, 환경이 바뀌면 AI가 스스로 바뀐 HTML 지형을 읽어내어 자신의 수집 도구를 자가 치료(Self-Healing)하는 유연한 거버넌스를 세우는 것'이 자동화 아키텍처의 참된 본질입니다.
여러분의 AI 수집 에이전트도 타겟 사이트 레이아웃이 바뀔 때마다 에러가 터지고 멈춰서 고민이신가요? 단순 고정 코드로 수집하려 하지 말고, 서킷 브레이커와 LLM 자가 수복 파이프라인을 도입해 보세요. 어떤 웹 환경 변화에도 굴하지 않고 견고하게 움직이는 명품 에이전트를 소유하게 되실 겁니다.
