'2013/01'에 해당되는 글 3건

  1. 2013.01.13 [번역] Web Scraping in Node.js
  2. 2013.01.09 [번역] Getting to Know Node
  3. 2013.01.04 [번역] Making HTTP Requests in Node.js


[번역] Web Scraping in Node.js, #Haroopress


 sitepoint의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js
  4. [번역] Cloud Deployment of Node.js Applications with Nodejitsu
  5. [번역] Accessing the File System in Node.js
  6. [번역] Making HTTP Requests in Node.js
  7. [번역] Getting to Know Node

 원문 sitepoint.com의 Web Scraping in Node.js

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Web Scraping in Node.js

웹 스크랩퍼는 프로그래밍된 계획에 따라 웹페이지에 방문하여 데이터를 추출하는 소프트웨어의 일부이다. 웹 스크래핑은 콘텐츠 복제라는 이슈때문에 논란이 많은 주제중 하나이다. 대신에 대부분의 웹사이트 소유자들은 공개된 API를 통해 자신의 데이터에 접근하는 방법을 선호한다. 불행하게도 많은 사이트들은 부실한 API를 제공하거나 그마저도 제공하지 않는다. 이것이 많은 개발자들을 웹 스크래핑에 의지하게 만들었다. 이번 글에서는 Node.js로 여러분들 자신만의 웹 스크래퍼를 구현하는 방법에 대해 알려줄 것이다.

웹 스크래핑의 첫번째 단계는 리모트 서버로부터 소스코드를 다운로드하는 것이다. request 모듈을 사용하여 페이지를 다운로드하는 방법은 “Making HTTP Requests in Node.js”에서 배웠었다. 다음 예제는 Node.js에서 GET 요청 시 빠르게 리프레쉬하게 한다.

var request = require("request");
request({
  uri: "http://www.sitepoint.com",
}, function(error, response, body) {
  console.log(body);
});

웹 스크래핑의 두번째 단계는 다소 어려운데 그것은 다운로드한 소스코드에서 데이터를 추출하는 것이다. 클라이언트 측에서는 선택자 APIjQuery같은 라이브러리를 사용하면 별것 아닌 일지만, 아쉽게도 이러한 해결책은 DOM에 쿼리가 가능하다는 사실을 전제로 하고 있다. 안타깝지만 Node.js는 DOM을 제공하지 않는다. 혹시 제공을 하는지?

The Cheerio Module

Node.js가 DOM에 대한 모듈을 내장하고 있지는 않지만, HTML 소스코드의 문자열로부터 DOM을 만들수 있는 여러 모듈이 있다. 그 중 많이 사용하는 두개의 DOM 모듈이 있는데 cheerio와 jsdom이다. 이번 글에서는 cheerio에 중점을 둘 것이며 다음 명령으로 모듈을 설치할 수 있다.

npm install cheerio

cheerio 모듈은 jQuery의 서브셋(하위집합)을 구현한다. 이것은 많은 개발자들이 빠르게 익힐수 있다는 것을 의미한다. 사실 cheerio는 jQuery랑 비슷해서 cheerio에 구현되어 있지 않은 jQuery 함수를 사용하려고 하는 자신을 쉽게 볼 수 있다.

다음 예제는 cheerio를 사용해서 HTML 문자열을 파싱하는 법을 보여준다. 첫번째 라인에서 cheerio 모듈을 프로그램에 임포트한다.html 변수는 파싱해야할 HTML의 일부분을 가지고 있다. 3 라인에서 그 HTML은 cheerio 모듈을 사용해서 파싱된다. 그 결과를 $ 변수에 할당한다. 달러 표시는 jQuery에서 전통적으로 사용되기 때문에 선택했다. 4 라인에서 CSS 스타일의 선택자를 사용해서 <ul> 요소를 선택한다. 마지막으로 html() 메소드를 사용해서 list의 내부 HTML을 출력했다.

var cheerio = require("cheerio");
var html = "<ul><li>foo</li><li>bar</li></ul>";
var $ = cheerio.load(html);
var list = $("ul");
console.log(list.html());

Limitations

cheerio는 활발히 개발중에 있고 항상 더 나아지고 있다. 하지만, 여전히 많은 제한사항을 가지고 있다. cheerio의 가장 불만스러운 점은 HTML 파서이다. HTML 파싱은 어려운 문제이고 잘못된 HTML을 포함한 많은 페이지가 있다. cheerio 모듈이 이러한 페이지들에서 충돌이 발생하지는 않더라도 여러분은 요소를 선택할 수 없게 될지도 모른다. 이것은 버그가 선택자에서 발생하는 것인지 아니면 페이지 자체에서 발생하는 것인지 결정하기 어렵게 만들수 있다.

Scraping sitepoint

다음은 완벽한 웹 스크랩퍼를 만들기 위해 request와 cheerio 모듈을 결합한 예제이다. 예제의 스크랩퍼는 sitepoint 홈페이지에 있는 모든 글들의 제목과 URL을 추출한다. 처음 두개의 라인에서 필요한 모듈을 임포트한다. 3 라인부터 5 라인까지 sitepoint 홈페이지의 소스코드를 다운로드한다. 그리고 나서 파싱을 하기 위해 소스를 cheerio 모듈에 전달했다.

var request = require("request");
var cheerio = require("cheerio");
request({
  uri: "http://www.sitepoint.com",
}, function(error, response, body) {
  var $ = cheerio.load(body);
  $(".entry-title > a").each(function() {
    var link = $(this);
    var text = link.text();
    var href = link.attr("href");
    console.log(text + " -> " + href);
  });
});

sitepoint의 소스코드를 보면 모든 글의 제목이 entry-title라는 클래스를 가진 <h1> 요소에 포함된 링크라는 것을 주의해야 할 것이다. 7 라인의 선택자는 모든 글의 링크를 선택한다. 그 다음 each() 함수는 모든 글들을 대상으로 반복하기 위해 사용된다. 마지막으로, 글 제목과 URL은 각각 링크의 텍스트와 href 속성으로부터 얻는다.

Conclusion

이번 글은 Node.js로 간단한 웹 스크래핑 프로그램을 만드는 법을 보여줬다. 이런 방법이 웹 페이지를 스크래핑하는 유일한 방법은 아니다. headless 브라우저(역자주-Graphical User Interface가 없는 웹브라우저)를 사용하는 것과 같은 다른 기술들도 있다. 더 강력하지만, 단순함 및(또는) 속도와 타협을 하게 될지 모른다. 다음 글은 headless 브라우저 모듈 PhantomJS에 대해 중점을 두어 다룰 것이다.

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js


[번역] Getting to Know Node, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js
  4. [번역] Cloud Deployment of Node.js Applications with Nodejitsu
  5. [번역] Accessing the File System in Node.js
  6. [번역] Making HTTP Requests in Node.js

 원문 sitepoint.com의 Getting to Know Node

 이번 글은 내용이 인포그래픽으로 되어 있어 이미지에 마우스 오버시 번역을 보여주고 있다.

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Getting to Know Node

사람들은 흔히 하나의 그림이 수천 단어의 가치가 있다고 이야기 한다. 그래서 우리는 여러분을 위해 약 만개 정도 단어의 가치가 있는 그림을 준비했다. 이 글은 Node.js의 개요에 대해서 인포그래픽 스타일로 보여준다. 이 인포그래픽은 Node가 무엇인지 설명하고 서버측 JavaScript 프레임워크가 정확하게 얼마나 인기가 있는지를 보여준다. 만약 여러분이 아직 Node에 열광하지 않고 있다면 거부할 수 없는 이유를 알려줄 것이다.

 

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, node.js


[번역] Making HTTP Requests in Node.js, #Haroopress


 sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js
  3. [번역] HTTP Authentication in Node.js
  4. [번역] Cloud Deployment of Node.js Applications with Nodejitsu
  5. [번역] Accessing the File System in Node.js

 원문 sitepoint.com의 Making HTTP Requests in Node.js

 오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Making HTTP Requests in Node.js

이전의 글에서 Node.js 서버를 만드는 것에 초점을 둔것은 HTTP 요청을 처리하기 위해서였다. 이번 글은 문제를 반대로 생각해서 당신의 Node.js 애플리케이션이 HTTP 요청을 어떻게 만들어 내는지를 보여줄 것이다. 아마 왜 그렇게 해야 하는지 의문이 들지도 모른다. 문득 떠오르는 애플리케이션이 두개 있다 - web scraping과 proxying. 스크래퍼는 웹페이지를 다운로드하고 계획에 따라 그것으로부터 정보를 추출하는 소프트웨어이다. 프록시 서버는 다른 서버에게 클라이언트의 요청을 전달하고 응답을 반환해주는 중개인과 같은 역할을 한다.

The Request Module

Node.js에서 HTTP 요청을 만드는 가장 간단한 방법은 request 모듈을 사용하는 것이다. Mikeal Rogers가 만든 request 모듈은 GET,POSTPUT, 그리고 DELETE를 포함한 모든 유형의 HTTP 요청을 만들게 해준다. 그러한 유연성이 request 모듈을 RESTful APIs로 상호작용하기에 적합하게 만든다. 다음의 npm 명령을 사용해서 request 모듈을 설치할 수 있다.

$ npm install request

request가 설치되었다면 아래 보이는 코드로 새로운 Node.js 파일을 만들어보자. 예제의 첫번째 라인에서 request 모듈을 프로그램 안으로 임포트하였다. HTTP 요청을 만드는 것은 간단하게 request() 함수를 호출하면 된다. 이 예제에서 우리는 sitepoint 홈페이지를 다운로드하기 위해 요청을 하고 있다. 물론, request()의 두번째 인자는 콜백 함수이다.

var request = require("request");
request("http://www.sitepoint.com", function(error, response, body) {
  console.log(body);
});

request()의 콜백 함수는 세개의 인자를 받는다 - errorresponse, 그리고 body. 이름을 보면 알수 있듯이 error는 HTTP 요청 중 발생하는 모든 문제에 관한 정보를 포함하고 있다. response 인자는 호출에 대해 반환되는 상태코드, 헤더 등 많은 것들을 포함한 다양한 데이터를 가지고 있는 객체이다. 세번째 인자인 body는 응답의 body이다. 앞의 예제에서 body는 sitepoint 홈페이지의 소스 코드를 포함하고 있다.

request 모듈은 HTTP 요청을 파일로 그리고 파일로부터 스트림하기 위해 파일 시스템 모듈과 결합을 할수도 있다. 다음 예제도 sitepoint 홈페이지를 가져 오는 것이다. 하지만, 콘솔에 소스코드를 보여주는 대신에 “sitepoint.htm”이라는 파일로 저장한다.

var request = require("request");
var fs = require("fs");
request("http://www.sitepoint.com").pipe(fs.createWriteStream("sitepoint.htm"));

Parameterizing Requests

앞의 예제들은 URL에 대해 간단한 GET 요청을 만들고 있다. 하지만 우리는 request()의 첫번째 인자로 설정 객체를 전달함으로써 HTTP 요청을 수정할 수 있다. 아래 예제 역시 sitepoint 홈페이지를 다운로드하는 것이지만 더 강력한 구문을 사용하고 있다. 숫자형의 설정 파라미터에 주의해야 하며 uri와 method 파라미터는 sitepoint에 GET 요청을 보내라고 request에게 알려준다.

var request = require("request");
request({
  uri: "http://www.sitepoint.com",
  method: "GET",
  timeout: 10000,
  followRedirect: true,
  maxRedirects: 10
}, function(error, response, body) {
  console.log(body);
});

timeout 파라미터는 응답을 포기하기전에 10,000 밀리초(10초)동안 기다리라고 request에게 알려주는 것이며, 마지막 두개의 파라미터는 리다이렉션 처리를 해준다. 많은 페이지들이 사용자가 인식하지 못하는 사이에 보이지 않게 리다이렉션을 수행한다. followRedirectmaxRedirects 파라미터는 3xx HTTP 리다이렉션을 최대 10개까지 처리하라고 request에게 알려준다. 또한, request()는 여기에서 보여주지 않은 다른 많은 파라미터들을 지원한다.

Submitting Form Data

앞에서 언급했듯이 request는 GET 요청뿐만 아니라 더 많은 것을 지원한다. 아주 일반적인것 중 하나가 POST 요청을 사용하여 폼 데이터를 제출하는 것이다. 다음 예제는 POST의 한 부분으로 사용자의 이름을 전송하기 위해서 request()의 form 파라미터를 사용한다. 그러면 PHP 페이지가 사용자에게 응답을 하는데 전송한 이름으로 인사 메시지를 보여줄 것이다.

var request = require("request");
request({
  uri: "http://www.cjihrig.com/development/php/hello_form.php",
  method: "POST",
  form: {
    name: "Bob"
  }
}, function(error, response, body) {
  console.log(body);
});

Dealing with Cookies

많은 사이트들이 쿠키를 사용해서 사용자와의 다양한 상호작용을 추적한다. 쿠키는 모든 HTTP 전송간에 클라이언트와 서버 사이에서 왔다 갔다 전송되는 작은 데이터 조각들이다. 쿠키의 사용을 용이하게 하기 위해서 request는 jar()와 cookie() 메서드를 제공한다. 다음 예제의 3 라인을 보면 사용자의 이름을 명시한 쿠키를 생성했다. 그 다음 2 라인에서 생성한 cookie jar에 그 쿠키를 추가했다. HTTP 요청을 만들때 jar 파라미터는 서버에 cookie jar를 전송하기 위해 사용된다.

var request = require("request");
var jar = request.jar();
var cookie = request.cookie("name=John");
jar.add(cookie);
request({
  uri: "http://www.cjihrig.com/development/php/hello_cookies.php",
  method: "GET",
  jar: jar
}, function(error, response, body) {
  console.log(body);
});

응답을 받게 될 때 사용자는 쿠키에 저장되어 있던 이름인 John으로 인사 메시지를 받을 것이다. cookie jar는 또한 서버에 의한 어떤 변화에도 업데이트가 된다. 요청을 보내기 전과 후에 cookie jar를 출력해 보면, 서버가 쿠키의 값을 “John”에서 “Stranger”로 변경한 것을 알 수 있다. 사이트와 사용자간에 실제 상호작용을 묘사하기 위해서 같은 cookie jar를 HTTP 요청에 연속으로 보낼수 있다.

Conclusion

이번 글에서는 간단하지만 강력한 request 모듈에 대해서 소개를 했다. 이번 글이 포괄적이지는 않기 때문에 request가 할 수 있는 다른 것들을 알아보기 위해서는 최소한의 문서들을 검색해봐야 할 것이다. 곧 나올 글에서 request를 더 심도있게 사용한 웹 스크래핑에 대해서 다룰 계획이니 계속 지켜봐 주길 바란다.

저작자 표시 비영리 변경 금지
신고
Posted by JuHoi
TAG node, nodejs