Scraper Hub API

유튜브 채널 검색

플레이그라운드에서 수집 →

채널 코드 youtube_channel · 수집 환경 linux

지정한 YouTube 채널의 동영상 탭(또는 쇼츠 탭)에서 영상을 최신순/인기순으로 수집합니다. 로그인 불필요. 입력은 채널 주소 하나면 됩니다 — @핸들(예: @lguplus) 또는 채널 URL(https://www.youtube.com/@lguplus, /channel/UC…, /c/…, /user/… 전부 인식). 영상별로 제목·채널명·조회수·업로드시점·재생시간·썸네일·링크를 가져옵니다(채널 탭 카드에는 설명이 표시되지 않아 본문은 비어 있고, 쇼츠는 업로드시점도 카드에 없어 미수집). 업로드시점은 상대표기('N일 전')를 수집 시각 기준으로 역산합니다(원문 posted_at_raw 보존 — 오래된 영상일수록 오차 큼). 정렬은 YouTube 채널 페이지의 최신순/인기순 필터를 그대로 사용하며(인기순은 페이지 내 전환), 쇼츠 탭은 정렬 필터가 없어 기본 순서(최신순)로 수집됩니다. 시작일을 지정하면 최신순에서 그 날짜 이전 영상을 만날 때 수집을 종료합니다(증분 수집용). 존재하지 않는 채널은 재시도 없이 실패 처리됩니다.

요청 파라미터

아래 값들을 POST /api/v1/collectparams 객체에 담아 보냅니다.

타입필수기본설명
channel text 예: @lguplus 또는 https://www.youtube.com/@lguplus (channel/UC…, c/…, user/… 형식도 인식)
sort enum latest YouTube 채널 동영상 탭의 정렬 필터(실측: 인기순 전환 시 조회수 상위부터). 쇼츠 탭은 정렬 미지원 — 기본 순서(최신순)로 수집
video_type enum video 수집할 탭. 쇼츠 탭이 없는 채널은 0건 정상 완료. 쇼츠는 카드에 업로드시점이 없어 시각 미수집(제목·조회수·링크 위주)
limit number 50 최대 수집 영상 수. 스크롤로 더 깊이 수집하며 상한은 약 500개(초과 요청 시 500으로 조정)
start_date date (YYYY-MM-DD) 최신순일 때 이 날짜 이전 영상을 만나면 수집 종료(증분 수집). 상대시각 역산이라 오래된 영상은 오차가 있습니다. 인기순에서는 해당 영상만 건너뜀
collect_details bool false 켜면 영상마다 상세를 추가 조회해 좋아요수·댓글수·본문 전문·정확한 업로드시각(쇼츠 포함)·카테고리·태그·채널 구독자수를 보강합니다. 영상당 요청 2회·수 초가 추가되므로 소량 수집에 권장(상세 보강은 상위 200건까지)
exclude_keywords text 이 단어가 제목에 들어간 영상은 수집 단계에서 제외. 쉼표로 여러 개, 한 단어 안 띄어쓰기 허용
시작일(start_date) — 증분 수집
최신순으로 훑어 내려가다 start_date 이전 항목을 만나면 수집을 종료합니다(그 날짜 이후만 수집). 비우면 상한(limit)까지 최신순으로 수집합니다. 인기순에서는 순서가 시간순이 아니라, 이전 날짜 항목을 건너뛰기만 합니다.
제외 키워드(exclude_keywords)
이 단어가 들어간 글은 수집 단계에서 걸러집니다. 쉼표(,)로 여러 개를 넣고, 한 단어 안에 띄어쓰기도 쓸 수 있습니다(예: "무료 나눔, 광고"무료 나눔·광고 두 개). 대소문자는 구분하지 않고 부분 일치로 판정합니다.
  • 기본은 제목 기준 — 상세 요청을 보내기 전에 걸러서 빠르고, 수집 상한(limit)도 차감하지 않습니다.
  • 비우면 → 제외 없이 전부 수집.

요청 예시

curl -X POST https://scraper.conbus.co.kr/api/v1/collect \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "channel": "youtube_channel", "params": { "channel": "@lguplus", "sort": "latest", "video_type": "video", "limit": 50, "start_date": "2026-06-01", "collect_details": false, "exclude_keywords": "광고, 협찬" } }'

응답 (202 Accepted)

요청은 즉시 큐에 적재되고 request_id 를 돌려줍니다. 실제 수집은 워커가 비동기로 처리합니다.

{ "success": true, "data": { "request_id": 42, "channel": "youtube_channel", "status": "pending", "status_url": "https://scraper.conbus.co.kr/api/v1/requests/42" } }

결과 조회 — GET /requests/{id}

같은 API 키로 request_id 를 조회합니다. 상태에 따라 응답이 달라집니다.

진행 중 (pending / running)

아직 끝나지 않았으면 progress 로 진행 상황만 옵니다(items 없음).

{ "success": true, "data": { "request_id": 42, "channel": "youtube_channel", "status": "running", "external_ref": null, "result_count": null, "started_at": "2026-06-16T09:00:05+09:00", "finished_at": null, "duration_ms": null, "duration_sec": null, "created_at": "2026-06-16T09:00:00+09:00", "updated_at": "2026-06-16T09:01:30+09:00", "progress": { "count": 12, "phase": "list" }, "elapsed_ms": 85000 } }

완료 (done)

statusdone 이면 data.items[] 에 결과가 담깁니다. 실패 시엔 status: "failed"error 가 옵니다.

{ "success": true, "data": { "request_id": 42, "channel": "youtube_channel", "status": "done", "external_ref": null, "result_count": 1, "started_at": "2026-06-16T09:00:05+09:00", "finished_at": "2026-06-16T09:02:00+09:00", "duration_ms": 115000, "duration_sec": 115, "created_at": "2026-06-16T09:00:00+09:00", "updated_at": "2026-06-16T09:02:00+09:00", "channel_info": { "url": "https://www.youtube.com/@lguplus", "title": "LG유플러스 (LG Uplus)", "handle": "@lguplus", "channel_id": "UCp3BSINVC7Ggj4kChEUiy7Q", "subscribers_text": "구독자 65.8만명", "subscribers": 658000, "video_count_text": "동영상 3.7천개", "video_count": 3700, "description": "LG U+ 공식 Youtube 채널", "avatar": "https://yt3.googleusercontent.com/…" }, "items": [ { "post_id": "UOYl4xotvKw", "url": "https://www.youtube.com/watch?v=UOYl4xotvKw", "title": "오늘을 심플하게, Simply. U+", "author": "LG유플러스 (LG Uplus)", "posted_at": "2025-11-14T00:00:00+09:00", "views": 28580000, "comment_count": 0, "recommends": null, "body": null, "source": "YouTube / LG유플러스 (LG Uplus)", "extra": { "channel_url": "https://www.youtube.com/@lguplus", "tab": "videos", "sort": "popular", "duration": "0:31", "thumbnail": "https://i.ytimg.com/vi/UOYl4xotvKw/hqdefault.jpg", "view_text": "조회수 2858만회", "published_raw": "8개월 전", "is_short": null, "posted_at_approx": true } } ] } }

실패 (failed)

statusfailederror 에 사유가 옵니다(items 없음). 일시적 실패는 자동 재시도되며, 위 응답은 마지막 시도 기준입니다.

{ "success": true, "data": { "request_id": 42, "channel": "youtube_channel", "status": "failed", "external_ref": null, "result_count": 0, "started_at": "2026-06-16T09:00:05+09:00", "finished_at": "2026-06-16T09:00:16+09:00", "duration_ms": 11000, "duration_sec": 11, "created_at": "2026-06-16T09:00:00+09:00", "updated_at": "2026-06-16T09:00:16+09:00", "error": "수집 실패 — 잠시 후 다시 시도하세요" } }

최상위 data에는 항상 request_id·channel·status·external_ref·result_count·started_at·finished_at·duration_ms·duration_sec·created_at·updated_at이 포함되고, 상태에 따라 items(done)·progress+elapsed_ms(진행 중)·error(failed/cancelled)가 추가됩니다. duration_*는 허브가 잰 수집 소요 시간(시작~종료) — 자세히는 비동기 & 콜백. 요청을 잘못 시작했다면 취소 API로 중단할 수 있습니다.

결과 필드 (items[])

필드설명
post_id영상 ID(11자 videoId). 재수집 중복 제거 키
url영상 URL(youtube.com/watch?v=… · 쇼츠는 youtube.com/shorts/…)
title / bodytitle=영상 제목 / bodynull — 채널 탭 카드에는 설명이 없습니다
author채널명(extra.channel_url의 채널)
posted_at작성 시각 (ISO8601, KST) — 업로드 상대표기(posted_at_raw: "8개월 전")를 수집 시각 기준으로 역산(오래된 영상일수록 오차 큼). 쇼츠 탭은 카드에 업로드시점이 없어 null
views / comment_countviews=조회수(정수 — 상세 수집 시 정확값으로 갱신) / comment_count=기본 0, 상세 수집(collect_details) 시 실제 댓글 수
recommends기본 null상세 수집(collect_details) 시 좋아요 수
sourceYouTube / 채널명
extra.channel_url수집 대상 채널 URL(정규화)
extra.tab수집한 탭 — videos 또는 shorts
extra.sort정렬 — latest(최신순) 또는 popular(인기순)
extra.duration재생시간(쇼츠는 null일 수 있음)
extra.thumbnail썸네일 이미지 URL
extra.view_text조회수 원문 텍스트("조회수 2858만회")
extra.published_raw업로드 상대표기 원문(쇼츠는 null)
extra.is_short쇼츠 탭이면 true(동영상 탭은 null)
extra.posted_at_approx업로드시각 역산이 근사치면 true — 상세 수집으로 정확 시각을 얻으면 null
extra.like_count(상세 수집 시) 좋아요 수 — recommends와 동일 값
extra.category(상세 수집 시) YouTube 카테고리
extra.tags(상세 수집 시) 영상 태그 배열(최대 20개)
extra.subscriber_text(상세 수집 시) 채널 구독자수 원문(예: 구독자 488만명)
extra.duration_sec(상세 수집 시) 재생시간(초)
extra.detail상세 수집으로 보강된 항목이면 true
채널 참고
  • 채널 정보(channel_info) — done 응답 최상위에 채널 단위 정보가 1회 옵니다(항목별 중복 없음): title·handle·channel_id·url·subscribers_text/subscribers(정수)·video_count_text/video_count(정수)·description·avatar. 수집 시 이미 여는 채널 페이지에서 추출하므로 추가 비용이 없습니다(항상 포함, 쇼츠 탭이 없어 0건인 경우에도).
  • 입력 channel@핸들 또는 채널 URL을 받습니다(@lguplus, youtube.com/@lguplus, /channel/UC…, /c/…, /user/… 모두 인식).
  • 정렬은 채널 페이지의 최신순/인기순을 그대로 씁니다(인기순은 조회수 상위부터). 쇼츠 탭은 정렬 필터가 없어 기본 순서(최신순)로만 수집됩니다.
  • 상세 수집(collect_details:true) — 영상마다 상세를 추가 조회해 좋아요수·댓글수·본문 전문·정확한 업로드시각(초 단위)과 카테고리·태그·구독자수(extra)를 보강합니다. 채널 탭 카드에는 본문이 없고 쇼츠는 업로드시각도 없으므로, 이 옵션을 켜면 특히 쇼츠의 빈 필드(시각·본문·채널명)가 채워집니다. 영상당 요청 2회·수 초가 추가되며 상세 보강은 상위 200건까지입니다.
  • start_date를 주면 최신순에서 그 날짜 이전 영상을 만날 때 수집을 종료합니다(증분 수집). 인기순에서는 시간순이 아니라 해당 영상만 건너뜁니다.
  • 쇼츠 탭이 없는 채널은 result_count=0으로 정상 완료합니다. 존재하지 않는 채널은 재시도 없이 failed 처리됩니다.
  • 스크롤 방식이라 limit만큼 더 깊이 수집하며 상한은 약 500개입니다(초과 요청 시 500으로 조정).

결과 수신(폴링·콜백) 방식은 비동기 & 콜백을 참고하세요.