경쟁사 가격 모니터링 자동화 반성공썰
클라이언트가 경쟁사 제품 270여 개의 가격을 매주 확인해야 하는데, 브랜드별 탭으로 나뉜 엑셀에 사람이 링크를 하나씩 열어가며 수기로 적어 넣고 있었어요. 파일 하나에 약 2,200행.
"자동화하면 되겠다" 싶어서 4가지 방법을 전부 시도해 봤어요. 결론부터 말하면, 95%는 됐는데 나머지 5%는 사람이 봐야 했습니다. 그래서 "반성공"이에요.
경쟁사 가격, AI 브라우저로 긁을 수 있을까?
가장 먼저 시도한 건 Claude Co-work였어요. AI가 직접 브라우저에서 상품 페이지를 열어 가격을 읽어오는 방식인데, 쇼핑몰마다 페이지 구조가 달라서 가격이 숨어 있는 위치를 제대로 파악하지 못했어요. 엉뚱한 숫자를 가져오는 경우가 많았습니다.
브라우저 AI는 "화면에 보이는 것"을 읽는데, 실제 가격 데이터는 화면이 아니라 페이지 소스코드의 특정 위치에 묻혀 있거든요.
Apps Script로 자동화하면 정확할까?
엑셀을 구글 시트로 옮기고, Apps Script로 네이버 쇼핑의 비공식 내부 API를 호출해서 가격을 채우는 방식이었어요. v1부터 v4까지 네 번 고쳤습니다.
v4까지 고쳤는데, 실제로 확인해 보니 숫자가 들어가긴 하는데 맞는 숫자가 아니었어요. 네이버 등록가와 할인가를 구분 못 하고, 쿠팡 가격은 아예 못 가져오고, 어떤 행에서는 리뷰 수를 가격으로 넣어뒀더라고요. 제대로 가져오는 척만 하고 있었습니다.
그리고 구조적 한계가 하나 더 있었어요. 네이버 스마트스토어의 "멤버십 할인가"는 페이지가 뜬 뒤 브라우저가 한 번 더 서버에 물어보는 비동기 요청으로 채워지는데, API 응답에는 이 값 자체가 없어서 영영 못 잡습니다.
코드로 직접 크롤링하면 되지 않을까?
Playwright로 실제 크롬을 띄우고, 쇼핑몰별 파서를 각각 만들어서 가격을 정확히 읽는 방식이었어요. 범용 크롤러로 "판매가" 옆 숫자를 긁는 건 리뷰 수를 가격으로 집는 사고가 나서(실제로 났어요), 사이트마다 정확한 데이터 위치를 직접 찾아야 했습니다.
| 사이트 | 가격 데이터 위치 |
|---|---|
| G마켓 | og:description 메타태그 안에 가격 문자열 |
| 옥션 | JSON-LD Product.description 필드 (같은 회사인데 구조가 다름) |
| 11번가 | JSON-LD offers.price(할인가), priceSpecification.price(정가) |
| 네이버 스마트스토어 | 초기 상태 JSON의 benefitsView.discountedSalePrice |
| 고도몰 자사몰 | hidden input set_goods_price(할인가), set_goods_fixedPrice(정가) |
| 카페24 자사몰 | 한 페이지에 여러 옵션이 섞여 있어서 화면 텍스트 기준 |
5개 사이트 테스트에서 5건 전부 정확히 일치. 기술적으로는 성공이었어요.
문제는 속도였습니다. 54개 링크를 한번에 빠르게 돌렸더니, 네이버도 쿠팡도 IP를 차단해 버렸어요. 단시간 과다 요청이 원인. 실제 한국 통신사 회선인데도 너무 많이 두드려서 막힌 거였습니다.
그런데 하루 만에 풀렸어요. 영구 차단이 아니라 일시 속도 제한이었던 거죠.
IP 차단 안 당하고 가격 가져오는 방법은?
IP 차단이 풀리고 나서, Aside라는 AI 브라우저로 같은 방법을 시도했어요. Aside는 실제 브라우저 엔진을 쓰면서 AI가 페이지를 읽고 조작하는 도구인데, 실제 사용자처럼 브라우저를 쓰기 때문에 봇 차단에 걸리지 않았어요.
네이버도 쿠팡도 전부 접속 가능. 가격도 정확. 다만 사람 속도로 한 페이지씩 열어보는 방식이라 54개면 대략 15~25분 걸렸어요.
핵심은 기술이 아니라 속도 조절이었어요. Claude Code의 Playwright 방식과 Aside는 본질적으로 같은 접근인데, 빠르면 차단, 느리면 성공.
왜 100% 자동화가 안 되는 걸까?
네이버 스마트스토어의 "멤버십 할인가"는 어떤 자동화 도구로도 못 잡아요. 페이지 로딩 후 비동기로 받아오는 값인데, 그 요청 자체가 자동화 탐지에 걸려서 스켈레톤(회색 로딩 영역)으로 멈춰버려요. Aside로 열어도, Claude Code로 열어도 마찬가지.
차이는 보통 몇 천 원이지만, 경쟁가 비교에서는 그 몇 천 원이 중요해요. 결국 스마트스토어 행은 자동으로 95% 채우고, 멤버십 할인가가 있는 행만 사람이 직접 확인하는 게 현실적인 정답이었어요. 100% 자동화는 없었습니다.
결국 어떤 방법이 가장 좋았을까?
| 방법 | 정확도 | 차단 위험 | 속도 | 결론 |
|---|---|---|---|---|
| Claude Co-work | 낮음 | 없음 | 보통 | 부적합 |
| Apps Script | 낮음 | 없음 | 빠름 | 데이터 못 믿음 |
| Claude Code | 높음 | 높음 | 매우 빠름 | 속도 조절 필요 |
| Aside AI | 높음 | 낮음 | 느림 | 가장 현실적 |
경쟁사 가격 크롤링, 어떻게 시작하면 될까?
쇼핑몰 가격은 어디서 가져와야 정확할까?
- 페이지 소스코드에서 JSON-LD를 먼저 찾는다. 대형 플랫폼은 여기에 구조화된 가격 데이터가 있어요.
- JSON-LD가 없으면 메타태그(og:description 등)를 확인한다.
- 둘 다 없으면 hidden input 필드를 확인한다. 고도몰 같은 자사몰 솔루션은 set_goods_price 같은 숨은 폼 필드에 가격이 있어요.
- 위 세 가지가 다 없을 때만 화면 텍스트에서 "판매가" 다음 숫자를 찾는다. 최후 수단이고 오답률이 높아요.
- 어떤 방법으로도 확신이 안 서면 "확인 불가"로 남긴다. 잘못된 숫자를 자동으로 채우는 것보다 비워두는 게 낫습니다.
크롤링하다 IP 차단 안 당하려면?
- 요청 간격 2~4초 이상. 2초 미만이면 대부분 걸려요.
- 한 번에 30개씩, 사이에 1~2분 쉬기.
- 같은 사이트 하루 1회만.
- IP 차단은 대부분 12~24시간 후 풀림. 당황하지 마세요.
- 캡차 자동 우회 시도 금지. 이용약관 위반이고 법적 리스크가 있어요.
네이버 스마트스토어 "멤버십 할인가"는 왜 못 가져올까?
스마트스토어 가격을 자동으로 가져오면, "즉시할인가"까지는 잡히는데 "멤버십 할인가"는 빠질 수 있어요. 페이지가 뜬 뒤 브라우저가 비동기로 한 번 더 서버에 요청해서 받아오는 값인데, 자동화 도구는 이 요청이 봇 탐지에 걸려서 로딩이 안 돼요.
대응: 스마트스토어 행에는 "멤버십 할인가 미반영 가능" 메모를 자동으로 남기고, 주간 확인 시 그 행들만 사람이 직접 보는 게 현실적이에요.
자동 수집 결과, 어디를 확인해야 할까?
- 가격이 극단적으로 변한 행 확인 (50% 이상 인상/인하는 오류일 가능성)
- "확인 불가" 행 직접 브라우저에서 열어보기
- 스마트스토어 행 중 메모가 달린 것 육안 확인
- 새로 단종된 상품이 있으면 비활성 처리
- 결과 파일을 원본과 비교해서 이상한 값 없는지 대조
함께 읽으면 좋은 글: