본문 바로가기

Node.js/Node.js 웹 크롤링

[node.js] 웹 데이터 수집 ② - HTML 해석(링크와 이미지 추출)

반응형




※ 스크래핑이란?



 웹의 세계에서 흔히 말하는 '스크래핑'은 웹사이트에서 HTML 데이터를 수집하고, 특정 데이터를 추출, 가공하여 저장하는 것을 말한다. 단순히 웹사이트에서 HTML 파일을 다운로드만 하는 것이 아니라 그 HTML 파일의 각 요소들을 분석하는 과정을 포함한다.








cheerio-httpcli 모듈 설치




01. 우선 명령 커멘드 창을 열고 다음 명령을 실행하여 cheerio-httpcli을 설치한다.

 > npm install -g cheerio-httpcli




02. 정상적으로 설치가 되었다면 아래와 같은 결과가 나오는 것을 확인할 수 있다.












■ HTML 파일 다운로드




01. 이제 'cheerio-httpcli' 모듈을 사용해서, 웹 페이지를 내려받아 HTML 문서를 화면에 출력해보자 코드는 아래와 같다.

 getpage.js

// 모듈 로드
var client = require("cheerio-httpcli");

// 다운로드
var url = "http://jpub.tistory.com";
var param = {};

client.fetch(url, param, function(err, $, res) {

    // 에러 체크
    if(err) {
        console.log("Error : ", err);
        return;
    }

    // 다운로드한결과를 화면에 출력
    var body = $.html();
    console.log(body);
});




02. 우선 명령 커멘드 창을 열고 다음 명령을 실행하여 cheerio-httpcli을 설치한다.

 > node getpage.js




03. 출력결과는 아래와 같다.











■ HTML 파일에서 링크 추출



01. 이번에는 HTML에 링크된 URL 목록을 출력하는 프로그램을 만들어 보자.

    위에서 작성한 프로그램을 수정하여 링크를 추출하는 코드를 추가한다.

 showimage.js

// 모듈로드
var client = require("cheerio-httpcli");
var urlType = require("url");

// 다운로드
var url = "http://www.softicons.com/search?search=" + encodeURIComponent("dog");
var param = {};


// fetch() 메소드의 콜백 함수를 지정하고 있는데 그 익명 함수의 두번째 인자로 $를 지정하였다.

// 이를 통해 jQuery처럼 페이지의 특정 요소를 추출할 수 있게 된다.

client.fetch(url, param, function(err, $, res) {

    // 에러 체크
    if(err) {
        console.log("error");
        return;
    }
 
    // 기본적으로 $("a")라고 쓰면 HTML 문서 내의 모든 <a>태그를 추출한다.

    // 사용할 $("img")의 경우 모든 <img>태그를 추출한다.

    // 이어서 each()메소드를 통해 추출한 각 요소들에 대해 지정한 함수를 수행한다.

    // 그 함수에서 추출한 각 요소의 텍스트 부분과 src 속성의 값을 콘솔에 출력한다.

    $("img").each(function(idx) {
        var src = $(this).attr("src");
        src = urlType.resolve(url, src);
        console.log(src);
    });
});




02. 이제 다시 커멘드 창에서 위에서 작성한 프로그램을 실행한다.

 > node showlink.js




03. 출력결과는 아래와 같다.








반응형

'Node.js > Node.js 웹 크롤링' 카테고리의 다른 글

[node.js] 웹 데이터 수집 ①  (1) 2017.05.19