본문 바로가기

개발

Node.js로 웹 스크래핑, 크롤링, 데이터 수집 하는방법

Node.js는 웹 스크래핑과 데이터 수집과 같은 자동화 작업에 매우 유용한 도구입니다. 웹 스크래핑은 웹 페이지에서 데이터를 추출하고 필요한 정보를 수집하는 프로세스를 의미합니다. 이를 통해 실시간 데이터 분석, 가격 비교, 정보 모니터링 등 다양한 용도로 활용할 수 있습니다. Node.js는 비동기 I/O 처리 능력과 강력한 네트워크 라이브러리를 제공하여 웹 스크래핑 작업을 효율적으로 수행할 수 있습니다.

 

웹 스크래핑 기초

웹 스크래핑을 위해서는 HTML 문서를 가져와서 파싱하고 원하는 데이터를 추출해야 합니다. Node.js에서는 axios, request와 같은 HTTP 클라이언트 라이브러리를 사용하여 웹 페이지에 접속하고 HTML 데이터를 가져올 수 있습니다. 이후 cheerio, jsdom과 같은 HTML 파서를 사용하여 데이터를 추출할 수 있습니다.

 

데이터 수집과 저장

웹 스크래핑으로 추출한 데이터는 필요에 따라 저장할 수 있습니다. Node.js에서는 파일 시스템에 데이터를 저장하는 것은 물론, 데이터베이스에 저장하거나 외부 API와 연동하여 데이터를 전달할 수도 있습니다. 데이터 저장 방식은 프로젝트의 요구사항과 활용 목적에 따라 다양하게 선택할 수 있습니다.

 

스크래핑 로직 개발

웹 스크래핑은 대부분 자동화된 작업입니다. 스크래핑 로직은 웹 페이지의 구조와 데이터 위치에 따라 개발되어야 합니다. Node.js는 비동기 프로그래밍 모델을 제공하기 때문에, 비동기 작업을 순차적으로 처리하거나 병렬로 처리할 수 있는 기능을 활용하여 스크래핑 로직을 개발할 수 있습니다.

 

스크래핑한 데이터의 정제와 가공

스크래핑한 데이터는 종종 추가적인 가공과정이 필요할 수 있습니다. Node.js는 강력한 문자열 조작 라이브러리인 lodash, string.js와 같은 라이브러리를 제공하여 데이터를 정제하고 가공할 수 있습니다. 이를 통해 데이터의 포맷을 표준화하거나 원하는 형태로 변환할 수 있습니다.

 

아래는 axios와 cheerio 라이브러리를 활용해서 스크래핑을 하는 코드의 예제입니다.

const axios = require('axios');
const cheerio = require('cheerio');

const url = 'https://example.com'; // 스크래핑할 웹 페이지의 URL

axios.get(url)
  .then(response => {
    const html = response.data;
    const $ = cheerio.load(html);

    // 원하는 데이터 추출 예시
    const title = $('h1').text(); // h1 태그의 텍스트 추출
    const links = [];
    $('a').each((index, element) => {
      const href = $(element).attr('href'); // 링크의 href 속성 추출
      links.push(href);
    });

    // 추출한 데이터 활용 예시
    console.log('페이지 제목:', title);
    console.log('링크 목록:', links);
  })
  .catch(error => {
    console.error('오류 발생:', error);
  });

위와 같이 해당 라이브러리등을 사용하여 간략하게 실제로 스크래핑을 해보는 예제코드를 보여드리겠습니다.

const axios = require('axios');
const cheerio = require('cheerio');

const url = 'https://op.gg'; // 스크래핑할 웹 페이지의 URL

axios.get(url)
  .then(response => {
    const html = response.data;
    const $ = cheerio.load(html);

    // 원하는 데이터 추출 예시
    const summonerName = $('.SummonerName').text().trim(); // 소환사 이름 추출
    const tier = $('.TierRank').text().trim(); // 티어 추출
    const winRate = $('.WinRatioTitle').text().trim(); // 승률 추출

    // 추출한 데이터 출력
    console.log('소환사 이름:', summonerName);
    console.log('티어:', tier);
    console.log('승률:', winRate);
  })
  .catch(error => {
    console.error('오류 발생:', error);
  });

 

 

예제 코드에서는 "https://op.gg"에서 소환사 이름, 티어, 승률을 추출하였습니다. .SummonerName, .TierRank, .WinRatioTitle 클래스를 사용하여 해당 데이터를 선택하고 .text()로 텍스트 값을 추출합니다.

이 예제를 실행하면 콘솔에 추출한 데이터가 출력됩니다. 위의 예제 코드를 참고하여 "https://op.gg" 또는 다른 웹사이트를 스크래핑해보세요. 필요에 따라 코드를 수정하고 원하는 데이터를 추출할 수 있습니다. 하지만 모든 웹페이지를 스크래핑 혹은 크롤링 해도 되는것은 아닙니다. 해당 웹사이트의 운영자가 크롤링을 허용하는지 혀용한다면 누구에게 어디까지 허용할 것인지에 대한 정보는 보통 {url}/robots.txt 에 명시되어 있습니다. 해당 파일의 해석은 검색해보시면 쉽게 나오니 꼭 스크래핑, 크롤링전에 확인하시고 진행 해보시길 바랍니다.