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

Node.js/Node.js 웹 크롤링 2017. 6. 20. 18:29




※ 스크래핑이란?



 웹의 세계에서 흔히 말하는 '스크래핑'은 웹사이트에서 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 웹 크롤링 2017. 5. 19. 15:00




■ Node.js로 웹 페이지 다운로드




01. node.js로 웹 페이지를 다운로드 받는 코드는 아래와 같다.

 download-node.js

// url에 있는 파일을 savepath에 다운로드 한다.

// 다운로드 URL을 지정
var url = "http://blog.wickedmiso.com/";

// 저장할 위치를 지정
var savepath = "test.html";

// 사용 모듈 정의
var http = require('http');    // HTTP 모듈
var fs = require('fs');          // 파일 처리 관련 모듈

// 출력 지정
var outfile = fs.createWriteStream(savepath);

// 비동기로 URL의 파일 다운로드
http.get(url, function(res) {
    res.pipe(outfile);
    res.on('end', function() {
        outfile.close();
        console.log("ok");
    });
});




02. 이제 커멘드 창에서 아래와 같이 입력하고 실행하면 이런 결과를 얻을 수 있다.




03. test.html 파일이 생성되어 있는것을 확인 할 수 있다.





04. test.html을 실행하면 아래와 같이 사이트가 오픈되면 성공한것이다.









■ 코드 리팩토링



01. 앞서 작성한 프로그램은 그대로 사용하기에 다소 불편한 감이 있다.

    여기서는 함수를 사용해서 재 사용성ㅇ르 높여보자.

 download-node-func.js

// 다운로드
download(
      "http://jpub.tistory.com/539"
    , "spring.html"
    , function() {
        console.log("ok, spring.");
    }
);

download(
      "http://jpub.tistory.com/537"
    , "angular.html"
    , function() {
        console.log("ok, augular.");
    }
);

// url의 파일을 savepath에 다운로드하는 함수
function download(url, savepath, callback) {
   
    var http = require("http");
    var fs = require("fs");
    var outfile = fs.createWriteStream(savepath);
   
    var req = http.get(url, function(res) {
        res.pipe(outfile);
        res.on("end", function() {
            outfile.close();
            callback();
        });
    });
}

※ 다운로드하는 부분을 함수로 감쌌을 뿐이므로 이전과 크게 바뀐 것은 없다.

   Node.js의 코드는 인덴트(들여쓰기)가 깊어지기 쉬워 읽기 쉬운 프로그래밍 언어라고 하기는 어렵다.




02. 실형결과는 다음과 같다.

 > node download-node-func.js





03. 그럼 angular.html 파일과, spring.html 파일 2개가 생성된 모습을 확인 할 수 있다.







  • 2018.08.14 12:18 ADDR 수정/삭제 답글

    비밀댓글입니다