블로그 콘텐츠 잠식 - 키워드 중복 감지은(는) 무엇을 하나요?
여러 블로그 게시물이 동일한 검색 키워드를 놓고 경쟁하는 것을 감지합니다. 두 가지 모드: 로컬 전용 분석(기본값) 및 DataForSEO API를 사용한 SERP 수준 데이터 분석.
두 가지 모드
| 모드 | 플래그 | 비용 | 데이터 소스 |
|---|---|---|---|
| 로컬 | (기본값) | 무료 | Grep/Read를 통한 파일 내용 분석 |
| API | --api | 호출당 ~$0.01 | DataForSEO Page Intersection + Ranked Keywords |
로컬 모드는 API 키 없이 작동합니다. API 모드는 DataForSEO 자격 증명을 환경 변수로 설정해야 합니다: DATAFORSEO_LOGIN 및 DATAFORSEO_PASSWORD.
로컬 모드 워크플로우
1단계: 블로그 파일 스캔
Glob을 사용하여 대상 디렉토리에서 모든 콘텐츠 파일을 찾습니다:
- 패턴:
**/*.md,**/*.mdx,**/*.html node_modules/,.git/,drafts/디렉토리는 건너뜁니다
2단계: 기본 키워드 추출
각 파일에 대해 다음에서 키워드 신호를 읽고 추출합니다:
- 제목 태그 또는 H1 제목 (가장 높은 가중치)
- H2 제목 (중간 가중치)
- 첫 번째 문단 (보조 신호)
- 메타 설명 (frontmatter에 있는 경우)
기본 키워드 추출 방법:
- 제목과 H1을 1-gram, 2-gram 및 3-gram 구문으로 토큰화
- 제목 + H2 + 첫 번째 문단에서 각 구문의 빈도수로 점수 계산
- 가장 높은 점수를 받은 2-3단어 구문을 기본 키워드로 선택
- H2 제목에서 보조 키워드 기록
3단계: 유사성 기준 클러스터링
다음 일치 규칙(우선순위 순)을 사용하여 게시물을 그룹화합니다:
- 정확히 일치 - 2개 이상의 게시물에서 동일한 기본 키워드
- 어간 일치 - 동일한 어근 단어 (예: "최적화" vs "최적화하다")
- 의미적 중복 - Claude가 두 키워드가 동일한 검색 의도를 대상으로 한다고 판단 (예: "최고의 CRM 소프트웨어" vs "2026년 최고의 CRM 도구")
- 부분 집합 일치 - 하나의 키워드가 다른 키워드를 포함 (예: "이메일 마케팅" vs "스타트업을 위한 이메일 마케팅")
4단계: 점수 계산 및 플래그 지정
2개 이상의 게시물이 있는 각 클러스터에 대해 심각도를 평가하고 권장 사항을 생성합니다.
5단계: 보고서 출력
결과 테이블과 클러스터별 권장 사항을 표시합니다.
API 모드 워크플로우 (DataForSEO)
--api 플래그가 필요합니다. WebFetch를 사용하여 DataForSEO 엔드포인트를 호출합니다.
사용되는 엔드포인트
Page Intersection - 여러 URL이 순위를 차지하는 키워드 찾기:
POST https://api.dataforseo.com/v3/dataforseo_labs/google/page_intersection/live
Authorization: Basic <base64(login:password)>
{
"pages": {
"1": "https://example.com/post-a",
"2": "https://example.com/post-b"
},
"language_code": "en",
"location_code": 2840
}
비용: 호출당 ~$0.01. 순위, 검색량, CPC가 포함된 중복 키워드를 반환합니다.
Ranked Keywords - 단일 URL이 순위를 차지하는 모든 키워드 가져오기:
POST https://api.dataforseo.com/v3/dataforseo_labs/google/ranked_keywords/live
{
"target": "https://example.com/post-a",
"language_code": "en",
"location_code": 2840
}
API 분석 단계
- 사용자(또는 사이트맵)로부터 게시된 모든 URL 수집
- 각 URL에 대해 Ranked Keywords 실행하여 키워드 프로필 구축
- 키워드 클러스터를 공유하는 URL 쌍에 대해 Page Intersection 실행
- 아래 공식을 사용하여 심각도 계산
- 검색량 및 순위 데이터가 포함된 강화된 보고서 출력
심각도 점수 계산
중복 신호를 기반으로 한 네 가지 심각도 수준:
| 수준 | 기준 | 조치 시급성 |
|---|---|---|
| 심각 | 동일한 정확 키워드, 두 페이지 모두 상위 20위 내 | 즉시 |
| 높음 | 동일한 키워드 클러스터, 한 페이지가 다른 페이지보다 순위가 높음 | 이번 주 |
| 중간 | 부분적인 SERP 중복이 있는 관련 키워드 | 이번 달 |
| 낮음 | 의미적 유사성은 있지만 의도가 확인된 차이 | 모니터링 |
심각도 공식 (API 모드)
severity_score = overlap_count x avg_search_volume x (1 / position_gap)
여기서:
overlap_count= 공유된 순위 키워드 수avg_search_volume= 공유 키워드의 월간 평균 검색량position_gap= 평균 순위 위치의 절대 차이 (최소 1)
점수가 높을수록 콘텐츠 잠식 문제가 더 시급합니다.
심각도 휴리스틱 (로컬 모드)
SERP 데이터 없이 단순화된 점수 계산 사용:
- 심각: 게시물 간 기본 키워드 정확히 일치
- 높음: 기본 키워드 어간 일치 또는 3개 이상의 공유 H2 키워드
- 중간: 기본 키워드 의미적 중복
- 낮음: 부분 집합 일치만 있거나 보조 키워드 공유
출력 형식
요약 테이블
| 게시물 A | 게시물 B | 공유 키워드 | 심각도 | 권장 사항 |
|--------|--------|-----------------|----------|----------------|
| /best-crm-tools | /top-crm-software | best crm, crm tools, crm software | 심각 | 병합(MERGE) |
| /email-tips | /email-marketing-guide | email marketing | 높음 | 차별화(DIFFERENTIATE) |
| /seo-basics | /seo-for-beginners | seo basics, beginner seo | 심각 | 표준 URL(CANONICAL) |
| /react-hooks | /react-state-mgmt | react, state | 낮음 | 조치 불필요(NO ACTION) |
클러스터별 상세 정보
플래그가 지정된 각 클러스터에 대해 다음을 제공:
- 두 게시물의 제목과 URL
- 중복 키워드의 전체 목록 (API 모드인 경우 검색량 포함)
- 어떤 게시물이 더 강력한지 (더 포괄적이고 구조가 좋은지)
- 근거가 포함된 구체적인 권장 사항
권장 사항
각 콘텐츠 잠식 클러스터에 대해 네 가지 가능한 조치:
병합(MERGE)
두 페이지가 모두 내용이 부족하거나 동일한 의도를 유사한 깊이로 다루는 경우.
- 두 게시물의 가장 좋은 콘텐츠를 하나의 포괄적인 게시물로 결합
- 약한 URL을 병합된 게시물로 301 리디렉션
- 두 URL을 가리키는 모든 내부 링크 유지
차별화(DIFFERENTIATE)
페이지가 다른 의도를 제공하지만 키워드 타겟팅이 중복되는 경우.
- 약한 게시물의 기본 키워드를 관련 롱테일 키워드로 변경
- 제목, H1 및 메타 설명을 업데이트하여 새로운 초점 반영
- 두 게시물 사이에 내부 링크를 추가하여 주제가 다름을 표시
표준 URL(CANONICAL)
한 게시물이 명확히 권위적이고 다른 게시물이 덜 중요한 복제본인 경우.
- 약한 페이지에 권위 페이지를 가리키는
rel="canonical"추가 - 약한 페이지가 고유한 가치를 추가하지 않으면 noindexing 고려
- 약한 페이지에서 권위 페이지로 링크
조치 불필요(NO ACTION)
의도가 표면적인 키워드 유사성에도 불구하고 실제로 다른 경우.
- 향후 감사를 위한 근거 문서화
- 순위 변동이 있는지 분기별로 순위 모니터링
- 게시물 중 하나의 순위가 떨어지면 재평가
오류 처리
- 블로그 파일 없음: 디렉토리에 .md, .mdx 또는 .html 파일이 없는 경우 "[디렉토리]에 블로그 파일이 없습니다"라고 보고하고 경로 확인을 제안
- DataForSEO 자격 증명 누락: API 모드에서 자격 증명이 구성되지 않은 경우 자동으로 로컬 모드로 전환하고 사용자에게 알림
- API 속도 제한: DataForSEO에는 분당 속도 제한이 있습니다. 429 응답을 받으면 대기했다가 한 번 재시도합니다. 문제가 지속되면 나머지 URL에 대해 로컬 모드로 전환
- WebFetch 실패: 소스 URL에 도달할 수 없으면 건너뛰고 보고서에 "확인 불가 - 소스를 사용할 수 없음"이라고 표시
- 단일 게시물 디렉토리: 블로그 게시물이 하나만 있는 경우 "콘텐츠 잠식 분석에는 최소 2개의 게시물이 필요합니다"라고 보고하고 정상 종료