Scraper Hub API

채널 코드 daum_cafe_search · 수집 환경 linux

카카오 Daum 검색 API로 다음 카페 글을 키워드·정렬별(최신/정확도)로 수집합니다. 로그인 불필요 — 카카오 REST API 키를 허브 '수집 인증'에 등록해 두면 워커가 받아 씁니다(여러 개면 작업마다 번갈아 사용, 일간 쿼터 소진 키는 자정까지 자동 보류). 기본은 제목·요약(스니펫)·카페명·정확한 작성시각(초 단위)·링크·썸네일을 가져오며, '본문 수집'을 켜면 글마다 다음 카페 모바일 페이지를 크롬으로 열어 전체 본문·작성자·조회수·댓글 수·게시판명을, '댓글 수집'을 켜면 댓글·대댓글까지 보강합니다(둘 중 하나만 켜도 글당 1회 열람). ⚠️ 한 키워드로 카카오가 노출하는 글은 약 1,000건(pageable_count)까지이며, API에 기간 옵션이 없어 시작일·종료일은 받은 결과에서 거르는 필터입니다 — 기간을 나눠도 그 상한 밖의 옛 글은 받을 수 없습니다(네이버 카페 검색과 다른 점). 더 모으려면 검색어를 세분화하세요. ⚠️ 회원 전용 게시판 글은 본문/댓글 대신 검색 요약만 담기고 extra.member_only=true 로 표시됩니다(오류 아님). 작성자·조회수·댓글 수·좋아요는 목록만 수집할 때는 비어 있고(좋아요는 항상 null), 댓글 시각은 날짜 단위입니다. result_count가 limit보다 적으면 오류가 아니라 노출 상한·기간 필터 때문입니다.

요청 파라미터

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

키타입필수기본설명
keyword text 예 — 다음 카페 검색어(카카오 Daum 검색 API, 예: 로얄캐닌)
sort enum — latest 최신순=latest(카카오 recency) · 정확도순=relevance(accuracy). 정렬마다 노출 창(약 1,000건)이 달라 둘을 합치면 조금 더 모입니다
limit number — 50 최대 수집 글 수. 한 키워드당 카카오가 노출하는 글은 약 1,000건(pageable_count)까지 — 기간을 나눠도 늘지 않으며, 요청 상한(50페이지×50건=2,500)은 도달하지 않습니다
start_date date (YYYY-MM-DD) — — 비우면 제한 없음. ⚠️ 카카오 API에 기간 옵션이 없어 받은 결과에서 거릅니다(최신순이면 시작일 이전 글에서 중단, 정확도순이면 끝까지 훑음). 노출 창(약 1,000건) 밖의 옛 글은 기간을 지정해도 받을 수 없습니다
end_date date (YYYY-MM-DD) — — 당일 포함. 비우면 오늘까지. 시작·종료 중 하나만 넣어도 됩니다(결과 필터)
collect_body bool — false 켜면 글마다 다음 카페 모바일 페이지를 크롬으로 열어 전체 본문 + 작성자·조회수·댓글 수·게시판명을 보강(글당 1회, 느려짐). 회원 전용 글은 본문 대신 요약이 남고 extra.member_only=true. 끄면 검색 결과의 제목·요약(스니펫)만 수집
collect_comments bool — false 켜면 댓글·대댓글까지 수집(각 글 extra.comments[], 20개 단위 페이지를 따라감). 본문 수집과 같은 크롬 세션에서 이어서 읽습니다. 회원 전용 글은 댓글이 비고 member_only=true. 댓글 시각은 날짜 단위
exclude_keywords text — — 이 단어가 제목·요약에 들어간 글은 수집 단계에서 제외(상세 열람 전 → 빠르고 상한 미차감). 쉼표로 여러 개, 한 단어 안 띄어쓰기 허용. 본문 수집을 켜면 받아온 본문에서도 한 번 더 제외
refresh enum — incremental incremental(기본): 허브가 이미 수집한 글 중 규칙에 맞는 것은 다시 쓸 수 있습니다(게시 7일 미만 글은 항상 새로 수집). full: 이번 요청은 전부 새로 수집합니다. 결과 형식은 같습니다
수집 기간(start_date ~ end_date)
검색은 최신순이라 위에서부터 훑어 내려갑니다.
  • 둘 다 비우면 → 가장 최신 글부터 limit 개수까지 수집합니다.
  • start_date만 → 그 날짜 이후 글만 (그보다 오래된 글을 만나면 수집 종료).
  • end_date만 → 그 날짜까지(당일 포함). 그보다 최신 글은 건너뜁니다.
  • 둘 다 → 두 날짜 사이 구간만 수집.
제외 키워드(exclude_keywords)
이 단어가 들어간 글은 수집 단계에서 걸러집니다. 쉼표(,)로 여러 개를 넣고, 한 단어 안에 띄어쓰기도 쓸 수 있습니다(예: "무료 나눔, 광고" → 무료 나눔·광고 두 개). 대소문자는 구분하지 않고 부분 일치로 판정합니다.
  • 기본은 제목 기준 — 상세 요청을 보내기 전에 걸러서 빠르고, 수집 상한(limit)도 차감하지 않습니다.
  • 본문 수집(collect_body: true)을 켜면, 이미 받아온 본문에서도 한 번 더 걸러냅니다(추가 요청 없음).
  • 비우면 → 제외 없이 전부 수집.
댓글 수집(collect_comments: true)
기본은 제목·본문만 HTTP로 빠르게 수집합니다. 댓글까지 받으려면 이 값을 켜세요. 댓글은 JS로 로드되어 글마다 Chrome으로 접속하므로 시간이 더 걸립니다(댓글 0개 글은 건너뜀). 수집된 댓글은 각 글의 extra.comments[] 배열에 담깁니다.
키워드당 약 1,000건이 한계이고, 기간 지정은 그 안에서 고르는 필터입니다
카카오 Daum 검색 API는 한 검색어에 대해 노출 가능 건수(pageable_count, 약 1,000건)까지만 페이지를 내려주고 기간 파라미터가 없습니다.
  • 최신순은 "가장 최근 약 1,000건", 정확도순은 "관련도 상위 약 1,000건"이 창입니다. start_date·end_date는 워커가 그 창 안에서 거르는 것이라 창 밖의 옛 글은 받을 수 없습니다(네이버 카페 검색과 다름).
  • 더 모으려면 검색어를 세분화하거나 정확도순을 함께 돌리세요. 매일 최신순으로 반복 수집하면 새 글은 post_id 기준으로 계속 누적됩니다.
  • 상세 수집(본문·댓글)은 API가 아니라 크롬으로 다음 카페 모바일 페이지를 글마다 여는 방식입니다. 회원 전용 글은 본문/댓글 대신 요약만 담기고 extra.member_only=true로 표시됩니다(오류 아님).
  • 결과가 limit보다 적으면 오류가 아니라 노출 창 소진(is_end)·기간 필터·제외 키워드 때문입니다.

요청 예시

curl -X POST https://scraper.conbus.co.kr/api/v1/collect \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "channel": "daum_cafe_search", "params": { "keyword": "로얄캐닌", "sort": "latest", "limit": 50, "start_date": "2026-06-01", "end_date": "2026-06-15", "collect_body": false, "collect_comments": true, "exclude_keywords": "광고, 협찬", "refresh": "incremental" } }'

응답 (202 Accepted)

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

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

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

같은 API 키로 request_id 를 조회합니다. 상태에 따라 응답이 달라집니다. 결과(items)는 요청별로 보관되므로 같은 글이 다른 요청(다른 키워드·재수집)에 겹쳐도 이 요청의 결과는 그대로입니다 — 여러 요청에 걸친 중복 정리는 post_id로 호출 쪽에서 하세요. 보존 기간은 완료 후 90일입니다. 보존 기간이 지나면 items 는 빈 배열이고 items_expired: true, items_keep_days 가 함께 옵니다(status 는 그대로 done).

진행 중 (pending / running)

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

{ "success": true, "data": { "request_id": 42, "channel": "daum_cafe_search", "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": "comments" }, "elapsed_ms": 85000 } }

완료 (done) — 댓글 포함

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

{ "success": true, "data": { "request_id": 42, "channel": "daum_cafe_search", "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", "items": [ { "post_id": "truelovecat/kTWx/2237", "url": "https://cafe.daum.net/truelovecat/kTWx/2237", "title": "(8/16~9/15) 쉼터에 보내주신 후원에 고개숙여 감사드립니다", "author": "쉼터지기", "posted_at": "2026-09-15T17:33:51+09:00", "views": 312, "comment_count": 2, "recommends": null, "body": "48개, 뉴트리플랜 습식 60개 - 차미경님 : 뉴트리플랜 습식 240개 - 박원선님 : 로얄캐닌 키튼 10kg 1포 ...", "source": "다음 카페 / 트루러브캣쉼터", "extra": { "cafe_name": "트루러브캣쉼터", "cafe_slug": "truelovecat", "board_code": "kTWx", "article_no": "2237", "menu": "후원 안내", "snippet": "48개, 뉴트리플랜 습식 60개 - 차미경님 : 뉴트리플랜 습식 240개 ...", "thumbnail": "https://search1.kakaocdn.net/argon/130x130_85_c/7XZrhhfETPb", "sort": "latest", "member_only": false, "source_kind": "daum_cafe_search", "comments": [ { "comment_id": "176", "author": "멍멍이", "text": "정보 감사합니다!", "date": "2026-06-10", "is_reply": false, "date_raw": "26.06.10" }, { "comment_id": "178", "author": "냥집사", "text": "도움 되셨다니 다행이에요", "date": "2026-06-10", "is_reply": true, "date_raw": "15:10" } ] } } ] } }

실패 (failed)

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

{ "success": true, "data": { "request_id": 42, "channel": "daum_cafe_search", "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 — 카페슬러그/게시판코드/글번호(다음 카페 주소의 세 단). 재수집 중복 제거 키
url카페 글 주소 cafe.daum.net/슬러그/게시판코드/글번호
title / bodytitle=글 제목(검색어 강조 태그 제거됨). ⚠️ 카카오 API는 긴 제목을 약 30자에서 ...로 잘라 주므로 목록만 수집하면 잘린 제목이 올 수 있고, 상세 수집을 켜면 글 페이지의 전체 제목으로 복원됩니다(회원 전용 글은 복원 불가) / body는 기본(collect_body=false)이면 카카오 검색 요약(스니펫), collect_body=true면 전체 본문 — 단 회원 전용 글은 요약이 유지되며 extra.member_only=true가 붙습니다
author작성자 닉네임 — 상세 수집(collect_body/collect_comments) 시에만 채워집니다(기본 null, 카카오 API 미제공)
posted_at작성 시각 (ISO8601, KST) — 카카오 API의 초 단위 작성시각(posted_at_raw에 원문 ISO 8601 보존). 상세 페이지는 날짜만 주므로 상세 수집을 켜도 이 값이 유지됩니다
views / comment_countviews=조회수 — 상세 수집 시 채워짐, 목록만이면 null(회원 전용 글도 null) / comment_count=기본 0, 상세 수집 시 실제 댓글 수
recommends미제공 — 항상 null(다음 카페 좋아요 수는 비로그인으로 제공되지 않음)
source다음 카페 / 카페명
extra.cafe_name카페 이름
extra.cafe_slug카페 슬러그(주소의 카페 부분)
extra.board_code게시판 코드(주소의 두 번째 단)
extra.article_no글번호
extra.menu게시판(메뉴) 이름 — 상세 수집 시, 아니면 null
extra.snippet카카오 검색 요약문
extra.thumbnail대표 썸네일 URL 문자열(없으면 null)
extra.sort정렬 값(요청값)
extra.member_only회원 전용 게시판이라 본문/댓글을 못 읽었으면 true, 읽었으면 false, 상세 수집을 껐으면 null(확인 안 함)
extra.comments댓글 배열 — collect_comments=true일 때만 있고(끄면 키 없음), 회원 전용 글은 빈 배열
extra.source_kinddaum_cafe_search
extra.comments댓글 배열(아래 표) — collect_comments=true일 때
채널 참고
  • 수집 한도 — 키워드당 약 1,000건. 카카오가 한 검색어로 노출하는 글(pageable_count)은 검색 총계(total_count)와 무관하게 약 1,000건에서 끝납니다(최신순이면 가장 최근 약 1,000건, 정확도순이면 관련도 상위 약 1,000건). 요청 상한(50페이지×50건)은 도달하지 않습니다.
  • 기간(start_date~end_date)은 창을 넓히지 않습니다. 카카오 API에 기간 옵션이 없어 워커가 받은 결과에서 거릅니다(최신순이면 시작일 이전 글에서 조기 중단). 네이버 카페 검색처럼 기간을 나눠 더 모으는 방법이 없으며, 노출 창 밖의 옛 글은 어떤 기간을 넣어도 받을 수 없습니다. 더 모으려면 검색어를 세분화(예: "로얄캐닌 키튼", "로얄캐닌 습식")하거나 정확도순을 병행하세요.
  • 상세 수집(collect_body·collect_comments)은 크롬으로 글마다 1회 다음 카페 모바일 페이지를 엽니다(둘 다 켜도 열람 수는 같고 댓글은 20개 단위 페이지만큼 추가). 목록만 수집할 때보다 훨씬 느리고, 작성자·조회수·댓글 수·게시판명은 이때만 채워집니다. 회원 전용 글은 안내 페이지가 떠서 본문·댓글 대신 요약만 담기고 extra.member_only=true(오류·차단 아님).
  • 댓글은 대댓글까지 수집되며 is_reply로 구분됩니다. 댓글 시각 date는 날짜 단위(YYYY-MM-DD)입니다 — 다음 카페 페이지가 하루 이상 지난 댓글은 날짜만, 당일 댓글은 시각만(00:13), 방금 댓글은 19분 전처럼 표기하므로 당일·상대 표기는 수집일 기준으로 날짜를 채우고 원문 표기를 date_raw에 그대로 둡니다(당일 댓글의 시각은 date_raw로 확인). 글자 없이 스티커·이미지만 있는 댓글은 text가 [이미지]입니다. 댓글 수집을 켰을 때 extra.comments는 항상 배열이며 회원 전용 글은 빈 배열(member_only=true)입니다.
  • API 키·쿼터 — 카카오 REST API 키는 허브 관리자 "수집 인증"에 채널 daum_cafe_search로 등록합니다(여러 개면 작업마다 번갈아 사용). 카카오 앱당 카페 검색 일 30,000회(전체 깊이 검색 1건 = 20회)이며 일간 쿼터를 다 쓴 키는 다음 자정까지 자동 보류되고, 모든 키가 보류되면 작업이 실패하지 않고 대기합니다.

댓글 필드 (extra.comments[])

필드설명
comment_id댓글 고유 ID
author작성자
text내용 — 글자 없이 이미지·스티커(디시콘 등)만 있는 댓글은 [이미지] 같은 대체 텍스트 또는 빈 문자열
date작성 시각 — 이 채널은 날짜 단위(YYYY-MM-DD). 당일 댓글(페이지가 시각만 표기)·상대 표기는 수집일 기준
date_raw페이지 원문 표기 — 26.09.21(날짜) · 00:13(당일, 시각만) · 19분 전(방금). 당일 댓글의 시각이 필요하면 이 값을 쓰세요
is_reply대댓글 여부(true=답글)

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