Node.js에서 크롤링 중에 숨겨진 엘리먼트를 가져오고 싶습니다.
조회수 3951회
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 클래스만 출력해보면 안에 성분은 많은데 이렇게만 뜹니다.. )
아마 제 생각으로는 싸이월드 쪽에서 막아놓은 것 같은데 다른 라이브러리를 사용해서 해결을 해야 할까요?
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
div#postArea
앨리먼트의 내부 컨텐츠는 클라이언트(브라우저)에서 JavaScript를 통해 동적으로 생성되는 DOM content로 보입니다. 일차적으로 HTTP를 통해 넘어오는 HTML은<div id="postArea"></div>
이렇게 빈 컨테이너 형태로 넘어오기 때문에 내부 엘리먼트에 접근이 안되십니다.해결 방안으론, PhantomJS (http://phantomjs.org) 같이 서버에서 JavaScript를 실행 및 렌더하는 라이브러리를 사용하시면 될 거 같습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
- 방법를 못찾고 있었는데 감사합니다 phantomJS로 해보겠습니다 ^^* 알 수 없는 사용자 2016.3.31 13:48
- 와 해결했습니다 감사합니다! 알 수 없는 사용자 2016.3.31 14:44
- 와 해결 하셨다니 저도 기쁘네요! 소식 알려주셔서 감사합니다! 알 수 없는 사용자 2016.3.31 17:07
- 감사합니다 좋은 하루 되세요~~! 알 수 없는 사용자 2016.4.6 12:43
-
-
기본 템플릿에서 postArea는 빈 내용으로 되어있는 것 같네요.
아마도. 기본 템플릿을 로딩한 후에, 자바스크립트(웹브라우저)를 통해서 postArea에 렌더링될 내용을 가져오는 방식으로 동작하는 것 같습니다.
알려주신 페이지에서 요청을 확인해보면, 다음의 요청 패턴이 postArea의 내용을 가져오는 부분인 것 같네요.
http://cy.cyworld.com/home/ALG5LB24/postlist?startdate=&enddate=&folderid=&tagname=&_=1459310094342
댓글 입력