Node.js로 크롬에 특화된 웹 스크래핑 적용하기

Puppeteer에 대한 활용법을 알아보고, 코드까지 적용해보세요.

안녕하세요, 오늘은 Ruby, Python, Java가 아닌 Node.js를 사용하여 웹 크롤러를 만드는 방법에 대해 소개하겠습니다. 특히, Google Chrome 또는 Chromium을 제어할 수 있는 강력한 Node.js 라이브러리인 Puppeteer와 그 확장인 Puppeteer-Extra에 대해 자세히 알아보겠습니다.

Puppeteer란 무엇인가요?

Puppeteer는 웹 페이지 크롤링이나 사용자와 동일한 방식으로 웹 사이트와 상호 작용을 가능하게 하는 Node.js 라이브러리입니다. Puppeteer는 기본적으로 Headless 모드에서 작동하여 GUI 없이 백그라운드에서 작업을 수행하지만, 필요에 따라 전체 브라우저 UI를 가진 Headful 모드로도 설정할 수 있습니다.

Puppeteer를 사용하는 이유는 무엇인가요?

1. 크롬에 최적화된 성능

Puppeteer는 Chrome DevTools Protocol을 사용하여 Chrome 브라우저와 직접적으로 통신합니다. 이는 Selenium과 같은 다른 자동화 도구가 제공하는 WebDriver API를 사용하는 것보다 더 빠르고 정밀한 제어를 가능하게 합니다.

2. 동적 웹 콘텐츠 처리에 강력

정적 페이지 뿐만 아니라 JavaScript로 동적으로 생성되는 콘텐츠를 처리하는 데 있어 Puppeteer는 탁월한 성능을 발휘합니다. 이는 현대 웹의 복잡한 상호작용과 동적 요소들을 효과적으로 처리할 수 있음을 의미합니다.

3. 차단 회피

실제 크롤링 작업에서 Puppeteer는 차단을 회피하며 데이터를 수집하는 데 효과적입니다. 특히 Puppeteer-Extra와 Stealth Plugin을 사용하면, 자동화 탐지 메커니즘을 우회하여 보다 안정적으로 데이터를 수집할 수 있습니다.

Puppeteer-Extra와 Stealth Plugin

Puppeteer-Extra

Puppeteer-Extra는 기본 Puppeteer 라이브러리 위에 구축된 확장판으로, 유연한 플러그인 시스템을 통해 사용자가 필요에 따라 추가 기능을 쉽게 통합할 수 있습니다. 이를 통해 기능이 향상되며, 크롤러의 사용성이 개선됩니다.

Stealth Plugin

Puppeteer-Extra의 플러그인 중 하나인 Stealth Plugin은 크롤링 시 자주 발생하는 자동화 탐지를 효과적으로 회피합니다. 많은 웹사이트에서 크롤러를 차단하지만, 이 플러그인을 사용하면 자동화된 크롤러임에도 불구하고 사용자의 브라우저처럼 보이게 할 수 있습니다.
실제 사용 예 이제 Puppeteer-Extra와 Stealth Plugin을 사용하여 간단한 크롤링 작업을 수행하는 방법을 알아보겠습니다.

1. 필요한 모듈 설치하기

puppeteer-extra와 puppeteer-extra-plugin-stealth 모듈 설치를 위해서 아래 명령어를 입력하여 설치합니다.
npm install puppeteer-extra puppeteer-extra-plugin-stealth

2. 필요한 모듈 불러오기

import puppeteer from 'puppeteer-extra'; import StealthPlugin from 'puppeteer-extra-plugin-stealth'; import fs from 'fs';

3. 명령어에 url을 입력 유무 예외 처리

차후에 node node_js.mjs <https://www.example.com> 이러한 명령어를 사용하여 url을 직접 입력하기 때문에 url이 없다면 예외를 내는 코드를 넣었습니다.
const args = process.argv.slice(2); // 첫 번째 요소는 Node.js 실행 경로이므로 제외 if (args.length < 1) { console.error('URL 파라미터가 필요합니다.'); process.exit(1); // 오류로 종료 }

4. stealthplugin 적용하기

puppeteer.use(StealthPlugin());

5. 브라우저 상호작용 적용

puppeteer.launch({ headless: false }).then(async browser => { //해당 headless는 하지 않고 눈에 보이게 브라우저를 띄워줍니다. const url = args[0]; // 첫 번째 파라미터로부터 URL 가져오기 const page = await browser.newPage(); // 새 브라우저 열기 await page.goto(url); // url로 페이지 이동 await page.waitForTimeout(5000); // 렌더링 완료를 위해 5초 대기 const currentUrl = await page.url(); // url을 변수에 저장 console.log('현재 페이지의 URL:', currentUrl); // url이 제대로 담겼는지 출력 // 페이지의 HTML을 변수에 저장 const html = await page.content(); // HTML 내용을 파일로 저장합니다 fs.writeFile('pageContent.html', html, (err) => { if (err) { console.error('파일 저장 중 오류 발생:', err); } else { console.log('HTML이 성공적으로 저장됨: pageContent.html'); } }); });

6. 명령어 실행

입력형태로 받기 위해 mjs파일로 생성하였습니다.
node [파일명].mjs <https://www.naver.com>
url이 직접 열리고 터미널에는 출력이 나옵니다.

7. html파일 확인

아래와 같은 pageContent.html이 저장된 것을 확인할 수 있습니다.
notion image
 
이 스크립트는 사용자가 지정한 URL로 이동하여 페이지의 HTML을 가져와 pageContent.html 파일로 저장합니다. Puppeteer-Extra와 Stealth Plugin을 사용하면 웹사이트의 자동화 탐지 로직을 효과적으로 우회할 수 있습니다.
 
 
이 글이 Node.js를 사용하여 크롤러를 만드는 방법을 이해하는 데 도움이 되었기를 바랍니다. Puppeteer와 그 확장 기능을 활용하면 보다 강력하고 효과적인 웹 크롤링 솔루션을 구현할 수 있습니다.