Javascript Node.js

Node.js에서 CSS 선택자로 간편하게 웹 스크래핑(웹 크롤링)을 하는 방법

웹 스크래핑(Web Scraping) 또는 웹 크롤링(Web Crawling)은 웹 페이지로부터 원하는 정보를 추출하는 기법입니다. 어떤 서비스에서 API가 별도로 제공되고 있지 않지만 웹 페이지로는 정보가 제공되고 있을 때, 웹 스크래핑 기법을 이용하면 원하는 정보를 획득할 수 있습니다.

웹 스크래핑의 원리에 대해서는 이전 글인 웹 스크래핑(웹 크롤링)의 원리에서 다루었습니다. 이번 글에서는 Node.js에서 패키지 2가지를 조합하여 손쉽게 구현한 웹 스크래핑 함수 예제코드를 소개합니다.

 

패키지 설치

Node.js에서는 npm으로 설치할 수 있는 패키지 2가지만 있으면, 웹 스크래핑을 손쉽게 구현할 수 있습니다. 많은 경우에 아래의 2가지 패키지가 사용됩니다.

Axios는 Node.js에서 HTTP 통신을 할 때는 거의 표준에 준하여 사용되는 패키지로 열기 과정에서 사용할 수 있습니다. 이렇게 HTTP 통신으로 가져온 HTML을 cheerio 패키지를 이용하면, 찾기 과정을 CSS 선택자로 간단하게 마칠 수 있습니다. 남은 보기 과정은 cheerio에서 text() 메서드를 호출하여 수행합니다.

npm install axios
npm install cheerio

각 패키지는 소스코드 실행 전 위와 같이 npm로 설치해주어야 합니다.

 

구현 함수

이 2가지 패키지를 통해 스크래핑 함수를 구현하면 아래와 같습니다. 함수는 먼저 url 인자로 입력한 URL에 Axios로 통신하여 HTML 소스코드를 받아옵니다. 이어서 입력한 CSS 선택자를 통해 cheerio가 받아온 HTML 소스코드에서 해당하는 요소를 찾습니다. 마지막으로 찾은 내용을 res에 담아 최종적으로 반환합니다.

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

async function webScraping(url, selector) {
    let res = [];
    let html = await axios.get(url);
    let $ = cheerio.load(html.data);
  
    for(let v of $(selector)) {   
        res.push($(v).text());
    }
  
    return res;
}

실제로 위 함수를 사용하는 예는 아래와 같습니다. 스크래핑할 URL와 스크래핑할 부분의 CSS 선택자를 넣어 간단하게 사용할 수 있습니다. 다만 HTTP 통신이 비동기로 이뤄짐에 따라서 이 함수는 Promise 패턴을 반환하므로, then()을 이용하여 처리를 해주어야 하는 점에 유의해야 합니다. 인자로 들어오는 값은 배열이기 때문에, 입력한 선택자에 여러 개의 요소가 해당하더라도 문제없이 정보를 수집할 수 있습니다.

let url = 'https://dev.epiloum.net';
let selector = 'h2.entry-title';

webScraping(url, selector).then((res) => {
  console.log(res)
});

전체 소스코드는 Github 저장소에서 확인하실 수 있습니다. 필요하신 분은 참고하여 주시기 바랍니다.

Leave a Reply

Your email address will not be published. Required fields are marked *