Scraper Hub API

채널 코드 dcinside · 수집 환경 linux

디시인사이드 통합검색(search.dcinside.com) 기반 수집. 키워드로 여러 갤러리의 글을 한 번에 모읍니다. 기본은 제목+본문, 댓글은 옵션입니다.

요청 파라미터

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

타입필수기본설명
keyword text search.dcinside.com 통합검색 키워드
gallery_id text 지정하면 그 갤러리 "내 검색"으로 전환 — 통합검색 3,000건/120페이지 한도 없이 limit·기간까지 깊이 수집(마이너·미니 자동 판별). 갤러리 URL의 id= 값(예: dogcat). 비우면 통합검색(전체 갤러리, 최신 3,000건 한도)
s_type enum subject_memo 갤러리 내 검색 기준(값: subject_memo=제목+내용 기본 / subject=제목 / memo=내용). 통합검색(갤러리 비움)에는 영향 없음
limit number 1000 최대 수집 글 수. 통합검색은 최대 3,000, 갤러리 내 검색은 사실상 무제한
max_pages number 120 통합검색 페이지 탐색 한도(최대 120). 갤러리 내 검색에서는 미사용(윈도우 자동 진행)
start_date date (YYYY-MM-DD) 비우면 제한 없음. 검색은 최신순이라 이 날짜 이전 글을 만나면 수집 종료
end_date date (YYYY-MM-DD) 당일 포함. 비우면 오늘까지. 시작·종료 모두 비우면 최신순으로 상한까지
collect_body bool true 본문 수집
collect_comments bool false 켜면 글마다 Chrome으로 댓글까지 수집(느림). 결과는 각 글 extra.comments[]
exclude_keywords text 이 단어가 들어간 글은 수집 단계에서 제외. 쉼표로 여러 개, 한 단어 안 띄어쓰기 허용(예: 무료 나눔, 광고). 기본은 제목 기준(상세 요청 전 제외 → 빠르고 상한 미차감). 본문 수집을 켜면 받아온 본문에서도 한 번 더 제외
수집 한도 — 최대 3,000건 / 120페이지
dcinside 통합검색은 플랫폼 특성상 키워드당 최신 3,000건(120페이지, 페이지당 25건)까지만 결과를 제공합니다.
  • limit·max_pages를 이보다 크게 지정해도 3,000건(120페이지)에서 더 내려가지 않습니다.
  • 결과는 최신순이라 한도는 항상 "가장 최근 3,000건"입니다. 기간(start_date~end_date)을 좁혀도 이 3,000건 범위 안에서 필터링됩니다.
  • 이 한도는 통합검색(gallery_id 비움) 전용입니다. 특정 gallery_id를 지정하면 갤러리 내 검색으로 전환되어 이 3,000건 한도 없이 limit·기간까지 깊이 수집합니다(아래 참고).
특정 갤러리 수집(gallery_id) — 갤러리 내 검색
gallery_id를 지정하면 통합검색이 아니라 그 갤러리 자체를 검색합니다. 갤러리 코드는 갤러리 URL의 id= 값입니다 (예: gall.dcinside.com/board/lists/?id=dogcatgallery_id: "dogcat", 대소문자 무시). 마이너·미니 갤러리는 자동 판별합니다.
  • 비우면 → 통합검색(전체 갤러리, 최신 3,000건 한도).
  • 지정하면 → 통합검색 3,000건 한도 없이 limit·기간까지 깊이 수집합니다(갤러리 전수 수집 가능).
  • 검색 범위는 s_type으로 지정 — 제목+내용(기본)·제목·내용. (통합검색에는 영향 없음)
수집 기간(start_date ~ end_date)
검색은 최신순이라 위에서부터 훑어 내려갑니다.
  • 둘 다 비우면 → 가장 최신 글부터 limit 개수까지 수집합니다.
  • start_date만 → 그 날짜 이후 글만 (그보다 오래된 글을 만나면 수집 종료).
  • end_date만 → 그 날짜까지(당일 포함). 그보다 최신 글은 건너뜁니다.
  • 둘 다 → 두 날짜 사이 구간만 수집.
제외 키워드(exclude_keywords)
이 단어가 들어간 글은 수집 단계에서 걸러집니다. 쉼표(,)로 여러 개를 넣고, 한 단어 안에 띄어쓰기도 쓸 수 있습니다(예: "무료 나눔, 광고"무료 나눔·광고 두 개). 대소문자는 구분하지 않고 부분 일치로 판정합니다.
  • 기본은 제목 기준 — 상세 요청을 보내기 전에 걸러서 빠르고, 수집 상한(limit)도 차감하지 않습니다.
  • 본문 수집(collect_body: true)을 켜면, 이미 받아온 본문에서도 한 번 더 걸러냅니다(추가 요청 없음).
  • 비우면 → 제외 없이 전부 수집.
댓글 수집(collect_comments: true)
기본은 제목·본문만 HTTP로 빠르게 수집합니다. 댓글까지 받으려면 이 값을 켜세요. 댓글은 JS로 로드되어 글마다 Chrome으로 접속하므로 시간이 더 걸립니다(댓글 0개 글은 건너뜀). 수집된 댓글은 각 글의 extra.comments[] 배열에 담깁니다.

요청 예시

curl -X POST https://scraper.conbus.co.kr/api/v1/collect \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "channel": "dcinside", "params": { "keyword": "로얄캐닌", "gallery_id": "dogcat", "s_type": "subject_memo", "limit": 1000, "max_pages": 120, "start_date": "2026-06-01", "end_date": "2026-06-15", "collect_body": true, "collect_comments": true, "exclude_keywords": "광고, 협찬" } }'

응답 (202 Accepted)

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

{ "success": true, "data": { "request_id": 42, "channel": "dcinside", "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": "dcinside", "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) — 댓글 포함

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

{ "success": true, "data": { "request_id": 42, "channel": "dcinside", "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": "dogcat/1234567", "url": "https://gall.dcinside.com/board/view/?id=dogcat&no=1234567", "title": "로얄캐닌 사료 한 달 후기", "author": "냥집사", "posted_at": "2026-06-10T14:22:00+09:00", "views": 1532, "comment_count": 8, "recommends": null, "body": "한 달 먹여봤는데 기호성이 좋네요 ...", "source": "디시인사이드 / 강아지 갤러리", "extra": { "gallery": "강아지 갤러리", "gallery_id": "dogcat", "gallery_type": "minor", "article_no": "1234567", "source_kind": "search", "comments": [ { "comment_id": "dc_998877", "author": "멍멍이", "text": "정보 감사합니다!", "date": "2026-06-10 15:01:00", "is_reply": false }, { "comment_id": "dc_998901", "author": "냥집사", "text": "도움 되셨다니 다행이에요", "date": "2026-06-10 15:10:00", "is_reply": true } ] } } ] } }

실패 (failed)

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

{ "success": true, "data": { "request_id": 42, "channel": "dcinside", "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 — 갤러리ID/글번호. 재수집 중복 제거 키
url원문 주소
title / body제목 / 본문 — collect_body=false면 검색 요약 일부, true면 전체 본문
author작성자 닉네임
posted_at작성 시각 (ISO8601, KST)
views / comment_count조회수 / 댓글 수
recommends미제공 — 항상 null
source디시인사이드 / 갤러리명 (갤러리명 없으면 디시인사이드)
extra.gallery갤러리명
extra.gallery_id갤러리 코드(id=)
extra.gallery_typemajor·minor·mini
extra.article_no글번호
extra.source_kind통합검색=search · 갤러리 내 검색=gallery_search
extra.comments댓글 배열(아래 표) — collect_comments=true일 때
채널 참고
  • 통합검색(gallery_id 비움)에서 collect_body=false면 조회수·댓글수·작성자가 비어 있습니다(글 상세를 받지 않음). 갤러리 내 검색은 목록에서 바로 채워집니다.

댓글 필드 (extra.comments[])

필드설명
comment_id댓글 고유 ID
author작성자
text내용(디시콘만 있으면 대체 텍스트)
date작성 시각
is_reply대댓글 여부(true=답글)

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