본문 바로가기
개발일기

[Node] node로 크롤러 개발 이슈들 정리

by Nhahan 2023. 5. 15.

개발할 것

특정 웹사이트 크롤링

 

 

시각적으로 진행 상태를 전달하지 않으면 크롤링 중인지 멈추었는지 알 수가 없어서 추가한 progress bar

 

개발 언어

python의 셀레니움도 생각헀지만, 너무 흔하고 이미 해본 것이라 신선함도 느껴볼 겸 puppeteer를 써보기로 했다.

puppeteer는 구글이 개발했다고 한다. 바로 신뢰도 200%. 타입스크립트로 진행했다.

 

무한스크롤 관련 이슈를 제외하면 개발 자체 난이도는 높지 않았다. 프로세스가 멈추었는지 여부를 보여주기 위해 프로그레스바를 이용해 진행 상태의 시각적 효과를 추가했다. 빌드는 webpack을 이용했다.

 

전달 방식에 대한 고민

첫 번째 생각

분명 상대방 컴퓨터의 node 설치관련 문제가 있을 거라 생각했다.

그래서 pkg라는 라이브러리로 바이너리 실행파일을 만들어 전달하려고 했지만, puppeteer가 문제였다. 직접 브라우저를 조작하여 크롤링하기 때문에 바이너리 파일 안에서 chromium 실행이 문제였다. 패스.

 

두 번째 생각

부디 node 설치 문제가 발생하지 않길 바라며 상세한 사용법을 사용자에게 전달했다.

사용자가 할 것은 node를 설치하고 README에 적힌 명령어만 터미널에서 실행해주면 되겠다고 생각했다.

전달받은 스크린샷. 걱정이 현실로... 노드 버전이 10이라 안돌아가고 있는 상황.

그러나 역시는 역시. 문제가 될까 싶었던 사용자 분-martinhong님ㅋㅋ-의 컴퓨터 환경의 node 버전 문제가 있었다. 그래서 다음 플랜으로 넘어갔다. 다른 분의 컴퓨터 환경의 node 버전 수정은 은근 힘든 일이다.

 

세 번째 생각

아예 웹으로 배포하기.

하지만 서버비가 아까우므로 패스.

 

네 번째 생각

일렉트론으로 전달하기.

유저가 개발자가 아니시기 때문에 UI를 제공하는 게 좋다고 생각했고, 일렉트론은 자체가 크로미움 기반이라 puppeteer 사용에 문제 없을 것이었다(뇌피셜 희망사항). 이거는 개인적으로 해보고 싶었는데 왜냐하면 일렉트론에 원래 관심이 좀 있었기 때문이다. 이번 기회에 경험해보고 싶었지만, 그러다간 주말이 모두 지나갈 것 같아 패스. 근데 분명 가능은 할 것이라 생각한다.

안해봐서 모르지만 노드 버전 관련 이슈가 또한 여기에서도 있을 가능성이 있긴 하다.

 

다섯 번째 생각

도커로 전달.

아예 환경 설정 문제를 제거해버리자고 생각했고, 도커 안에서 크로미움을 띄우는 데에 다소 시간을 소요했지만 성공했다.

대신 사용자 분은 도커를 설치해야할 테지만 이 또한 리드미에 링크를 포함하여 전달드렸다.

도커 안에서 크롤러를 실행 후 컨테이너 안의 크롤링 데이터(.csv)를 로컬로 갖고 오게 했다.

 

#!/bin/bash

docker rmi crawler

DATE=$(date '+%Y-%m-%d')

mkdir -p ./data/$DATE

IMAGE_NAME="crawler"

docker build -t $IMAGE_NAME .

docker run -t --env-file .env -v $(pwd)/data/$DATE:/app/data crawler node bundle.js
docker wait crawler

docker container prune -f

 

관리가 필요없게, 혹여나 잉여 이미지나 컨테이너가 생성되지 않도록 일단 다 삭제하고 실행하게 했다. 어차피 사용자 분은 개발자가 아니시라 이 크롤러 외에 도커를 쓸 일은 없으실 거고, 그럼에도 불구하고 혹시 쓰실 일이 있으실까봐 리드미에도 남겨놓고 구두로도 주의사항을 전달드렸다.

 

또한 .env의 환경변수를 통해 크롤링 시간(~=크롤링 데이터의 양)과 무한스크롤 딜레이를 조절할 수 있다.

 

 

 

상당히 만족스러웠기에 아마 다음에 또 크롤러를 개발할 일이 있다면 그 때도 puppeteer를 쓸 것 같다.

 

 

 

'개발일기' 카테고리의 다른 글

[Node] native addon과 워커 스레드  (0) 2023.07.02
개발의 세계관  (0) 2023.06.21
마이크로서비스 핵심 개념 6가지  (0) 2023.05.13
암호학에서의 솔트(salt)  (0) 2023.04.12
처음으로 외주를 하면서 느낀 점  (0) 2022.10.03

댓글