Search

11. n8n으로 네이버 뉴스 스크랩 (n8n -> 노션)

섹션
4. Workflow: 우리 회사 기사 검색

n8n을 활용한 네이버 뉴스 스크래핑 시스템 (Notion 연동)

네이버 뉴스 스크래핑의 기술적 도전

무한 스크롤 구조의 문제점

기존 페이지네이션 방식의 한계

페이지 번호 없음: 1, 2페이지 버튼이 존재하지 않음
무한 스크롤: 스크롤에 따른 동적 콘텐츠 로딩
More 버튼: 추가 뉴스 로딩을 위한 AJAX 요청

개발자 도구를 통한 분석

Network 탭 활용: 스크롤 시 발생하는 HTTP 요청 분석
API 엔드포인트 발견: 뉴스 리스트를 가져오는 실제 URL
Query Parameter 분석: start 파라미터를 통한 페이지네이션

URL 구조 분석 및 활용

페이지네이션 매커니즘

start 파라미터: 10, 20, 30... 순차적 증가
첫 페이지: start=1로 설정하여 초기 뉴스 리스트 접근
다음 페이지 URL: 응답에 포함된 next URL 활용

HTTP 노드를 통한 데이터 수집

기본 HTTP 요청 설정

트리거 및 스케줄링

Owner Schedule: 정기적인 뉴스 수집 자동화
HTTP 노드: 네이버 뉴스 API 엔드포인트 호출
URL 구성: 분석한 API 엔드포인트 활용

Pagination 설정

자동 페이지네이션: n8n의 pagination 옵션 활용
Next URL: 응답의 response.body.url에서 다음 페이지 URL 추출
페이지 제한: 무한 스크롤 방지를 위한 10페이지 제한

크롤링 에티켓 준수

robots.txt 확인 및 준수

크롤링 정책: 웹사이트의 robots.txt 파일 확인
Crawl Delay: 서버 부하 방지를 위한 요청 간격
500ms 간격: 네이버의 정책에 맞는 적절한 지연 시간

HTML 파싱 및 데이터 추출

뉴스 목록 데이터 구조화

Loop over Items 활용

배치 처리: 10개 아이템을 개별적으로 처리
HTML 노드: 각 페이지의 HTML 콘텐츠 파싱
CSS 셀렉터: 특정 요소 추출을 위한 선택자 활용

제목 및 URL 추출

CSS 클래스 활용: .SDS_Comps_Text_Type_Headline_1
Parent Element: 제목의 상위 요소에서 URL 추출
href 속성: 링크 URL 정보 수집

코드 노드를 통한 데이터 가공

배열 구조 생성

타이틀 리스트: 추출된 제목들의 배열
URL 리스트: 해당 기사들의 링크 배열
인덱스 매칭: 제목과 URL의 순서 일치 보장

객체 리스트 생성

Loop 구조: 동일한 인덱스의 제목과 URL 결합
안정성 확보: 배열 길이 검증 및 예외 처리
10개 고정: 네이버 페이지네이션의 일관된 구조 활용

개별 기사 콘텐츠 수집

2차 HTTP 요청

기사 본문 스크래핑

개별 URL 접근: 각 뉴스 기사 페이지 방문
전체 HTML 수집: 사이트별 다른 구조 대응
Body 태그 활용: 안정적인 콘텐츠 추출

다양한 뉴스 사이트 대응

YTN, 연합뉴스: 각기 다른 HTML 구조
통합 접근법: body 태그 전체를 LLM에 전달
구조적 한계: 시맨틱 태그 미적용 사이트 대응

AI 기반 콘텐츠 분석

관련성 필터링 시스템

1차 필터링: 관련성 검증

비즈니스 로직: 회사(Apple) 관련 뉴스만 선별
고성능 모델: 정확한 관련성 판단을 위한 비싼 모델 사용
Boolean 출력: True/False 간단한 결과
비용 효율성: 출력 토큰 최소화

시스템 프롬프트 설계

역할 정의: 관련성 판단 전문가
압박 요소: "잘못 분석하면 해고될 수 있다" 등 정확성 강조
명확한 기준: 구체적인 판단 기준 제시

2차 분석: 감정 분석 및 요약

Filter 노드 활용

관련성 기반 필터링: True인 경우만 후속 처리
효율적 처리: 불필요한 분석 작업 제거
자원 절약: 관련 없는 뉴스의 LLM 호출 방지

통합 분석 프롬프트

멀티태스킹: 감정 분석과 요약을 한 번에 처리
한국어 출력: 최종 사용자를 위한 한국어 요약
구조화된 출력: Summary와 Sentiment 필드 분리

Notion 데이터베이스 연동

Notion 워크스페이스 설정

데이터베이스 생성

테이블 뷰: 뉴스 기사 관리를 위한 데이터베이스 구조
필드 구성: Title, Summary, Sentiment, URL 컬럼
페이지 vs 데이터베이스: Notion의 계층 구조 이해

Integration 설정

Notion Integration: 외부 API 접근을 위한 통합 앱 생성
내부 통합: 보안을 위한 Internal 설정
Secret Token: API 인증을 위한 토큰 발급

n8n Notion 노드 설정

인증 및 연결

Credential 생성: Notion Integration Token 등록
Database 연결: 생성한 데이터베이스와 연결
권한 부여: 데이터베이스 접근 권한 설정

페이지 생성 및 데이터 삽입

Create Page: 새로운 뉴스 기사 페이지 생성
Property 매핑: LLM 분석 결과를 Notion 필드에 매핑
실시간 업데이트: 분석 완료 즉시 Notion에 저장

오류 처리 및 안정성 확보

접근 차단 사이트 대응

크롤링 차단 현상

사이트별 정책: 일부 뉴스 사이트의 크롤링 방지
Access Denied: 브라우저에서는 접근 가능하지만 API 차단
Crawl Delay: robots.txt의 크롤링 지연 설정

Error Handling 설정

Continue on Fail: 오류 발생 시 워크플로우 중단 방지
Skip 처리: 접근 불가 사이트는 건너뛰기
안정적 운영: 일부 실패가 전체 프로세스를 중단시키지 않음

성능 최적화 및 확장성

모델 선택 전략

작업별 모델 차별화

관련성 판단: 고성능 모델로 정확성 확보
감정 분석: 경제적 모델(mini)로 비용 절약
토큰 효율성: Input vs Output 토큰 비용 고려

프롬프트 최적화

작업 분리 vs 통합: 성능에 따른 프롬프트 구조 조정
토큰 절약: 불필요한 정보 제거
품질 검증: 결과 품질에 따른 프롬프트 개선

확장 가능한 아키텍처

다양한 뉴스 소스 통합

Brave API: 해외 뉴스 소스
네이버 뉴스: 국내 뉴스 소스
통합 분석: 여러 소스의 일관된 처리

고급 기능 예고

Python 고도화: 다음 단계 개발 계획
더 정교한 분석: 고급 분석 기능 구현
사용자 정의: 개별 요구사항에 맞는 커스터마이징

실무 운영 고려사항

데이터 품질 관리

중복 제거: 동일 뉴스의 반복 수집 방지
데이터 검증: 수집된 정보의 정확성 확인
정기 점검: 시스템 안정성 모니터링

비용 및 리소스 관리

API 사용량: 각 서비스별 사용량 모니터링
LLM 비용: 모델 선택에 따른 비용 최적화
서버 자원: 크롤링 간격과 시스템 부하 균형