제12편: 웹 크롤링의 함정 - IMPORTXML과 IMPORTHTML로 가져온 데이터가 수시로 깨지고 에러(N/A)가 나는 이유와 주기적 동기화 관리법

구글 스프레드시트의 수많은 강력한 기능 중에서도 초보 가드너가 중급자로 레벨업할 때 가장 감탄하는 기능은 외부 웹사이트의 데이터를 실시간으로 긁어오는 '웹 크롤링(Web Crawling)' 함수일 것입니다. 네이버 금융의 주가 정보, 기상청의 실시간 날씨, 혹은 특정 쇼핑몰의 상품 가격을 수식 하나로 시트에 고스란히 앉힐 수 있으니 말이죠. 이때 주로 사용하는 함수가 바로 IMPORTXML과 IMPORTHTML입니다.

처음에는 이 함수들을 활용해 실시간 대시보드를 만들고 짜릿함을 느낍니다. 하지만 며칠 지나지 않아 시트를 켜보면 멀쩡하던 데이터 자리에 #N/A이나 Loading... 에러가 가득 차 있거나, 행이 밀려 데이터가 엉뚱한 칸에 들어가 있는 현상을 마주하게 됩니다. 내가 직접 데이터 수집 시트를 운영해보니, 이 현상은 구글 스프레드시트의 작동 원리와 외부 웹사이트의 변화를 이해하지 못해 생기는 전형적인 오류였습니다. 실시간 연동 데이터가 수시로 깨지는 근본적인 원인과 이를 안정적으로 관리하는 동기화 팁을 공유합니다.

[실시간 연동이 아니라 시한폭탄? IMPORT 함수의 치명적인 한계]

IMPORTXML이나 IMPORTHTML 함수가 수시로 에러를 뿜는 가장 큰 이유는 구글 서버와 대상 웹사이트 간의 '새로고침 주기' 때문입니다. 많은 사용자가 이 함수를 쓰면 내 모니터 화면처럼 실시간으로 데이터가 계속 동기화된다고 생각합니다.

하지만 구글 스프레드시트는 웹페이지를 매초마다 긁어오는 것이 아니라, 내부 알고리즘에 따라 대략 1시간에서 2시간 주기로 한 번씩 해당 웹사이트에 접속해 데이터를 갱신합니다. 문제는 이때 발생합니다. 데이터가 갱신되는 시점에 대상 웹사이트의 서버가 잠시 느려지거나 구글의 접근을 차단하면 시트는 곧바로 에러를 뱉어냅니다.

특히 하나의 시트에 IMPORT 함수를 수십 개 이상 남발하면 구글 서버가 해당 웹사이트에 한꺼번에 수많은 요청을 보내게 되는데, 웹사이트 입장에서는 이를 디도스(DDoS) 공격 같은 유해한 트래픽으로 인식하여 구글의 IP를 일시적으로 차단(Blocking)해 버립니다. 결국 시트 전체가 #N/A 에러로 마비되는 결과를 초래하는 것입니다.

[웹사이트 디자인 변경이 불러오는 데이터 대참사]

또 다른 문제는 '웹페이지 구조의 가변성'입니다. IMPORTXML은 웹페이지의 HTML 구조 내에서 특정 위치를 지정하는 XPath를 참조하여 데이터를 가져옵니다. IMPORTHTML 역시 페이지 내의 몇 번째 테이블(table)이나 리스트(list)인지를 기준으로 삼습니다.

즉, 내가 데이터를 긁어오던 사이트의 관리자가 메뉴 위치를 살짝 바꾸거나 디자인을 개편하여 태그 구조가 단 한 줄만 바뀌어도 수식은 길을 잃어버립니다. 어제까지는 현재 주가가 나오던 칸에 오늘은 느닷없이 '회사 소개'라는 텍스트가 찍히거나, 구조가 뒤틀려 수식 전체가 깨지는 현상이 일어나는 이유가 바로 여기에 있습니다. 외부 사이트는 우리가 제어할 수 없는 영역이기 때문에, 100% 수식에만 의존하는 크롤링은 언제 깨질지 모르는 시한폭탄과 같습니다.

[깨지지 않는 데이터 가드닝: 앱스 스크립트를 활용한 주기적 저장법]

이 문제를 완벽하게 해결하고 데이터를 안정적으로 축적하려면, 매번 실시간으로 웹사이트를 호출하는 수식 구조에서 벗어나야 합니다. 가장 추천하는 방법은 구글 앱스 스크립트(Google Apps Script)를 활용하여 정해진 시간(예: 매일 자정 또는 매시간)에 한 번만 데이터를 긁어와 시트에 '값(Value)'으로 고정해 버리는 것입니다.

만약 코딩이 낯선 초보자라면, 함수 주변에 안전장치를 설치하는 것부터 시작해 보세요. 대표적인 것이 IFERROR 함수와의 결합입니다. =IFERROR(IMPORTXML("URL", "XPath"), "데이터 로딩 실패") 형태로 감싸주면, 일시적인 서버 오류로 인해 시트 전체의 수식이 멈추거나 뒤틀리는 현상을 막아주고 가독성을 유지할 수 있습니다.

더불어 동일한 URL을 참조하는 수식이 여러 개라면, 각 셀마다 IMPORT 함수를 쓰지 마세요. A1 셀 딱 한 곳에만 IMPORT 함수를 작성해 데이터를 통째로 불러온 뒤, 다른 셀에서는 =A1 형태로 그 결과를 간접 참조하는 것이 구글 서버의 과부하를 막고 에러 확률을 줄이는 가장 기본적이면서도 강력한 최적화 노하우입니다.

핵심 요약

  • IMPORTXML과 IMPORTHTML은 실시간 연동이 아니라 구글의 주기적 호출 방식을 따르므로, 외부 사이트의 트래픽 차단이나 서버 지연에 의해 #N/A 에러가 자주 발생합니다.

  • 외부 웹사이트의 HTML 구조나 XPath가 미세하게 변경되면 수식이 데이터를 찾지 못하고 화면이 완전히 뒤틀리는 취약점이 있습니다.

  • 에러를 방지하려면 단일 셀에서만 IMPORT 함수를 호출해 다른 셀들이 간접 참조하게 유도하고, IFERROR 함수로 안전장치를 만들거나 앱스 스크립트를 통해 데이터를 값으로 고정하는 정적 저장 방식을 도입해야 합니다.

다음 편 예고 

외부 데이터를 안전하게 가져오는 법을 익혔다면, 이제 이 귀한 데이터들을 타인과 공유하며 협업할 차례입니다. 다음 제13편에서는 "공유 권한의 덫 - 보기 권한자가 수식을 수정하거나 데이터를 훼손하지 못하게 막는 범위 보호 기능과 필터 보기(Filter View)의 올바른 활용법"에 대해 상세히 다루어 보겠으니 기대해 주세요.

댓글 유도 질문 

IMPORT 함수로 주가나 날씨 정보를 수집하다가 갑자기 데이터가 사라져서 당황하셨던 적이 있으신가요? 현재 어떤 사이트의 데이터를 긁어오려다 막히셨는지 댓글로 남겨주시면 수식 구조를 함께 점검해 드릴게요!

댓글 쓰기

0 댓글

페이지

이 블로그 검색

신고하기

프로필

이미지alt태그 입력