수익화 트렌드 소스 수집 자동화 프로젝트
목적
블로그/유튜브마다 페이지 구조가 달라 단일 파서로는 신규 글/영상 감지가 불안정하므로, 소스 타입별 감지 전략을 분리해서 운영 가능한 자동화 체계를 만든다.
문제 정의
- 블로그/뉴스형: 본문 HTML 날짜 패턴, RSS, Last-Modified 등 신호가 비교적 명확
- 유튜브 채널형: 채널 페이지 동적 로딩/구조 변경으로 단순 HTML 파싱 신뢰도 낮음
- 현재 공통 로직은
status체크에는 유효하지만, “1주 내 신규 발행” 판정 정확도는 제한적
설계 방향(초안)
소스 타입 분류 (10개 기준)
| 타입 | 해당 소스 | 수 |
|---|---|---|
rss | 어센트코리아 (/feed 엔드포인트 실재) | 1개 |
youtube | 마케팅쉐어·유튜브마케팅·변변한마케팅·이상한마케팅·친절한마케팅 | 5개 |
dynamic-html | 아이보스·요즘IT·지피터스·콘텐츠핏 | 4개 |
⚠️
dynamic-html4개가 전체 감지 정확도의 핵심 리스크 구간 (40%).
1. 타입 분류 레이어
- source마다
type: dynamic-html | rss | youtube기준으로 처리기 선택 - 타입 정보는 sources.yaml에 저장 (초기 1회 태깅)
2. 타입별 감지 로직 분리
rss 타입 (어센트코리아)
- 최신 item의
pubDate파싱 → 기준일 대비 7일 이내 여부 판정 - 스냅샷: 마지막 item의
pubDate+guid
youtube 타입 (5개 채널)
- 전제 조건: handle(
@xxx) →channel_id1회 조회 후 sources.yaml에 저장- YouTube 채널 RSS URL:
https://www.youtube.com/feeds/videos.xml?channel_id=UCxxxxxx
- YouTube 채널 RSS URL:
- 채널 RSS
published날짜 파싱 → 7일 이내 여부 판정 - 스냅샷: 최신 동영상의
published+videoId
dynamic-html 타입 (아이보스·요즘IT·지피터스·콘텐츠핏)
- fallback 우선순위 (순서대로 시도):
- HTTP
Last-Modified헤더 - HTML 내 JSON-LD (
schema.org Article→datePublished) - OGP 태그 (
<meta property="article:published_time">) - sitemap.xml의
<lastmod> - 수동 플래그 — 감지 불가 →
confidence: low기록
- HTTP
- 스냅샷: 파싱된 최신 글 제목 + 날짜 (또는 콘텐츠 해시)
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 기준:
| 값 | 조건 |
|---|---|
high | RSS pubDate 또는 JSON-LD datePublished 직접 획득 |
medium | Last-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-html4개 소스별 fallback 우선순위 실행 테스트 ✅ 2026-04-27 - YouTube RSS 봇 감지 우회 방안 확정 → yt-dlp —skip-download 채택 ✅ 2026-04-27
- 타입별 판정 기준 초안(신호 우선순위 + fallback + confidence 기준) 문서화 ✅ 2026-04-27
- 주간 체크 스크립트에 타입별 처리기 인터페이스 도입 (
system/scripts/revenue_weekly_check.pyv2) ✅ 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에&HTML entity - 해결: sitemapindex → 하위 sitemap 재귀 탐색 +
html.unescape()URL 디코딩
- 원인: sitemap.xml이
- 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.pyv2 최종) ✅ 2026-04-27 - 월간 운영 리포트 포맷(요약 인사이트) 고정
- 지속추적 6개 소스 보강 후보 탐색 (분기 점검 시)
1회성 Ingest 완료 목록 (2026-04-27)
친절한마케팅 (YouTube — 학원마케팅 트렌드)
| 소스 페이지 | 핵심 내용 |
|---|---|
| kindmarketing-2026-marketing-shift | 2026년 마케팅 패러다임 전환, 네이버 에이전틱 서치 |
| kindmarketing-shortform-story-strategy | 숏폼 기승전결 구조 (문제공감→해결→변화) |
| kindmarketing-content-to-sales | 고객 문제 해결형 정보성 콘텐츠 = 매출 전환 |
| kindmarketing-ai-marketing-preparation | ChatGPT·Gemini 학원 AI 자동화 시스템 |
| kindmarketing-naver-search-changes-2026 | 네이버 에이전틱 서치 3가지 변화, 플레이스 묶음 |
지피터스 마케팅 (Blog — AI×마케팅 실행 가이드)
| 소스 페이지 | 핵심 내용 |
|---|---|
| gpters-naver-algorithm-seo-research | 네이버 알고리즘(리브라→C-Rank→DIA), 체류시간 핵심 |
| gpters-seo-listicle-chatgpt | ChatGPT SEO 리스티클 5단계, H2-설명-CTA 구조 |
| gpters-naver-blog-ai-growth | AI 블로그 6단계 워크플로, 글 9개→방문 285회 |
| gpters-naver-keyword-auto-recommender | 경쟁률=문서수÷검색량, 네이버 API 자동화 |
| gpters-sales-writing-ai | AIDA 모델 세일즈 글쓰기, 하나의 글 여러 포맷 |
소스별 감지 신뢰도 검증 (2026-04-27)
7개 ❌ 소스가 “향후 새 발행 시 감지 가능한가?” 검증 결과
| 소스 | 감지 방법 | 향후 감지 | 판정 신뢰도 | 비고 |
|---|---|---|---|---|
| 어센트코리아 | rss:pubDate | ✅ 확실 | high | RSS 피드에서 직접 추출 |
| 변변한마케팅 | yt-dlp | ✅ 확실 | high | 최신 영상 날짜 직접 추출 |
| 마케팅쉐어_이과장 | yt-dlp | ✅ 확실 | high | 최신 영상 날짜 직접 추출 |
| 유튜브마케팅 | yt-dlp | ✅ 확실 | high | 최신 영상 날짜 직접 추출 |
| 친절한마케팅 | yt-dlp | ✅ 확실 | high | 최신 영상 날짜 직접 추출 |
| 콘텐츠핏 | sitemap:lastmod | ✅ 가능 | medium | 새 글 발행 시 sitemap 갱신되면 감지. 현재 2025-09-16 이후 발행 없음 |
| 지피터스 | html:date-text | ⚠️ 불안정 | low | SPA 구조 — 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 매핑
| 채널명 | handle | channel_id | RSS 상태 |
|---|---|---|---|
| 변변한마케팅 | @decent_marketing | UC60iEKmt0MrooVglWx3vpoA | 봇 감지 404 |
| 이상한마케팅 | @isanghan_marketing | UC9pTIR9Rj7UvdUQANDUKtqw | 봇 감지 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-Modified | L2 JSON-LD | L3 OGP | L4 sitemap | 최종 fallback | confidence |
|---|---|---|---|---|---|---|
| 요즘IT | ❌ | ❌ | ❌ | ✅ <lastmod> 있음 | Level 4 | medium |
| 아이보스 | ❌ | ❌ | ❌ | ✅ <lastmod> 있음 | Level 4 | medium |
| 지피터스 | ❌ | ❌ | ❌ | ⚠️ <lastmod> 없음 | Level 5 | low |
| 콘텐츠핏 | ❌ | ❌ | ❌ | ⚠️ <lastmod> 없음 | Level 5 | low |
Success Metrics
- 10개 소스 기준 주간 실행 성공률 95%+
has_new_in_7d판정에서 수동 검수 대비 정확도 80%+- 에러 발생 시 원인 분류(
network|parser|source-changed) 자동 기록 - 결과가
wiki/log.md+wiki/insights/*weekly-check*에 일관되게 반영됨