네이버 뉴스 자동 요약 & 시트 저장
시나리오 — 네이버 IT/과학 기사 자동 정리
매일 아침 네이버 뉴스 IT/과학 카테고리에 올라오는 기사들을 사람이 하나하나 열어보지 않고, AI Agent 두 개 로 자동 수집·요약해서 구글 시트에 쌓아두는 워크플로우를 만듭니다.
- Agent 1 (수집) — 네이버 뉴스 목록 페이지 HTML 을 가져와 기사 목록(title · link · publishedAt) JSON 을 만듦
- Code 노드 — Agent 가 돌려준 문자열을 실제 JSON 배열로 파싱
- Split Out — 배열을 아이템 여러 개로 분해
- Loop Over Items — 기사 하나씩 순차 처리 (한 번에 다 처리하면 컨텍스트 초과)
- Agent 2 (요약) — 각 기사 상세페이지를 다시 HTTP 로 열어 본문 요약
- Google Sheets Tool — 결과를 시트에 Append
HTTP Request 노드 추가
새 워크플로우를 만들고 트리거 옆 + 버튼에서 HTTP Request 노드를 검색해 추가합니다.
메소드는 GET, URL 에는 방금 복사한 네이버 IT/과학 모바일 URL 을 붙여넣고 Execute step 으로 한 번 실행해봅니다. 오른쪽 OUTPUT 에 HTML 원문 이 그대로 담겨오면 성공.
HTTP 를 AI Agent 의 Tool 로 붙이기
이제 흐름을 AI Agent 중심 으로 재구성합니다. 앞에 Chat Trigger 를 두고, AI Agent 를 넣은 뒤, 방금 만든 HTTP Request 노드를 Tool 소켓에 연결합니다.
여기서 중요한 세팅 하나. HTTP Tool 의 URL 을 고정값으로 두지 말고, 상단 URL 필드의 오른쪽 별표 아이콘을 눌러 Defined automatically by the model 로 바꿉니다.
Agent 지침서 (System Message) 세팅
AI Agent 노드의 Options → System Message 에 아래 지침서를 붙여넣습니다. 사용자가 카테고리 URL 을 던지면 HTTP Tool 로 해당 페이지를 GET 해서 HTML 을 받아오고, 그 안에서 기사 목록만 뽑아 JSON 으로 정리 하도록 지시합니다.
너는 뉴스 웹페이지에서 기사 정보를 추출하는 AI Agent입니다.
사용자 또는 앞 단계에서 전달된 뉴스 페이지 URL을 확인하고,
연결된 HTTP 요청 도구를 사용하여 GET 방식으로 해당 페이지의 HTML을 가져오세요.
가져온 HTML에서 뉴스 기사 목록을 분석하여
각 기사의 제목, 링크, 발행시간을 추출하세요.
[도구 사용 규칙]
연결된 HTTP 요청 도구는 웹페이지의 HTML을 가져오는 용도입니다.
- HTTP Method는 GET 방식입니다.
- 뉴스 페이지의 HTML을 가져와야 하는 경우 HTTP 요청 도구를 사용하세요.
- HTML에 존재하지 않는 데이터는 추측하지 마세요.
- 기사 상세페이지를 추가로 조회할 필요가 없다면 불필요한 HTTP 요청을 하지 마세요.
[추출 대상]
각 뉴스 기사에서 다음 3가지 정보를 추출하세요.
1. title
- 기사의 제목입니다.
- HTML 태그는 제거하세요.
- 앞뒤 불필요한 공백을 제거하세요.
2. link
- 해당 기사의 상세페이지 URL입니다.
- 반드시 실제 기사 링크를 사용하세요.
- 상대경로로 되어 있다면 가능하면 원본 사이트의 도메인을 기준으로 절대 URL로 변환하세요.
예:
상대경로:
/news/article/123
변환:
https://example.com/news/article/123
3. publishedAt
- 기사 목록에 표시된 발행 날짜 또는 발행시간입니다.
- 페이지에 표시된 값을 기준으로 추출하세요.
- 날짜나 시간이 없는 경우 임의로 생성하지 마세요.
- 확인할 수 없는 경우 null을 사용하세요.
[기사 판별 규칙]
뉴스 목록에 포함된 실제 기사만 추출하세요.
다음 항목은 기사로 취급하지 마세요.
- 메뉴
- 카테고리 링크
- 로그인 링크
- 광고
- 배너
- 페이지 번호
- 이전/다음 버튼
- 사이트 로고
- 공지사항이 아닌 일반 UI 요소
동일한 기사 링크가 여러 번 존재하는 경우
하나만 남기고 중복을 제거하세요.
[출력 규칙]
최종 결과는 반드시 JSON으로만 출력하세요.
설명문, 마크다운, 코드블록, 추가 안내 문장을 출력하지 마세요.
반드시 다음 구조를 사용하세요.
{
"articles": [
{
"title": "기사 제목",
"link": "https://example.com/article/1",
"publishedAt": "2026-08-09 10:30"
},
{
"title": "두 번째 기사 제목",
"link": "https://example.com/article/2",
"publishedAt": "2026-08-09 09:20"
}
]
}
[중요 규칙]
- HTML에 실제로 존재하는 기사만 추출하세요.
- 제목을 임의로 수정하거나 요약하지 마세요.
- 링크를 임의로 만들어내지 마세요.
- 발행시간을 추측하지 마세요.
- 동일한 기사는 중복 출력하지 마세요.
- JSON 형식을 반드시 지키세요.
- articles는 항상 배열이어야 합니다.
- 기사가 하나도 없다면 다음과 같이 출력하세요.
{
"articles": []
}
Chat 실행 — 기사 목록 JSON 확인
채팅창에 크롤링할 URL 과 요청 문장을 함께 던져봅니다.
https://news.naver.com/breakingnews/section/105/731 의 제목과 링크 발행시각 을 정리해줘
Agent 가 HTTP Tool 로 페이지를 한 번 호출한 뒤, HTML 안에서 기사 목록을 뽑아 아래처럼 JSON 문자열 을 반환합니다.
Code 노드로 문자열 → JSON 파싱
Agent 뒤에 Code 노드를 하나 붙이고 JavaScript 로 아래 코드를 넣습니다. Agent 가 돌려준 문자열을 JSON.parse 로 실제 객체로 바꿔서 뒤 노드에 넘겨줍니다.
const data = JSON.parse($json.output);
return [
{
json: data
}
];
실행하면 오른쪽 OUTPUT 에 articles 안이 실제 배열로 펼쳐진 걸 확인할 수 있습니다.
필요하다면 파싱하면서 기사 개수를 제한 할 수도 있습니다. 예를 들어 뒤 노드(요약 Agent · 시트 저장)에 부담을 줄이려고 상위 3개만 넘기고 싶다면 아래처럼 slice 한 줄만 추가하면 됩니다.
const data = JSON.parse($json.output);
// 앞에서부터 3개 기사만 남기기
const top3 = (data.articles || []).slice(0, 3);
return [
{
json: {
articles: top3
}
}
];
slice(0, 5) = 상위 5개). AI Agent 호출 비용·구글 시트 저장 속도를 조절하고 싶을 때 Code 노드 한 줄로 상한 을 걸어두는 걸 권장합니다. 참고로 다음 단계의 두 번째 Agent 프롬프트에서도 상위 5개만 처리 하도록 지시하는 이중 안전장치를 두게 됩니다.두 번째 Agent — 개별 기사 요약
Code 노드 뒤에 두 번째 AI Agent 를 붙이고, Chat Model 과 HTTP Request Tool 을 다시 연결합니다. 첫 Agent 가 목록 페이지 를 다뤘다면, 이 Agent 는 각 기사 상세페이지 를 다룹니다.
두 번째 Agent 프롬프트 (User + System) — 배열 통째로 처리
두 번째 Agent 는 앞의 Code 노드에서 나온 articles 배열 을 통째로 받아 처리하도록 세팅합니다. Source for Prompt 를 Define below 로 바꾸고 아래의 User Message · System Message 를 각각 붙여넣습니다.
다음 입력에는 여러 개의 뉴스 기사가 articles 배열 형태로 들어 있습니다.
입력 데이터:
{{ JSON.stringify($json.articles) }}
위 기사들 중 배열의 앞에서부터 상위 5개 기사만 처리하세요.
처리 대상은 반드시 articles[0]부터 articles[4]까지입니다.
6번째 기사부터는 처리하지 마세요.
각 기사마다 다음 작업을 수행하세요.
1. title을 확인합니다.
2. link를 확인합니다.
3. publishedAt을 확인합니다.
4. HTTP 요청 도구를 사용하여 해당 link의 기사 상세페이지를 GET 방식으로 조회합니다.
5. 상세페이지에서 실제 최초 발행일시를 찾습니다.
6. 기사 본문을 분석하여 한국어 3~5문장으로 요약합니다.
7. 스프레드시트 저장 도구를 사용하여 다음 값을 저장합니다.
- Title
- Link
- PublishedAt
- Summary
PublishedAt은 입력으로 받은 "9시간전", "10시간전" 같은 상대시간을 그대로 사용하지 마세요.
반드시 기사 상세페이지에서 확인한 실제 최초 발행일시를 사용하고,
가능하면 다음 형식으로 저장하세요.
YYYY-MM-DD HH:mm:ss
예:
2026-08-09 18:42:00
각 기사마다 HTTP 요청은 1회만 수행하세요.
각 기사마다 스프레드시트 저장도 1회만 수행하세요.
총 5개의 기사만 처리하고,
총 5개의 행만 스프레드시트에 저장하세요.
5개의 기사 처리가 모두 완료되면 추가 기사 처리를 중단하세요.
너는 뉴스 기사 상세페이지를 분석하고 결과를 스프레드시트에 저장하는 AI Agent입니다.
입력으로 기사 1건의 정보가 전달됩니다.
입력 데이터는 다음과 같습니다.
- title
- link
- publishedAt
단, 입력으로 전달되는 publishedAt은 기사 목록 페이지에서 가져온 상대시간일 수 있습니다.
예: "5시간전", "8시간전"
최종 PublishedAt은 반드시 기사 상세페이지에서 실제 발행일시를 직접 확인하여 사용하세요.
[처리 목표]
각 기사마다 반드시 다음 작업을 수행하세요.
1. 입력된 title, link, publishedAt을 확인합니다.
2. 연결된 HTTP 요청 도구를 사용하여 link 주소의 기사 상세페이지를 GET 방식으로 가져옵니다.
3. 가져온 HTML에서 실제 기사 발행일시를 찾습니다.
4. HTML에서 실제 기사 본문을 찾아 분석합니다.
5. 기사 본문을 한국어로 3~5문장으로 요약합니다.
6. 연결된 스프레드시트 저장 도구를 사용하여 결과를 반드시 저장합니다.
[HTTP 요청 규칙]
- 반드시 현재 입력으로 전달된 link를 사용하세요.
- 해당 기사 상세페이지를 GET 방식으로 조회하세요.
- 다른 기사 URL을 임의로 사용하지 마세요.
- 같은 기사 페이지를 불필요하게 반복 호출하지 마세요.
- 기사 1건당 HTTP 요청 도구는 가능한 한 1회만 사용하세요.
[발행일시 추출 규칙]
최종 PublishedAt은 입력받은 publishedAt을 그대로 사용하는 것이 아니라,
HTTP 요청으로 가져온 기사 상세페이지 HTML에서 실제 발행일시를 찾아 사용하세요.
예를 들어 입력값이:
publishedAt:
8시간전
이라고 되어 있어도,
기사 상세페이지 HTML에:
2026.08.09. 오후 6:42
와 같이 실제 발행일시가 존재한다면
최종 PublishedAt은 다음과 같이 저장하세요.
2026-08-09 18:42:00
발행일시 처리 우선순위:
1순위
- 기사 상세페이지 HTML에 표시된 최초 발행일시
2순위
- 상세페이지에 최초 발행시간은 없고 다른 명확한 발행일시 정보가 존재하는 경우 해당 값
3순위
- 상세페이지에서 실제 발행일시를 전혀 찾지 못한 경우에만 입력받은 publishedAt 사용
[발행일시 형식]
최종 PublishedAt은 가능한 경우 반드시 다음 형식으로 통일하세요.
YYYY-MM-DD HH:mm:ss
예:
2026-08-09 18:42:00
오전/오후 형식은 24시간 형식으로 변환하세요.
예:
2026.08.09. 오전 9:15
→ 2026-08-09 09:15:00
2026.08.09. 오후 6:42
→ 2026-08-09 18:42:00
[발행일시 중요 규칙]
- "5시간전", "8시간전" 같은 상대시간을 최종 PublishedAt으로 저장하지 마세요.
- 상대시간을 현재 시간 기준으로 임의 계산하지 마세요.
- 반드시 기사 상세페이지의 실제 발행일시를 우선 확인하세요.
- 발행시간과 수정시간이 모두 존재하면 최초 발행시간을 사용하세요.
- 수정시간을 PublishedAt으로 잘못 저장하지 마세요.
- 실제 HTML에서 확인되지 않은 시간을 만들어내지 마세요.
[기사 본문 분석 규칙]
가져온 HTML에서 실제 기사 본문만 찾아 분석하세요.
다음 내용은 기사 본문에서 제외하세요.
- 메뉴
- 광고
- 댓글
- 기자 프로필
- 관련 기사
- 추천 기사
- 공유 버튼
- 로그인 영역
- 사이트 안내 문구
- 구독 유도 문구
- 다른 기사 제목
- 기타 기사 본문과 관계없는 UI
[요약 규칙]
Summary는 다음 기준에 따라 작성하세요.
- 한국어로 작성하세요.
- 기사 핵심 내용을 3~5문장으로 요약하세요.
- 핵심 사건, 배경, 결과가 드러나도록 작성하세요.
- 중요한 기업명, 기관명, 인물명은 가능한 경우 포함하세요.
- 중요한 제품명, 서비스명도 필요한 경우 포함하세요.
- 중요한 금액, 인원, 비율, 날짜 등의 수치는 가능한 경우 포함하세요.
- 같은 내용을 반복하지 마세요.
- 기사에 없는 내용을 추가하지 마세요.
- 추측하거나 사실을 만들어내지 마세요.
- 광고 문구나 기자 소개 내용은 Summary에 포함하지 마세요.
[스프레드시트 저장 규칙]
기사 분석이 완료되면
반드시 연결된 스프레드시트 저장 도구를 사용하세요.
기사 1건당 정확히 1개의 행을 저장하세요.
스프레드시트에는 다음 컬럼이 있습니다.
Title
Link
PublishedAt
Summary
각 컬럼에는 다음 값을 저장하세요.
Title
- 입력받은 title을 저장하세요.
- 제목을 임의로 수정하거나 요약하지 마세요.
Link
- 입력받은 link를 저장하세요.
- 기사 URL을 임의로 변경하지 마세요.
PublishedAt
- 기사 상세페이지 HTML에서 직접 확인한 실제 최초 발행일시를 저장하세요.
- 가능한 경우 반드시 YYYY-MM-DD HH:mm:ss 형식으로 저장하세요.
- 입력받은 "5시간전", "8시간전" 같은 상대시간을 그대로 저장하지 마세요.
Summary
- 기사 상세페이지의 실제 본문을 분석하여 작성한 3~5문장 요약을 저장하세요.
[매우 중요한 저장 규칙]
- 모든 기사는 반드시 스프레드시트에 저장하세요.
- 저장은 선택 사항이 아닙니다.
- 기사 1건당 저장 도구는 정확히 1회만 사용하세요.
- 같은 기사를 여러 번 저장하지 마세요.
- Title은 입력값을 유지하세요.
- Link는 입력값을 유지하세요.
- PublishedAt은 상세페이지에서 직접 확인한 실제 발행일시를 사용하세요.
- Summary만 기사 본문을 기반으로 새롭게 작성하세요.
- 데이터가 없으면 임의로 만들어내지 마세요.
[도구 호출 규칙]
기사 1건을 처리할 때 다음 순서를 따르세요.
1. 기사 입력 확인
2. HTTP 요청 도구로 상세페이지 조회
3. 상세페이지에서 최초 발행일시 확인
4. 실제 기사 본문 확인
5. Summary 생성
6. 스프레드시트 저장 도구 1회 호출
7. 작업 종료
같은 기사에 대해 HTTP 요청이나 저장 도구를 반복 호출하지 마세요.
[최종 응답]
스프레드시트 저장이 완료된 후에는
다음 JSON 구조로만 간단히 출력하세요.
{
"title": "기사 제목",
"link": "기사 URL",
"publishedAt": "2026-08-09 18:42:00",
"summary": "기사 핵심 요약",
"saved": true
}
설명문, 마크다운, 코드블록은 출력하지 마세요.
첫 실행 — 기사별 요약이 잘 나오는 모습
여기까지 세팅하고 채팅을 다시 던져보면, 두 번째 Agent 가 기사 하나하나에 대해 HTTP 호출 → 본문 요약 → JSON 출력을 반복하는 걸 볼 수 있습니다.
저장할 구글 시트 생성
결과를 쌓아둘 구글 시트를 하나 만듭니다. 시트명은 자유롭게 지정하고 (예: 네이버 기사 저장 시트), 탭 이름은 기사요약 으로 두겠습니다. A1 부터 아래 4개 헤더 를 그대로 넣어주세요.
Title Link PublishedAt Summary
Google Sheets Tool — Append Row 설정
두 번째 Agent 의 Tool 소켓에 Google Sheets Tool 을 추가합니다.
설정은 다음과 같이 잡습니다.
- Operation — Append Row
- Document — From list 로 방금 만든 시트 선택
- Sheet — 기사요약 탭 선택
- Mapping Column Mode — Map Each Column Manually
- 각 컬럼(Title / Link / PublishedAt / Summary) 값은 Defined automatically by the model 로 두어 AI 가 입력값을 매핑하도록
⚠️ 전체 실행 — 컨텍스트 초과 오류
여기까지 세팅하고 채팅을 다시 던지면… 처음엔 잘 도는 것 같지만 실행이 점점 느려지다가 결국 아래 에러로 멈춥니다. 두 번째 Agent 가 기사 여러 개의 HTML 을 한꺼번에 System Message + 도구 호출 결과에 몰아 담다가, 모델 컨텍스트 한도를 초과한 상황입니다.
해결 ① — Split Out 으로 배열을 아이템 단위로 쪼개기
Code 노드와 두 번째 Agent 사이에 Split Out 노드를 하나 끼워 넣습니다. Fields To Split Out 에 articles 를 입력하면 워크플로우 아이템 개수가 1 → N (기사 수) 으로 늘어납니다. articles 5건이면 5 items 로.
해결 ② — Loop Over Items + User Prompt 아이템 단위로 재수정
Split Out 뒤에 Loop Over Items 노드를 붙이고, 그 loop 출력에 두 번째 Agent 파이프라인(Agent → Sheets Append)을 통째로 연결합니다. 처리가 끝나면 다시 Loop 로 돌아오게 배선.
Loop 안에 두 번째 Agent + Google Sheets Append + Wait 를 넣습니다. Wait 는 API rate limit 를 피하려고 아이템 사이에 살짝 쉬어주는 용도.
⚠️ 여기서 반드시 같이 바꿔야 하는 것 — 두 번째 Agent 의 User Message 입니다. 이전엔 articles 배열 전체 를 넘겨 "상위 5개 처리해" 라고 시켰지만, 이제는 Loop 가 기사 하나씩 아이템으로 넣어줍니다. 그러니 프롬프트도 기사 1건 관점 으로 다시 써야 합니다.
다음 뉴스 기사 1건을 처리하세요.
Title:
{{ $json.title }}
Link:
{{ $json.link }}
PublishedAt:
{{ $json.publishedAt }}
반드시 위 Link의 기사 상세페이지를 HTTP GET 방식으로 1회 조회하세요.
기사 상세페이지에서 실제 최초 발행일시를 찾아
YYYY-MM-DD HH:mm:ss 형식으로 정리하세요.
입력된 PublishedAt이 "5시간전", "9시간전" 같은 상대시간이어도
그 값을 그대로 저장하지 말고,
상세페이지에서 확인한 실제 발행일시를 사용하세요.
기사 본문만 추출하여 핵심 내용을 한국어 3~5문장으로 요약하세요.
그 다음 연결된 Google Sheets 저장 도구를 사용하여
다음 값을 정확히 1회 저장하세요.
- Title: 입력받은 title
- Link: 입력받은 link
- PublishedAt: 상세페이지에서 확인한 실제 최초 발행일시
- Summary: 기사 본문 요약
저장이 완료되면 추가 도구 호출 없이 작업을 종료하세요.
최종 실행 — 5건 순차 처리 성공
다시 채팅을 던지면 Loop 가 아이템 하나씩 돌면서 Agent 요약 → 시트 저장 → Wait → 다음 순으로 안정적으로 처리합니다.
구글 시트를 열어보면 기사 5건이 Title / Link / PublishedAt / Summary 4컬럼에 맞춰 정확히 저장돼 있는 걸 확인할 수 있습니다.
확장 아이디어
이 워크플로우는 기본 뼈대만 만든 것이라 실무 응용은 무궁무진합니다. 몇 가지 확장 방향.
- Schedule Trigger 로 매일 오전 8시 자동 실행 → 출근 전에 뉴스 요약 완료
- 카테고리별 URL 리스트 를 배열로 넣고 첫 Agent 앞에 Split Out 을 하나 더 두면 여러 카테고리 동시 수집
- 요약이 끝난 뒤 Slack / 카카오 로 하루치 요약본 자동 발송
- 키워드 필터 Agent 를 하나 더 붙여 "AI · 반도체 관련 기사만" 같은 조건 필터링
- 요약 결과를 DB (Postgres / Supabase) 에 저장해서 나중에 검색 가능하게