구글 트렌드 탐색 (윈도우 수집기)
플레이그라운드에서 수집 →채널 코드 google_trends_explore · 수집 환경 windows
요청 파라미터
아래 값들을 POST /api/v1/collect 의 params 객체에 담아 보냅니다.
| 키 | 타입 | 필수 | 기본 | 설명 |
|---|---|---|---|---|
| server | text | — | — | 비우면 허브가 지금 구글 트렌드 수집이 가능한 서버(온라인 · 접속 막힘 아님 · 대기 작업 적은 순)를 골라 배정하고, 응답의 server 로 알려줌. 특정 서버로 보내려면 그 서버 ID(GET /trends-servers 로 조회) |
| keywords | text | 예 | — | 배열(["a","b"]) 또는 줄바꿈 · 쉼표 · 탭 · 세미콜론 구분 문자열. 앞뒤·연속 공백은 정리, 대소문자만 다른 중복은 하나로, # 으로 시작하는 항목은 무시. 비교 최대 5개 · 개별 최대 50개, 검색어당 100자 |
| mode | enum | — | — | 비우면 검색어 5개 이하는 compare, 넘으면 separate. compare 에 6개 이상은 422 |
| geo | text | — | KR | 코드 또는 이름 — KR · KR-11 · US · US-CA · 대한민국 · 서울특별시 · WORLD(전 세계). 비우면 KR. 이름이 여러 곳이면 코드로 |
| period | enum | — | today 12-m | 맞춤 기간(start_date · end_date)을 주면 이 값은 무시 |
| start_date | date (YYYY-MM-DD) | — | — | end_date 와 함께 주면 period 대신 맞춤 기간 (2004-01-01 ~ 오늘, 한국 시간) |
| end_date | date (YYYY-MM-DD) | — | — | start_date 와 함께. 오늘(한국 시간)까지 |
| category | text | — | 0 | 탐색 카테고리 ID 또는 이름 (0 = 모든 카테고리, 71 = 식음료, 917 = 음식점 안내 …). 이름이 여러 가지에 있으면 ID 로 |
| property | enum | — | web | 검색 유형 |
선택 칸 값 목록
아래 칸은 이 값만 받습니다(그 밖의 값은 422 invalid_params). 비우면 기본값입니다.
| 키 | 값 | 뜻 |
|---|---|---|
| mode | (비움) | 자동 — 5개 이하 비교, 넘으면 개별 |
| compare | 비교 — 한 차트에 함께(최대 5개) | |
| separate | 개별 — 검색어마다 따로(최대 50개) | |
| period | now 1-H | 지난 1시간 |
| now 4-H | 지난 4시간 | |
| now 1-d | 지난 1일 | |
| now 7-d | 지난 7일 | |
| today 1-m | 지난 30일 | |
| today 3-m | 지난 90일 | |
| today 12-m | 지난 12개월 — 기본 | |
| today 5-y | 지난 5년 | |
| all | 2004 - 현재 | |
| property | web | 웹 검색 — 기본 |
| images | 이미지 검색 | |
| news | 뉴스 검색 | |
| shopping | Google 쇼핑 | |
| youtube | YouTube 검색 |
period 또는 맞춤 기간 — start_date · end_date 를 둘 다 주면 period 대신 그 기간입니다(2004-01-01 ~ 오늘(한국 시간), 시작 ≤ 끝 — 하나만 주거나 범위를 벗어나면 422). 그래프 한 점의 단위(시간 · 일 · 주 · 월)는 기간 길이에 따라 구글이 정하며 extra.time.resolution 에 옵니다 — 시간 단위면 timeline[].date 에 시각이 붙습니다.compare)는 한 그래프에 함께 그려 검색어끼리 견줄 수 있지만, 개별(separate)은 검색어마다 따로 100 을 기준으로 하므로 서로 견주면 안 됩니다. partial: true 인 마지막 점은 아직 끝나지 않은 구간이라 낮게 나올 수 있습니다. regions_compare 는 지역마다 검색어끼리 나눈 비중(%)입니다.요청 예시
응답 (202 Accepted)
요청은 즉시 큐에 적재되고 request_id 를 돌려줍니다. 실제 수집은 워커가 비동기로 처리합니다.
결과 조회 — GET /requests/{id}
같은 API 키로 request_id 를 조회합니다. 상태에 따라 응답이 달라집니다.
결과(items)는 요청별로 보관되므로 같은 글이 다른 요청(다른 키워드·재수집)에 겹쳐도 이 요청의 결과는 그대로입니다 —
여러 요청에 걸친 중복 정리는 post_id로 호출 쪽에서 하세요.
보존 기간은 완료 후 7일입니다. 이 채널은 '지금 상태'가 중요한 데이터라 짧게 보관합니다 — 결과는 받은 즉시 저장하세요.
보존 기간이 지나면 items 는 빈 배열이고 items_expired: true, items_keep_days 가 함께 옵니다(status 는 그대로 done).
진행 중 (pending / running)
아직 끝나지 않았으면 progress 로 진행 상황만 옵니다(items 없음).
progress.count 는 끝낸 검색 수입니다(비교는 0 → 1, 개별은 검색어 수까지). 고정 배정 채널이라 server(배정된 수집 서버)와 server_online 이 함께 옵니다 — 대기가 길면 수집 서버가 온라인인지 확인하세요. 구글 요청 제한(429)으로 실패해 다시 시도를 기다리는 동안에도 pending 으로 보입니다(수집 PC 가 429 로 잠깐 쉬는 동안은 running).
완료 (done)
status 가 done 이면 data.items[] 에 결과가 담깁니다.
실패 시엔 status: "failed" 와 error 가 옵니다.
result_count 는 받은 검색 수입니다(비교는 1, 개별은 검색어 수 — 데이터 없음 포함, 실패한 검색 제외). 결과에 없는 검색이 있으면 같은 층에 warnings 가 붙습니다 — 값은 검색 이름(비교는 a vs b). 예(개별 모드 검색어 4개 중 1개 실패 · 2개는 시간 상한으로 못 돌림):
search_failed = 검색에 실패해 뺀 검색(이전 결과를 빈 값으로 덮지 않으려고) · not_run = 시간 상한(timeout)이나 연속 실패(errors)로 돌리지 못한 검색 — 그 검색만 다시 요청하세요.
실패 (failed)
status 가 failed 면 error 에 사유가 옵니다(items 없음).
실패는 두 가지입니다 — 사람이 처리해야 하거나 다시 해도 같은 결과인 것은 바로 failed, 잠시 뒤 풀릴 수 있는 것은 자동으로 다시 시도합니다(요청당 3번까지 — 그동안 pending 으로 보이고, 다 쓰면 마지막 사유 + 시도 3회 모두 실패해 종결했습니다).
| error 의 시작 | 뜻 | 재시도 |
|---|---|---|
| 구글 트렌드 보안 확인(캡차) 화면이 떠 수집을 멈췄습니다 … | 수집 중 구글 보안 확인(쿠키 동의 화면도 같은 꼴) — 수집 PC 에서 사람이 처리할 때까지 그 서버는 새 요청을 409 account_blocked 로 거절 | 없음 |
| [blocked] 구글 트렌드 보안 확인(캡차)으로 멈춘 상태라 … | 막힌 동안 수집 서버가 받은 요청 — 구글에 접속하지 않고 돌려보냄 | 없음 |
| 구글 트렌드 보안 확인 필요 — 수집 서버 … | 막힌 서버에 배정돼 기다리던 요청을 허브가 끝냄(쿠키 동의면 구글 트렌드 쿠키 동의 필요 — …) | 없음 |
| [invalid_payload] … | 수집 PC 가 요청 값을 받지 못함 — 예: 알 수 없는 지역입니다: '…' · 위치 이름 '…' 이 여러 곳입니다 · 알 수 없는 카테고리입니다: '…' — 코드 · ID 로 다시 요청 | 없음 |
| 결과가 허브 본문 한도를 넘었습니다(413, …) | 결과가 너무 큼 — 검색어 수 · limit 을 줄여 다시 요청 | 없음 |
| 수집 서버(로컬)에서 취소됨 | 수집 PC 에서 사람이 취소 | 없음 |
| 연속 실패로 멈춤 … / 모든 검색이 실패했습니다 … | 구글이 요청을 계속 거절(429 — 쉬었다가 다시 해도 같음, 문구에 429: 예 연속 실패로 멈춤(구글이 요청을 거절(429) — 쉬었다가 다시 해도 같음) — …) 또는 화면 변경 · 일시 오류 의심 — 받은 검색이 하나라도 있으면 failed 가 아니라 done + warnings | 10분 뒤 |
| 수집용 Chrome 문제 — … | 수집 PC 의 수집용 Chrome 실행 · 연결 문제 | 5분 뒤 |
| 작업 시간 상한(…분) 초과로 중단 — 모은 결과 없음 | 수집 PC 의 시간 상한(기본 60분)까지 아무것도 받지 못함(받은 검색이 있으면 done + warnings.not_run) | 잠시 뒤 |
최상위 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 | 검색 조건 묶음 — explore|검색어+검색어|지역코드|기간코드|카테고리ID|검색유형(전 세계는 WORLD, 190자가 넘으면 앞 150자 + | + sha1 앞 20자). 결과는 검색 1번 = 1건 — 비교 모드는 1건(검색어 최대 5개가 한 결과에), 개별 모드는 검색어마다 1건. 허브 축적본에서는 같은 검색이 가장 최근 결과로 바뀌고, 요청별 결과(GET /requests/{id})는 요청마다 따로 남습니다 |
| url | 결과 화면(트렌드 탐색) 주소 — extra.url 과 같음 |
| title / body | title=비교 모드는 검색어 vs 검색어, 개별 모드는 검색어 / body=사람이 읽는 요약(여러 줄 — 조건 · 검색어별 평균/최근/최고 · 지역별 비교 · 상위 지역 · 관련 검색어/주제 각 5개, 데이터 없음이면 그 안내). 프로그램에서는 extra 를 쓰세요 |
| author | 항상 null |
| posted_at | 작성 시각 (ISO8601, KST) — 이 채널은 검색(수집) 시각입니다(extra.searched_at · posted_at_raw 와 같음) |
| views / comment_count | 항상 null |
| recommends | 항상 null |
| source | Google 트렌드 탐색 · 지역 이름 · 기간 이름 |
| extra.kind / source_kind | trends_explore / google_trends_explore |
| extra.query / keywords / status | 검색 이름(비교는 a vs b) · 검색어 배열(이 순서가 아래 values 순서) · ok 또는 no_data(검색량이 부족해 그래프가 없음 — 데이터 없음도 한 건으로 옴) |
| extra.geo / time / category / property | 실제로 검색한 조건 — geo{code, name, path} · time{code, label, range, resolution}(resolution = 그래프 한 점의 단위 HOUR·DAY·WEEK·MONTH …) · category{id, name, path} · property{code, key, name} |
| extra.keyword_stats[] | 검색어별 숫자 {keyword, has_data, average, average_source, latest, latest_date, peak, peak_date, points} — average_source 는 google(비교 모드에서 구글이 준 평균) 또는 calc(그래프 값으로 계산) |
| extra.timeline[] | 시간 흐름(그래프) {time(epoch 초), date, label, values[], has_data[], partial} — values 는 0~100(기간 안 최고점 = 100, 검색어 순서), partial=true 는 아직 끝나지 않은 마지막 구간. 시간 단위 기간이면 date 에 시각(2026-10-14T05:00+09:00) |
| extra.regions_compare | 지역별 비교 — 검색어 2개 이상일 때만(1개면 null). 지역마다 검색어끼리 나눈 비중 {resolution, mode, rows[{code, name, values[], formatted[]}]} |
| extra.regions[] | 검색어별 지역 관심도(그 검색어에서 가장 높은 지역 = 100) {keyword, resolution, rows[{code, name, value, values, formatted}]} |
| extra.related_queries[] / related_topics[] | 검색어별 관련 검색어 · 주제 {keyword, top[], rising[]} — 항목 {rank, query(주제는 title · type · mid), value, formatted, link}, 급상승의 formatted 는 +190% 꼴. 관련 주제는 검색어 1개일 때만(비교 화면에는 없음), 구글이 빈 목록을 줄 때도 많습니다 |
| extra.widgets_missing[] | 받지 못한 화면 부분(있으면 그 부분만 빈 값) |
| extra.searched_at / url | 검색 시각(KST) · 결과 화면 주소 |
- 수집 서버 자동 선택 —
server는 선택입니다. 비우면 허브가 지금 구글 트렌드 수집이 가능한 서버(온라인 · 접속 막힘 아님 · 대기 작업 적은 순)를 골라 배정하고 202 응답의server로 알려줍니다. 가능한 서버가 없으면 409no_trends_server(서버별 이유 포함). 특정 서버로 보내려면GET /trends-servers의 서버 이름을 넣으세요 — 오프라인이면 409server_offline, 구글 접속이 막힌 상태면 409account_blocked, 트렌드 수집기가 없는 서버면 422not_trends_server. 배정은 요청 시점에 고정됩니다. keywords는 배열(["a","b"]) 또는 줄바꿈 · 쉼표 · 탭 · 세미콜론으로 나눈 문자열입니다. 앞뒤·연속 공백은 정리하고, 대소문자만 다른 중복은 하나로 합치며,#으로 시작하는 항목은 무시합니다. 비교(compare) 최대 5개 · 개별(separate) 최대 50개 · 검색어당 100자 — 넘으면 요청 단계에서 422invalid_params.mode를 비우면 5개 이하는 비교, 넘으면 개별입니다(정한 값은 요청의mode로 남음).- 지역 · 카테고리는 코드(
KR·KR-11·US-CA· 카테고리 ID)나 화면 이름(대한민국·서울특별시·식음료)으로 넣습니다. 이름은 수집 PC 의 트렌드 목록으로 해석합니다 — 여러 곳에 있는 지역 이름은 그중 나라가 하나뿐이면 그 나라(조지아→GE)이고, 모르는 이름이거나 그래도 하나로 정해지지 않는 이름(여러 카테고리에 있는 카테고리 이름 포함)이면 그 요청은failed([invalid_payload] …, 재시도 없음) — 코드로 다시 요청하세요. 전 세계는WORLD, 비우면KR. 탐색 카테고리 ID 는 실시간 인기 카테고리 ID 와 다른 목록입니다(예: 탐색 71 = 식음료). - 오래 걸립니다 — 수집 PC 의 Chrome 이 트렌드 화면에서 지역 · 기간 · 카테고리를 고르고 검색어를 사람처럼 입력하므로 비교 1건은 약 30~40초, 개별은 검색어당 약 15~25초 + 쉬는 시간(검색 사이 8~20초 · 10개마다 1~3분), 50개면 30~40분입니다. 한 서버는 한 번에 한 요청만 처리하므로 뒤에 온 요청은 앞 요청이 끝날 때까지
pending으로 기다립니다(서버가 작업 중이면 대기 시간 상한으로 끊지 않음). - 결과에 없는 검색 — 검색량이 부족한 검색은
extra.status = "no_data"인 한 건으로 옵니다. 검색에 실패한 검색(일시 오류 등)은 이전 결과를 빈 값으로 덮지 않도록items에서 빠지고warnings.search_failed(검색 이름 배열)에 남습니다. 한 요청의 시간 상한(수집 PC 설정, 기본 60분)에 닿거나 연속 3번 실패하면 그때까지 받은 검색으로done하고 못 돌린 검색은warnings.not_run({keywords, reason}—timeout·errors)입니다 — 그 검색만 다시 요청하세요. 하나도 받지 못했으면failed(자동 재시도)입니다. - 구글이 막을 때 — 보안 확인(캡차) · 쿠키 동의 화면이 뜨면 기다리지 않고
failed(재시도 없음)로 끝나고, 그 서버는 사람이 수집 PC 의 Chrome 에서 처리할 때까지 요청을 받지 않습니다(409account_blocked— 막힌 종류·시각은GET /trends-servers의blocked_kind·blocked_since). 구글이 요청을 잠시 거절(HTTP 429)하는 것은 막힘이 아닙니다 — 수집 PC 가 25~45초(다음엔 1~2분) 쉬었다가 그 검색을 처음부터 다시 하고(최대 2번, 그만큼 오래 걸림), 그래도 안 되면 그 검색만warnings.search_failed로 남깁니다. 연속 3번이면 남은 검색은warnings.not_run, 받은 검색이 하나도 없으면failed로 끝나 약 10분 뒤 자동으로 다시 시도합니다(요청당 3번까지). 서버는 막힘이 되지 않아 새 요청을 계속 받습니다. - 결과 크기는 비교 1건 약 15~60KB(시간 단위 기간이면 그래프 점이 많음), 개별 50개면 약 1~3MB 입니다.
결과 수신(폴링·콜백) 방식은 비동기 & 콜백을 참고하세요.