사전 등록 문서

크롤러 관측소 — 다중 사이트 관측 규약

  • 확정 2026-08-10
  • 목적: 크덤집·로닛을 각자 관측하되 나중에 통합 비교가 가능하도록 정의를 미리 고정한다
  • 원칙: 수집은 각 사이트가 하던 대로 둔다. 정규화는 분석 시점에 한 곳에서 한다

0. 왜 지금 규약을 고정하는가

각자 모으다가 나중에 합치면, 합치는 시점에 "비교가 안 되는 데이터" 임을 발견한다. 그때는 이미 몇 달치가 서로 다른 규칙으로 쌓인 뒤라 되돌릴 수 없다.

실제로 두 로그는 이미 다르다.

크덤집 bot_traffic_logs 로닛 ai_crawl_logs
위장 판정 is_spoofed 있음 없음
IP 대역 검증 없음 없음
봇 운영사 없음 bot_operator
국가 없음 country
페이지 귀속 page_type·locale page_kind·entity_slug
상태코드 없음 status_code (⚠️ 항상 200)
보관 90일 롤링 2026-06-12부터 누적

이 상태로 숫자를 나란히 놓으면 한쪽은 사칭이 걸러진 값, 한쪽은 섞인 값이 된다.


1. 해결 방식 — 수집은 그대로, 정규화는 한 곳에서

두 사이트의 미들웨어를 고치지 않는다. 고치면 그 시점 전후로 또 다른 단절이 생긴다.

대신 양쪽 모두 원본 IP를 통째로 저장하고 있다는 점을 이용한다 (크덤집 IPv4 817,348행 · 로닛 85.208.96.199 형태 전체 저장).

→ 인트릭스의 판정 로직(src/lib/bot-verify.ts·bot-spoof.ts)을 과거 데이터에 소급 적용하면 두 사이트가 같은 규칙으로 정규화된다. 수집을 안 건드리고도 정합이 맞는다.

크덤집 원본 ─┐
             ├→ normalize.ts (같은 봇 목록·같은 검증 규칙·같은 페이지 매핑) → 스냅샷
로닛 원본  ──┘

2. 고정하는 정의 (변경하려면 개정 이력을 남긴다)

2.1 AI 크롤러 목록

1차 집합 (교차 비교의 기준) — 두 사이트 모두 관측되고 운영사가 명확한 것:

GPTBot · ClaudeBot · OAI-SearchBot · PerplexityBot

2차 집합 (별도 보고) — 포함 여부로 결과가 흔들리므로 항상 나눠 적는다:

ChatGPT-User · Claude-User · Perplexity-User   (사용자 개시)
Bytespider · Amazonbot · Google-Extended · CCBot · DeepSeekBot

⚠️ 1차와 2차를 합산한 단일 수치를 내지 않는다. 로닛에서는 Amazonbot·Bytespider가 상위이고 크덤집에서는 GPTBot·ClaudeBot이 상위라, 합치면 구성비에만 좌우되는 값이 된다. 인용 조사에서 발견형·브랜드형을 합치지 않기로 한 것과 같은 이유다.

2.2 검증·제외 규칙

인트릭스 로직을 그대로 쓴다. 판정은 셋이다.

판정 근거 집계
verified 사업자 공개 IP 대역 안 포함
spoofed 대역 밖(목록 확정 봇) 또는 ASN 불일치 제외
unknown 대역 미공개 봇(ClaudeBot 등)·IP 판독 실패 포함하되 별도 표기

⚠️ unknown이 많다는 사실 자체를 보고한다. ClaudeBot은 Anthropic이 대역을 공개하지 않아 항상 unknown이다. 이 비율을 감추면 "검증된 수치"처럼 보인다.

2.3 페이지 종류 매핑

교차 비교의 단위는 엔티티 상세 페이지다.

개념 크덤집 로닛
엔티티 상세 /ko/clinic/* /places/* (page_kind='place')
지역 허브 /ko/station*·/ko/sido* page_kind='region'
편집 콘텐츠 /ko/blog/*·/ko/treatments/* 해당 시 별도

크덤집은 한국어(/ko/)만 센다. 다국어 페이지가 있어 로케일을 섞으면 분모가 달라진다.

2.4 정규화 지표

사이트 규모가 24,815 대 687로 달라 절대 히트 수를 직접 비교하지 않는다.

1차 지표: 엔티티 상세 페이지당 30일 크롤 횟수 (봇별)
2차 지표: 30일 내 1회 이상 크롤된 페이지 비율 (커버리지)
3차 지표: 봇 구성비 (전체 AI 히트 중 각 봇의 몫)

3차가 가장 교란에 강하다. 규모·권위가 달라도 "어떤 봇이 오는가"의 구성은 비교할 수 있다.

2.5 기간

30일 창을 기본으로 하고, 창의 시작·끝을 항상 명시한다. 주간 변동이 크므로(크덤집 실측 268~17,661, 66배) 단일 창 비교로 단정하지 않는다.


3. ⚠️ 크덤집 90일 보관 — 스냅샷이 필요하다

크덤집 bot_traffic_logs는 90일 롤링이다(현재 2026-05-11 ~ 08-10). 하루가 지날 때마다 하루치 과거가 사라진다. 장기 비교를 하려면 지금부터 스냅샷을 남겨야 한다.

→ 월 1회 normalize.ts를 돌려 집계 스냅샷을 저장소에 커밋한다. 원자료가 아니라 집계본이라 용량이 작고, 병원 실명이 들어가지 않는다.

로닛은 2026-06-12부터 누적이라 아직 삭제 정책이 없어 보이지만, 확인 전까지 같게 취급한다.


4. 하지 않기로 한 것

  • status_code 사용 금지. 로닛에 컬럼이 있지만 NextResponse.next()의 상태라 항상 200이다. 미들웨어는 라우트 실행 전에 돌아 최종 상태를 알 수 없다. "봇이 404를 받았나"는 경로를 실제 엔티티 테이블과 대조해 답한다(크덤집에서 쓴 방법).
  • 두 사이트의 미들웨어를 통일하지 않는다. 고치는 순간 그 시점 전후로 단절이 생긴다. 정합은 분석 계층에서 맞춘다.
  • 절대 히트 수 비교 금지. §2.4의 정규화 지표만 쓴다.

5. 이미 관측된 것 (규약 적용 전 값 — 참고용)

원장 perplexity-skips-generated-entity-pages 참조. 2026-07-11~08-10 30일 기준.

크덤집 /ko/clinic/*   PerplexityBot 0 · ClaudeBot 14,780 · GPTBot 12,421 · OAI-SearchBot 4,726
로닛   /places/*      PerplexityBot 1,891 · OAI-SearchBot 1,366 · ClaudeBot 1,087 · GPTBot 83

⚠️ 이 값은 크덤집만 위장 제외가 적용된 상태라 규약 §2.2를 만족하지 않는다. 정규화 후 다시 산출한다.


6. 미결

  • 로닛 로그 삭제 정책 확인 (누적인지 롤링인지)
  • normalize.ts 첫 스냅샷 산출 및 §5 수치 재계산
  • 월 1회 스냅샷 루틴 등록
  • 로닛 unknown-bot 42,507건(30일 전체의 45%)의 정체 — 미분류 UA인지 사칭인지