Frameworks/Node.js

[Node.js 강좌] 13. 웹 스크래핑 - Cheerio 모듈

양디 2016. 2. 2. 20:43


웹 스크래핑이란 ?


웹 스크래핑은 웹페이지의 정보를 프로그램을 통해서 가져오는 것을 뜻한다.


우리가 신문을 스크랩 하듯이, 웹페이지를 스크랩 해서 정보를 저장하는 것이 가능하다.


그러나 비정상적인 접근으로 금지하는 경우도 있으니 조심해야 할 것 !


오늘 사용할 모듈은 2가지인데, Request와 Cheerio 이다.


Request 모듈은 Node.js 내장 모듈로, 인터넷에 요청을 보내고, 요청에 해당하는 페이지를 가져온다.


Cheerio 모듈은 그 받아온 페이지를 파싱하여 전체 페이지 중에서 필요한 부분의 정보만을 가져올 수 있다.


Cheerio의 장점은, jQuery 문법을 그대로 사용할 수 있다는 것이다. 따로 공부할 문법이 없이, 그냥 jquery 선택자를 이용해서 쉽게 사용할 수 있다.

(jquery를 모른다면 공부해야겠지만..)


Request 모듈


Request 모듈에서 꼭 알아야 할 것은 3가지이다.


Post, Get, Jar의 3가지이다.


Jar는 쿠키를 저장하는 것이다. 로그인을 해서 정보를 가져와야 하는 필요성이 있을 때 사용하면 된다.


HTTP 통신을 안다면 이미 알고 있을지도 모르겠다.


Request는 PostGet을 지원한다. 


우리가 인터넷 페이지를 사용할 때에 인터넷 주소를 입력하는것이 get이다.


그리고 우리가 로그인 등 입력창에 값을 넣고 데이터를 보내는 것이 post 이다.


두개를 구분하기 가장 쉬운 방법은, 인터넷 주소창에 보내는 정보가 뜨는지 안뜨는지를 알아보면 된다.




위의 사진을 보면, search? 표시가 있고 뒤에 내용이 쭈욱 있다.


이렇게 내가 입력했던, 혹은 페이지에 저장되어 있던 정보들이 주소창에 뜨는 방식이 Get 이다.


반면에 post 방식은 주소창에 뜨지 않는다. 따라서 로그인처럼 정보를 숨기는 곳에 주로 이용된다.


Request 정식 홈페이지


1
2
3
4
5
6
var request = require('request');
 
request.get({url: 'http://www.tistory.com'}, function(err, response, body){
  console.log(body);
})
 
cs


위의 코드를 작성하고, 실행하면 tistory 홈페이지의 body를 전부 출력해준다.





위의 콘솔창은 request를 출력하는 것이고, 아래 사진은 실제 tistory의 소스를 확인한 것이다.


똑같은 내용을 담고 있다는 것을 볼 수 있다.


그러나 이러한 정보는 사람이 보기엔 적절하지 않다. 그래서 필요한 것이 cheerio 모듈이다.



Cheerio 모듈


이 모듈은 위의 내용중에서 자신이 원하는 정보만을 가져올 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
var request = require('request');
var cheerio = require('cheerio');
 
request.get({url: 'http://www.tistory.com'}, function(err, response, body){
  var $ = cheerio.load(body);
 
  var arr = $('.tistory_recomm').children('.recomm_blog').children('.tit_subject');
  for(var i=0;i<arr.prevObject.length;i++){
  console.log(arr.prevObject[i].children[0].next.children[3].children[0].data);
  }
})
 
cs


조잡한 코드가 안타깝다..


보면 cheerio를 불러오고, $에 cheerio.load를 한다.


그 이후에 7번 코드처럼 jquery 문법을 사용하여 선택한 뒤에


해당 오브젝트의 내용을 출력하는 방식이다.


위의 경우에는 여러가지 내용을 담고 있는 어레이를 받았기 때문에 위와 같은 식으로 출력하지만


어레이가 아닌 경우는 그냥 선택자.text() 함수로 바로 출력할수도 있다.


위를 출력하면 다음과 같은 화면이 뜬다.




현재 tistory의 메인화면에 뜬 추천 포스트들을 긁어온 것이다.


사용 방법은 무궁 무진하지만, 악용하지는 않기를 !





댓글