예전엔 웹을 스크랩하는데 Axios 나 cheerio 같은걸 많이 사용했지만 최근 싱글 페이지 애플리케이션(SPA)이 증가함에따라 동적(dynamically)
으로 랜더링되는 페이지로부터 정보는 다룰 수 없게되었습니다. 대안으로 등장한 Puppeteer는 Chrome브라우저를 제어하는 Node.js 라이브러리로서
이미 Node.js에 익숙하다면 굳이 파이썬과 BS4를 새로 공부할 필요없이 바로 시작할 수 있습니다.
개발환경 : OSX
웹페이지정보를 찾아 csv로 저장하는 간단한 Puppeteer 프로젝트를 실험해보았고 추가적으로 두가지를 더 테스트해봅니다.
npm pkg 를 이용해 노드애플리케이션을 번들링하고 windows환경에서 별도의 개발환경설정없이 exe파일을 실행하여 CSV파일로 뽑아내기. [성공]
구글 클라우드 플랫폼 컴퓨트엔진에 ubuntu 16.04 환경에서 웹페이지를 스크랩하고 CSV파일로 뽑아내기. [성공]
의 어려움은 윈도우에서 실행될 크로미움 브라우저의 경로 문제이다. 스택오버플로우등을 검색해보면 많은 사람들이 Mac에서 개발하고 다른사람의 윈도우10 환경에서 번들링된 앱을 실행할 수 있게고 싶어하지만 곧바로 되지가 않는다.windows용 크롬을 다운로드해서 경로를 재설정해주는 postbuild과정이 필요하다.
다행히 해결책이 몇가지 제시됐다. 그 중 하나는 빌드한 애플리케이션이 실행되는 시점에 해당OS(맥/리눅스/윈도우)에 맞는 크로미움을 다운로드하고 다운로드가 끝나면 해당경로로부터 크로미움을 불러내는것이다. 이 방법로 맥에서 빌드한 exe파일을 윈도우로 보내면 잘 작동하지만 처음 실행할때 300mb에 달하는 크로미움을 다운로드해야해서 시간이 오래걸렸다.그래도 두번째 실행부터는 이미 다운로드한 크로미움을 이용하면 되므로 좋은 방법인거같다.
두번째 방법은 pkg로 앱을 빌드한다음 postbuild과정을 통해
./node_modules/puppeteer/.local-chromium 의 크로미움을 빌드한 실행파일이 위치한
build/chromium 의 경로로 복사해오는 것이다. 다만 이방법의 경우 윈도우환경에서 빌드하면 윈도우용 크롬이 다운로드되서 잘되는데 맥에서 빌드할 경우 크로미움의 윈도우용이 아니라서 제대로 실행되지가 않았다. 윈도우에서 파일 경로에 백슬래시를 사용함으로 발생하는 문제는 정규식으로 해결가능한데 여기서 에서 도움을 받을 수 있다. 결론적으로는 맥에서 코드작성 -> 깃업로드 -> 윈도우에서 프로젝트 클론 -> 윈도우에서 빌드 라는 과정을 통해 exe파일과.local-chromium폴더를 얻어냈다. 크로미움의 용량이 300~400mb 정도 되고 exe 실행파일의 경우 node를 내장하고있어 20~30mb정도 된다.
지금이라면 아마 다른 해결책을 찾아보겠지만, 시간이 없던터라 될것같은 방법으로 일단 해결했다.
구글클라우드 플랫폼 에서 새로운 프로젝트 생성
구글 컴퓨트 엔진 f1 (무료플랜) 인스턴스 생성(id_rsa.pub 입력 + OS는 ubuntu로 설정)
터미널에서 ssh로 인스턴스에 접근
Node.js & npm 설치
# install curl if not installed
$ sudo apt install curl
# install node 10.x repository to the system
$ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
# download & install nodejs 10.x along with npm
$ sudo apt install nodejs
5. 새로운 프로젝트 만들기 : git clone `프로젝트URL`
6. npm install && node index.js
이상태에서 node index.js 로 실행하면! 거의 에러가 납니다.
크롬브라우저를 실행하기위해 필요한 관련 라이브러리가 갓 설치한 우분투에는 없기 때문입니다.
[라이브라리 설치 참조사이트]를 참조하여 라이브러리를 설치해줍니다.(https://skyksit.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%ACUbuntu-puppeteer-%EC%8B%A4%ED%96%89%EC%8B%9C-%EC%97%90%EB%9F%AC%EB%82%A0%EB%95%8C-libX11-xcbso)
7. 이제 node index.js를 다시해보면 puppeteer가 가 문제없이 실행되고 CSV파일이 생성됩니다.