Node.js에서 크롤링 중에 숨겨진 엘리먼트를 가져오고 싶습니다.


var http = require('http');
var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var iconv = require('iconv-lite');
iconv.skipDecodeWarning = true;  //Warning 출력 생략

var options = {
    uri: 'http://cy.cyworld.com/home/ALG5LB24',
    headers: {
        'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; IPMS/A640400A-14D460801A1-000000426571; TCO_20110131100426; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; Tablet PC 2.0)'   
    },
    encoding: 'binary' 있어서
};

request(options, function (err, response, body) {
        var decode_url = iconv.decode(body, 'utf-8');
        var $ = cheerio.load(decode_url);

  console.log(decode_url);  
});

위에 있는 소스는 cheerio 모듈을 이용해서 URL을 긁어와서 콘솔창에 띄우는 소스입니다. 그런데 다른 사이트들은 모든 성분들이 다 긁어와져서 내부 엘리먼트에 접근이 가능한데, 이상하게 싸이월드만 몇가지 div 클래스들이 안긁혀지네요.. (정확히는 div가 긁어지긴하는데 그 안에 내부 성분이 안긁어집니다 ex) 긁어온 url에서 postArea라는 div 클래스에 접근해서 접근한 div 클래스만 출력해보면 안에 성분은 많은데 이렇게만 뜹니다.. )

아마 제 생각으로는 싸이월드 쪽에서 막아놓은 것 같은데 다른 라이브러리를 사용해서 해결을 해야 할까요?

  • 2016년 03월 30일에 작성됨

조회수 636


2 답변


좋아요
9
싫어요
채택취소하기

div#postArea 앨리먼트의 내부 컨텐츠는 클라이언트(브라우저)에서 JavaScript를 통해 동적으로 생성되는 DOM content로 보입니다. 일차적으로 HTTP를 통해 넘어오는 HTML은 <div id="postArea"></div> 이렇게 빈 컨테이너 형태로 넘어오기 때문에 내부 엘리먼트에 접근이 안되십니다.

실제 load 하신 URL의 div#postArea 코드 snippet

해결 방안으론, PhantomJS (http://phantomjs.org) 같이 서버에서 JavaScript를 실행 및 렌더하는 라이브러리를 사용하시면 될 거 같습니다.


  • 방법를 못찾고 있었는데 감사합니다 phantomJS로 해보겠습니다 ^^*    wooseok2   2016.3.31 13:48     
  • 와 해결했습니다 감사합니다!    wooseok2   2016.3.31 14:44     
  • 와 해결 하셨다니 저도 기쁘네요! 소식 알려주셔서 감사합니다!    김현일 (Kevin Kim)   2016.3.31 17:07     
  • 감사합니다 좋은 하루 되세요~~!    wooseok2   2016.4.6 12:43     

기본 템플릿에서 postArea는 빈 내용으로 되어있는 것 같네요.

아마도. 기본 템플릿을 로딩한 후에, 자바스크립트(웹브라우저)를 통해서 postArea에 렌더링될 내용을 가져오는 방식으로 동작하는 것 같습니다.

알려주신 페이지에서 요청을 확인해보면, 다음의 요청 패턴이 postArea의 내용을 가져오는 부분인 것 같네요.

http://cy.cyworld.com/home/ALG5LB24/postlist?startdate=&enddate=&folderid=&tagname=&_=1459310094342

  • 2016년 03월 30일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

  • 감사합니다 무슨 말씀이신지 이해했습니다    wooseok2   2016.3.31 13:47     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close