수익화 트렌드 소스 수집 자동화 프로젝트

목적

블로그/유튜브마다 페이지 구조가 달라 단일 파서로는 신규 글/영상 감지가 불안정하므로, 소스 타입별 감지 전략을 분리해서 운영 가능한 자동화 체계를 만든다.

문제 정의

  • 블로그/뉴스형: 본문 HTML 날짜 패턴, RSS, Last-Modified 등 신호가 비교적 명확
  • 유튜브 채널형: 채널 페이지 동적 로딩/구조 변경으로 단순 HTML 파싱 신뢰도 낮음
  • 현재 공통 로직은 status 체크에는 유효하지만, “1주 내 신규 발행” 판정 정확도는 제한적

설계 방향(초안)

소스 타입 분류 (10개 기준)

타입해당 소스
rss어센트코리아 (/feed 엔드포인트 실재)1개
youtube마케팅쉐어·유튜브마케팅·변변한마케팅·이상한마케팅·친절한마케팅5개
dynamic-html아이보스·요즘IT·지피터스·콘텐츠핏4개

⚠️ dynamic-html 4개가 전체 감지 정확도의 핵심 리스크 구간 (40%).


1. 타입 분류 레이어

  • source마다 type: dynamic-html | rss | youtube 기준으로 처리기 선택
  • 타입 정보는 sources.yaml에 저장 (초기 1회 태깅)

2. 타입별 감지 로직 분리

rss 타입 (어센트코리아)

  • 최신 item의 pubDate 파싱 → 기준일 대비 7일 이내 여부 판정
  • 스냅샷: 마지막 item의 pubDate + guid

youtube 타입 (5개 채널)

  • 전제 조건: handle(@xxx) → channel_id 1회 조회 후 sources.yaml에 저장
    • YouTube 채널 RSS URL: https://www.youtube.com/feeds/videos.xml?channel_id=UCxxxxxx
  • 채널 RSS published 날짜 파싱 → 7일 이내 여부 판정
  • 스냅샷: 최신 동영상의 published + videoId

dynamic-html 타입 (아이보스·요즘IT·지피터스·콘텐츠핏)

  • fallback 우선순위 (순서대로 시도):
    1. HTTP Last-Modified 헤더
    2. HTML 내 JSON-LD (schema.org ArticledatePublished)
    3. OGP 태그 (<meta property="article:published_time">)
    4. sitemap.xml의 <lastmod>
    5. 수동 플래그 — 감지 불가 → confidence: low 기록
  • 스냅샷: 파싱된 최신 글 제목 + 날짜 (또는 콘텐츠 해시)

3. 판정 레이어 표준화

출력 포맷 통일:

{
  "has_new_in_7d": true | false,
  "latest_published_at": "YYYY-MM-DD",
  "evidence": "rss:pubDate | json-ld:datePublished | last-modified | ...",
  "confidence": "high | medium | low | unknown"
}

confidence 기준:

조건
highRSS pubDate 또는 JSON-LD datePublished 직접 획득
mediumLast-Modified 헤더 또는 HTML 날짜 파싱 성공
low감지 불가 — diff 비교로만 추정 (fallback 5단계 도달)
unknown네트워크 오류 또는 파서 실패

4. 상태 저장 레이어

  • 직전 실행 스냅샷 저장 후 이번 실행과 diff 비교
  • 타입별 스냅샷 내용은 위 “감지 로직” 섹션의 스냅샷 항목 기준

Next Actions

  • 소스 10개를 타입(dynamic-html / rss / youtube)으로 태깅 (어센트코리아 → rss) ✅ 2026-04-27
  • YouTube 채널 5개: handle → channel_id 조회 후 sources.yaml에 저장 ✅ 2026-04-27
  • dynamic-html 4개 소스별 fallback 우선순위 실행 테스트 ✅ 2026-04-27
  • YouTube RSS 봇 감지 우회 방안 확정 → yt-dlp —skip-download 채택 ✅ 2026-04-27
  • 타입별 판정 기준 초안(신호 우선순위 + fallback + confidence 기준) 문서화 ✅ 2026-04-27
  • 주간 체크 스크립트에 타입별 처리기 인터페이스 도입 (system/scripts/revenue_weekly_check.py v2) ✅ 2026-04-27
  • 샘플 10개 첫 실행 완료 → wiki/insights/revenue-weekly-check-2026-04-27.md 저장 ✅ 2026-04-27
  • 아이보스 sitemap lastmod 과거 날짜 원인 파악 및 수정 ✅ 2026-04-27
    • 원인: sitemap.xml이 <sitemapindex> 구조 + 하위 sitemap URL에 &amp; HTML entity
    • 해결: sitemapindex → 하위 sitemap 재귀 탐색 + html.unescape() URL 디코딩
  • 7개 ❌ 소스 감지 신뢰도 검증 완료 ✅ 2026-04-27 (아래 감지 신뢰도 섹션 참조)
  • 소스 트랙 재분류: 지속추적 6개 / 1회성 ingest 2개 / 제외 2개 ✅ 2026-04-27
  • 지속추적 제외 4개 처리 완료 ✅ 2026-04-27
    • 변변한마케팅: 콘텐츠 미스매치(법률마케팅) → 제외
    • 콘텐츠핏: 7개월 비활성 → 제외
    • 친절한마케팅: 1회성 ingest (영상 5개) → 제외
    • 지피터스: 1회성 ingest (게시글 5개) → 제외
  • 스크립트 6개로 축소 (revenue_weekly_check.py v2 최종) ✅ 2026-04-27
  • 월간 운영 리포트 포맷(요약 인사이트) 고정
  • 지속추적 6개 소스 보강 후보 탐색 (분기 점검 시)

1회성 Ingest 완료 목록 (2026-04-27)

친절한마케팅 (YouTube — 학원마케팅 트렌드)

소스 페이지핵심 내용
kindmarketing-2026-marketing-shift2026년 마케팅 패러다임 전환, 네이버 에이전틱 서치
kindmarketing-shortform-story-strategy숏폼 기승전결 구조 (문제공감→해결→변화)
kindmarketing-content-to-sales고객 문제 해결형 정보성 콘텐츠 = 매출 전환
kindmarketing-ai-marketing-preparationChatGPT·Gemini 학원 AI 자동화 시스템
kindmarketing-naver-search-changes-2026네이버 에이전틱 서치 3가지 변화, 플레이스 묶음

지피터스 마케팅 (Blog — AI×마케팅 실행 가이드)

소스 페이지핵심 내용
gpters-naver-algorithm-seo-research네이버 알고리즘(리브라→C-Rank→DIA), 체류시간 핵심
gpters-seo-listicle-chatgptChatGPT SEO 리스티클 5단계, H2-설명-CTA 구조
gpters-naver-blog-ai-growthAI 블로그 6단계 워크플로, 글 9개→방문 285회
gpters-naver-keyword-auto-recommender경쟁률=문서수÷검색량, 네이버 API 자동화
gpters-sales-writing-aiAIDA 모델 세일즈 글쓰기, 하나의 글 여러 포맷

소스별 감지 신뢰도 검증 (2026-04-27)

7개 ❌ 소스가 “향후 새 발행 시 감지 가능한가?” 검증 결과

소스감지 방법향후 감지판정 신뢰도비고
어센트코리아rss:pubDate✅ 확실highRSS 피드에서 직접 추출
변변한마케팅yt-dlp✅ 확실high최신 영상 날짜 직접 추출
마케팅쉐어_이과장yt-dlp✅ 확실high최신 영상 날짜 직접 추출
유튜브마케팅yt-dlp✅ 확실high최신 영상 날짜 직접 추출
친절한마케팅yt-dlp✅ 확실high최신 영상 날짜 직접 추출
콘텐츠핏sitemap:lastmod✅ 가능medium새 글 발행 시 sitemap 갱신되면 감지. 현재 2025-09-16 이후 발행 없음
지피터스html:date-text⚠️ 불안정lowSPA 구조 — JS 미실행으로 메타데이터 JSON 날짜만 추출. 실제 게시물 날짜 접근 불가

지피터스 SPA 한계 상세

  • https://www.gpters.org/marketing = Next.js SPA (클라이언트 렌더링)
  • 정적 HTML에는 그룹 채널 메타데이터만 존재 ("updatedAt":"2026-01-12")
  • 실제 게시물 목록은 JS 실행 후 로드 → 현재 스크립트로 감지 불가
  • 개선 방안: Playwright 헤드리스 브라우저 또는 지피터스 공개 API 탐색

기간별 감지 범위 (검증 당시 스냅샷 기준)

소스최신 발행일7일14일30일90일
어센트코리아2026-03-07
변변한마케팅2026-02-10
마케팅쉐어_이과장2026-03-22
유튜브마케팅2026-03-11
친절한마케팅2026-01-30
콘텐츠핏2025-09-16
지피터스2026-01-12*
  • 지피터스 2026-01-12는 실제 게시물 날짜가 아닌 채널 메타데이터 날짜

실행 테스트 결과 (2026-04-27)

YouTube channel_id 매핑

채널명handlechannel_idRSS 상태
변변한마케팅@decent_marketingUC60iEKmt0MrooVglWx3vpoA봇 감지 404
이상한마케팅@isanghan_marketingUC9pTIR9Rj7UvdUQANDUKtqw봇 감지 404
마케팅쉐어_이과장@마케팅쉐어UCzIfP9UoIjy_82-325yIzIg봇 감지 404
유튜브마케팅@유튜브마케팅교육전문UCnRVZOTTGTiqug6saUcyYXQ봇 감지 404
친절한마케팅@친절한마케팅UCIQCW1w8t8fuxPuiMjszj9g봇 감지 404

⚠️ YouTube RSS 피드(feeds/videos.xml?channel_id=...)가 모두 404 반환. channel_id는 페이지 <link rel="alternate"> + externalId 패턴으로 정확히 추출됨. 쿠키/세션 없는 자동화 요청 차단 추정. → YouTube Data API v3 방식 검토 필요.

dynamic-html fallback 테스트 결과

소스L1 Last-ModifiedL2 JSON-LDL3 OGPL4 sitemap최종 fallbackconfidence
요즘IT<lastmod> 있음Level 4medium
아이보스<lastmod> 있음Level 4medium
지피터스⚠️ <lastmod> 없음Level 5low
콘텐츠핏⚠️ <lastmod> 없음Level 5low

Success Metrics

  • 10개 소스 기준 주간 실행 성공률 95%+
  • has_new_in_7d 판정에서 수동 검수 대비 정확도 80%+
  • 에러 발생 시 원인 분류(network|parser|source-changed) 자동 기록
  • 결과가 wiki/log.md + wiki/insights/*weekly-check*에 일관되게 반영됨