Node.js 기반 웹 크롤링으로 반복 업무 자동화 끝내기
매일 아침 9시, 특정 사이트의 데이터를 수동으로 긁어 엑셀에 옮기는 데 45분이 걸렸습니다. Node.js로 크롤러를 직접 개발해 구글 시트 API와 연결한 뒤로는, 아침에 커피 한 잔 마시는 동안 모든 데이터가 자동으로 업데이트됩니다. 개발에 꼬박 3일이 소요되었지만, 매주 3시간 45분이라는 귀중한 시간을 확보했습니다. 단순히 데이터를 긁어오는 수준을 넘어, 실무에서 바로 활용 가능한 자동화 워크플로우를 구축하는 방법은 무엇일까요?
자동화는 단순히 효율을 높이는 기술이 아니라, 인간이 더 창의적인 문제 해결에 집중할 수 있도록 시간을 벌어주는 필수적인 전략입니다.
웹 크롤링을 위한 기술 스택 선택
Node.js 환경에서 크롤링을 시작할 때 가장 먼저 고려해야 할 것은 대상 페이지의 특성입니다. 정적 페이지라면 Cheerio와 Axios 조합이 가장 빠르고 가볍고, 동적 페이지라면 Playwright나 Puppeteer와 같은 Headless Browser 도구가 필수적입니다.
정적 페이지와 동적 페이지의 차이
정적 페이지는 서버에서 완성된 HTML을 응답하므로 Axios와 Cheerio를 통한 데이터 파싱만으로 충분합니다. 반면, 자바스크립트로 렌더링되는 동적 페이지는 브라우저 엔진을 구동하는 Playwright가 없으면 데이터를 수집할 수 없습니다.
실제 업무 자동화 현장에서는 효율을 위해 두 방식을 섞어서 사용합니다. 예를 들어, 로그인이나 복잡한 폼 제출이 필요한 경우에만 Playwright를 사용하고, 나머지 데이터 수집은 가벼운 HTTP 요청 방식으로 처리하는 것이 서버 리소스를 아끼는 핵심입니다. 제가 직접 운영하는 워크플로우에서는 이를 구분하여 처리함으로써 서버 비용을 30% 절감했습니다.
실무 자동화 워크플로우 구축
크롤링된 데이터를 어떻게 활용하느냐가 자동화의 성패를 결정합니다. 수집한 데이터를 슬랙 봇 알림으로 보내거나 구글 시트에 즉시 기록하는 Webhook 연동 과정이 반드시 포함되어야 합니다.
데이터 정제와 시스템 연동
데이터 파싱 후 가장 중요한 단계는 불필요한 공백이나 형식 오류를 제거하는 데이터 정제 과정입니다. 수집된 데이터를 그대로 저장하면 나중에 활용하기 매우 어렵기 때문에, 정제 단계에서 API 엔드포인트에 최적화된 형태로 가공해야 합니다.
저는 주로 n8n이나 Make를 활용해 크롤링 데이터의 후속 조치를 처리합니다. 예를 들어, 특정 조건의 데이터만 슬랙으로 전송하도록 설정하면 불필요한 알림을 줄일 수 있습니다. 다만, Make의 경우 무료 플랜에서 월 1,000 오퍼레이션 제한이 있어 에러 재시도 로직까지 고려하면 운영 중 유료 전환이 거의 필수적입니다. 스케줄링 자동화를 위해 Cron Job을 활용하여 주기적으로 크롤러를 호출하는 구조를 잡는 것이 가장 안정적입니다.
크롤링 시 주의사항과 대응
웹 크롤링을 지속적으로 수행하다 보면 IP 차단 대응이 반드시 필요합니다. 요청 빈도가 너무 높으면 서버는 이를 공격으로 간주하고 접근을 막기 때문입니다.
운영 안정성을 높이는 방법
IP 차단을 방지하려면 요청 사이에 적절한 대기 시간을 두는 비동기 프로그래밍 기법을 활용해야 합니다. 또한, 프록시 서버를 이용하거나 User-Agent를 주기적으로 변경하는 것도 좋은 대응책이 됩니다.
또한, Node.js 교과서 수준의 기초 지식만으로는 복잡한 비동기 처리를 완벽히 이해하기 어렵습니다. 실무에서는 Promise와 async/await를 능숙하게 다뤄야 크롤러가 멈추지 않고 동작합니다. 데이터 수집 주기를 설정할 때는 상대 서버에 과도한 부하를 주지 않도록 배려하는 것이 상호 간의 매너이자, 장기적으로 안정적인 크롤링을 유지하는 비결입니다.
자동화는 한 번 세팅해두면 끝나는 것이 아니라, 대상 사이트의 구조가 바뀌면 수정이 필요한 살아있는 시스템입니다. 오늘 정리해 드린 내용을 바탕으로 여러분의 반복 업무를 조금씩 줄여나가 보시길 바랍니다.
