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

Node.js를 사용하여 크롬에 특화된 웹 스크래핑을 적용하는 방법에 대한 소개입니다. Puppeteer와 Puppeteer-Extra를 사용하여 동적 콘텐츠 처리와 차단 회피가 가능합니다.

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

안녕하세요, 오늘은 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이 저장된 것을 확인할 수 있습니다.

결론

이 스크립트는 사용자가 지정한 URL로 이동하여 페이지의 HTML을 가져와 pageContent.html 파일로 저장합니다. Puppeteer-Extra와 Stealth Plugin을 사용하면 웹사이트의 자동화 탐지 로직을 효과적으로 우회할 수 있습니다.

이 글이 Node.js를 사용하여 크롤러를 만드는 방법을 이해하는 데 도움이 되었기를 바랍니다. Puppeteer와 그 확장 기능을 활용하면 보다 강력하고 효과적인 웹 크롤링 솔루션을 구현할 수 있습니다.

댓글

댓글 작성

이메일은 공개되지 않으며, 답글 알림에만 사용됩니다.

이어서 읽어보세요

새 글 알림 받기

해시스크래퍼 기술 블로그의 새 글이 발행되면 이메일로 알려드립니다.

이메일은 새 글 알림에만 사용됩니다.