이번에 시도해본 건 단순히 "정보를 긁어"오는 크롤링 실험이 아니었다. 처음엔 페이지 HTML을 긁어서 텍스트를 추출하는 정도로 시작했지만 만들다 보니 아예 기사를 읽고 요약까지 해주고, 그걸 블로그에 발행까지 해주는 프로세스를 만들게 되었다. 고스트는 아니고 워드프로세스로 구현했다.
내가 직접 쓰지 않아도 내 웹페이지에 그날의 주요 뉴스 브리핑이 깔끔하게 발행되어 있는 것. 마치 개인 비서가 매일 아침 신문을 읽어서 브리핑해주는 느낌이다. ai 덕분에 나뿐만 아니라 많은 사람이 이런 자동화 프로세스를 만들어 이용하고 있다. 재미난 세상... 여하튼 내가 잡은 목표는 아래와 같다.
최종 목표: 크롤링 → GPT 요약 → 블로그 자동 업로드
크롤링: Playwright + BeautifulSoup
요약: OpenAI GPT-4 API
업로드: WordPress API
자동 실행: GitHub Actions (cron)
보안 관리: GitHub Secrets + dotenv
포맷 처리: Markdown → HTML 변환
그런데 이거.. 다 만들어 놓고 나니 n8n으로도 구현할 수 있을 것 같고 그게 더 제어하기 좋을듯해서 다시 구축해 볼 예정..^^
이번 글에는 단순히 "코드를 어떻게 짰다"가 아니라, 이 흐름을 어떻게 잡았고 어떤 시행착오를 거쳤는지, 어떤 구조를 선택했는지를 기록해본다.
여러 카테고리 크롤링 시도
강의를 들으면서 실습을 시작했을 때 첫 타겟은 네이버 뉴스/블로그/카페였다.
일단 가장 익숙한 플랫폼이고 한국어 데이터가 풍부하니까 접근도 쉬웠다.
네이버 크롤링은 예전에 해본 적이 있어서 HTML 구조를 보는 것도 낯설지 않았다. 전체적으로 전에 혼자 해봤던 작업들을 복습하며 개념을 다지는 느낌이어서 좋았다.
query=openai
같은 키워드로 검색 결과 수집- 상위 10개 콘텐츠 제목과 링크 확보
requests
+bs4
조합으로 본문 텍스트 추출 시도
네이버 카페나 블로그 및 쇼핑 분야 html의 경우, 구조가 비교적 복잡하지 않아서 동적 페이지 크롤링까지 스무스하게 진행했다. 하지만 블로그나 카페의 경우 전문성 측면에서 편차가 있는 데다 내용 중복, 광고, 불필요한 콘텐츠가 많아 정제가 쉽지 않아 보였다. 한편 뉴스 카테고리에서는 다른 이슈가 발생했다.
네이버 뉴스의 경우 카테고리마다 HTML 구조와 클래스명이 다르고 변경도 종종 있는 편이다. 뉴스는 발행사 저작권 문제로 인해 HTML 구조나 API 접근이 상대적으로 복잡하게 설계된 것으로 보인다. 이런 구조 변경과 불규칙성은 자동화에 있어서 큰 걸림돌이다.
"크롤링은 결국 구조를 따라가는 작업인데, 이를 크롤링 대상으로 삼는 게 맞는 걸까?"
아무래도 자동화를 하려면 구조가 안정적이고 신뢰할만한 콘텐츠가 많으며, 품질이 일정한 데이터 소스가 필요하다. 단발성 실습이 아니라 지속 가능한 자동화를 하고 싶었기 때문에 이런 불안정한 환경에 의존하는 건 어렵다는 결론을 내렸다.
그러고보니 예전에 postman으로 했던 것처럼 네이버 뉴스 api 엔드포인트 찍어서 연결했던 방식으로 하면 되지 않나? 하는 생각이 들었는데.. 실제로https://openapi.naver.com/v1/search/news.json?query=openai&display=10
같은 검색 API는 제목, 요약 디스크립션, 링크, 날짜 같은 메타데이터를 안정적으로 준다. 빠르고 DOM 변경에도 영향이 없다는 점이 매력적이다.
다만 내가 필요한 건 '본문 전문'이었기에 결국 링크를 따라가 각 언론사 기사 페이지를 다시 파싱해야 해서 크롤링 복잡도는 크게 줄지 않는 상황. 게다가 API는 키 발급, 쿼터 등 정책적인 제약이 있다. 네이버 뉴스 활용 시 API로 링크 리스트업 → 본문은 requests+bs4(필요 시 Playwright)으로 수집하는 하이브리드 방식으로 가고.. 나는 우선 it 분야를 전문으로 하면서도 구조가 단순한 해외 매체로 end-to-end 흐름을 먼저 안정화하기로 했다.
참고로 강의에서 네이버 API를 전면 추천하지 않은 이유가 궁금했는데 범용성/실습 난이도 때문일 가능성이 큰듯하다. 대부분의 사이트는 공식 API가 없고 있어도 키나 쿼터 이슈로 수강생마다 변수가 크다 보니 JS 렌더링 등 현실 과제를 다루는 Playwright+bs4가 교육용으로 더 보편적일 것이다.
내가 구현하고 싶은 자동화 프로세스
게다가 강의에서 알려준 건 상품 관련 내용이었지만 나는 it 뉴스 인사이트를 요약하는 콘텐츠를 만들어 자동화하고 싶었다. 어짜피 배운 걸 그대로 쓰는 것보다 응용하고 적용하는 게 더 중요하다. 또 내가 요즘 관심 있는 분야를 다뤄야 이후에도 재밌게 할 수 있을 거라고 생각해서 강의 따라가기는 잠시 중단하고 방향을 틀었다.
심플한 구조의 뉴스 플랫폼으로 방향 전환
단발성 실습이 아니라 지속 가능한 자동화를 하려면 구조가 안정적이고, 신뢰할 만한 콘텐츠가 많으며 품질이 일정한 데이터 소스가 필요하다고 판단했다. 그래서 아래처럼 나름의 기준을 세워보았다.
- 단순한 데이터 구조 — CSS 클래스와 HTML 계층이 명확하고 중첩이 적을 것
- 낮은 변경 가능성 — 플랫폼 차원에서 HTML 구조를 자주 바꾸지 않을 것
- 일정한 콘텐츠 품질 — 신뢰할 수 있는 저널리즘 기반의 기사 기반일 것
- 반복적 접근에 적은 제약 — 로그인 없고 차단 정책이 과도하지 않을 것
구글 뉴스도 검토해보았지만 네이버와 비슷한 상황이었기에 시야를 넓혀 해외 뉴스 전문 사이트를 알아보았다. 여러 사이트를 테스트하다가 조건에 얼추 맞는 곳을 찾았다.
- URL 구조:
/article/yyyy/mm/dd/title
형태로 특정 기간 기사만 필터링 가능 - 본문 위치:
.styles_text__...
클래스에 안정적으로 들어 있음 - HTML 단순성: 광고나 스크립트 요소가 분리되어있거나 최소화돼 있음
소스를 바꾸니 이제는 크롤링보다 전체 흐름 설계와 결과물 품질이 더 중요한 문제로 떠올랐다.
두둥실 ☁️
구현하려는 흐름
최종적으로 구현하려는 전체 흐름은 아래와 같다. 1-4번까지가 이번 편에서 진행된 내용이다. 이제 중요한 콘텐츠화와 자동 업로드 부분이 남았다.
- 크롤링:
async_playwright
로 JS 렌더링 대기 후 HTML 파싱 - 링크 수집:
/article/...
패턴의 URL만 추출 - 필터링: URL에서 날짜 추출해 최근 7일 이내 기사만 남김
- 본문 추출: 기사 상세 페이지에서 본문 내용 파싱 //// 여기까지 진행된 상태
- 요약 생성: GPT API로 뉴스 브리핑 작성
- 포맷 변환: Markdown에서 HTML 템플릿화
- 업로드: WordPress API 호출
- 자동 실행: GitHub Actions + cron 스케줄
- 보안 관리: GitHub Secrets + dotenv
8, 9번 단계는 간단해서 여기에 적는다. 크롤링과 뉴스 요약이 한 번 실행으로 끝나지 않도록 GitHub Actions를 통해 .yml
스케줄링 설정을 추가했다. 이렇게 하면 수동 push 없이도 원하는 때에 자동으로 크롤링 → GPT 요약 → WordPress 업로드가 가능해진다.
또한 비밀번호와 api key 등 프라이빗한 값(OPENAI_API_KEY
, WP_PASSWORD
)은 로컬 환경에서는 dotenv
로 불러오고, GitHub 환경에서는 Secrets
로 설정해서 보안 이슈도 챙겼다.
이어서 2편에서는 5, 6, 7번 위주로 다룬다. 이 파이프라인을 안정화시키고 프롬프트 설계, 비용을 고려한 모델 선택, 업로드 문제 해결, 그리고 클린 코드 리팩토링까지의 과정을 정리했다.