4. 개발환경 구축하기
이번에는 본격적으로 Nokogiri Gem을 이용해보도록 하겠습니다. 앞의 내용이 이론같은 느낌이라 필요없을 거라고 생각하는 사람들도 있겠지만, 저는 개인적으로 무척이나 중요한 개념이라고 생각합니다. Ruby on rails를 구축하는 방법도 가볍게 다루겠지만, 루비온레일즈 튜토리얼이 아니므로 그건 제 블로그(blgo.naver.com/potter777777)나 구글을 참고하시기 바랍니다.
여기서는 노코기리가 무엇인지 그리고 어떻게 설치하고 사용하는지에 대해서 살펴보겠습니다. 참고로 개발 환경은 맥 OS를 기준으로 하겠습니다. 리눅스도 별 차이가 없으므로 UNIX 계열을 사용하고 계신 분들이라면 따라하시면 됩니다.
왜 노코기리(Nokogiri)를 사용하는가?
보통 스크립트 언어마다 파서와 관련된 라이브러리가 존재합니다. Python은 Scrapy, BeautifulSoup 같은 것이 있습니다. 반면에 루비는 Nokogiri를 가장 많이 사용합니다. HTTP 프로토콜 관련해서는 Open-uri나 mechanize 등 여러가지가 있지만 파싱은 결국 노코기리를 사용합니다. Nokogiri 같은 라이브러리는 마크업 언어나 특정 구조를 분석하고 파싱하는데 사용됩니다. 이전에도 언급했지만 원래 이런 식으로 크롤링 하라고 만든 라이브러리는 아닙니다. 자체적으로 루비라는 언어를 설치할 때 함께 깔리는 걸 봤을 때도 컴파일을 할 때나 스트링 관련 문법을 적용할 때에도 활용되고 있습니다.
Nokogiri 공식 Github에 가서 README 파일을 읽어보면 다음과 내용이 쓰여있습니다.
"Nokogiri parses and searches XML/HTML very quickly, and also has correctly implemented CSS3 selector support as well as Xpath 1.0 support." ("노코기리는 XML/HTML 파일을 빠른 속도로 검색 및 파싱할 수 있습니다. 또한 CSS 셀렉터와 Xpath 기능을 지원합니다.")
즉, CSS로 이루어진 HTML 태그들을 잘 분석해서 원하는 내용으로 찾아갈 수 있도록 메소드들이 구성되어있고, 원하는 방식으로 재구성하여 추출 및 수정 활용을 가능하게 해주는 도구라고 생각하시면 됩니다.
Nokogiri Gem 설치
- "http://www.nokogiri.org/tutorials/installing_nokogiri.html"
위 링크는 노코기리 잼에 대한 튜토리얼 사이트입니다. 이 곳에는 libxml2 and libxslt로 설치하는 방법을 가르쳐줍니다. 저는 rvm과 기본 system으로 설치하다가 실패한 경험이 있어서 위 설치방법은 추천하지 않습니다. 하지만 물론 해결 방법은 존재합니다. rvm도 가상 개발환경을 제공한다는 점에서 훌륭한 도구입니다.
대신에 homebrew(rbnev)를 사용해서 잼을 설치하시기 바랍니다.
우선 노코기리 최신 안정 버전을 설치합니다. 아래 명령어를 치면 됩니다. 간단하죠?
$ gem install nokogori
이렇게 노코기리 잼 설치가 끝났습니다.
Rails 개발환경 구축하기
물론 단순히 Ruby 코드(.rb)와 노코기리만으로도 크롤링을 할 수 있습니다. 하지만 우리에게는 MVC 모델 형태로 데이터를 쉽고 단순하게 다룰 수 있도록 도와주는 프레임워크가 있습니다. 서버의 부담면에서 차이가 있지만 우선 그 문제는 넘어가도록 하죠. 그래서 저는 레일즈 프로젝트를 생성하고 데이터베이스에 INSERT 및 COMMIT하는 방법까지 소개하려고 합니다.
$ mkdir workspace
#작업을 할 공간을 만듭니다.
$ cd workspace
#해당 디렉토리로 옮깁니다.
$ rails new scraping_notices
#레일즈 프로젝트를 생성합니다.
$ cd scraping_notices/
#레일즈 프로젝트 디렉토리로 옮깁니다.
$ sublime .
#해당 프로젝트를 서브라임 텍스트로 엽니다.
"sublime ." 이 명령어는 해당 디렉토리를 서브라임 텍스트에서 연다는 의미입니다. 그냥 설치만 하셨다면, 이런 명령어는 사용하기 어려울 겁니다. Path 설정이 필요합니다. 그건 블로그를 참조하거나 구글링 해서 해결하시기 바랍니다. 서브라임을 사용하지 않는다면 그냥 vi . 혹은 notepad로도 작업이 가능합니다. 그럼 코딩할 준비가 되었습니다. 이제 모델을 하나 만들어 보겠습니다. 저는 여기서는 간단하게 Scaffold 기능을 사용하여 빠르게 만들겠습니다. Scaffold(스캐폴딩)에 관한 설명도 따로 블로그나 구글을 참조하시기 바랍니다.
Notice 모델링
저는 이전에 네 가지를 추출한다고 말씀드렸습니다. 제목, 링크주소, 작성자, 작성일
그럼 위와 맞도록 Rails에 Model(notice.rb)을 만들어 보겠습니다.
*notice : title(String), link(String), writer(String), created_on(date)
여기서는 빠른 진행을 위해서 Scaffold를 사용하겠습니다. 되도록이면 스캐폴딩은 급할 때가 아니라면 사용하지 않는 것을 추천합니다. 이걸 생성하는 명령어는 다음과 같습니다.
$ rails generate scaffold notice title:string link:string writer:string created_on:date
#위에 정한 대로 스캐폴딩 기법으로 모델링을 구축합니다.
$ rake db:migrate
#실제로 테이블을 만들어서 위의 스키마(Migration)를 적용시킵니다.
이렇게 모델이 생성되었습니다. 기본적인 틀은 모두 완성되었습니다. 여기서는 Rails 기본 DB인 sQlite를 사용하겠습니다.
잘 따라오셨다면, scarping_notices/db/migrate/에서 다음과 같은 소스 파일을 확인하실 수 있을 겁니다.
class CreateNotices < ActiveRecord::Migration
def change
create_table :notices do |t|
t.string :title
t.string :link
t.string :writer
t.date :created_on
t.timestamps null: false
end
end
end
위에서 t.timestamps 부분은 Rails Scaffold에서 튜플 생성 시간과 수정 시간을 나타내기 위해서 자동으로 생성되는 부분이므로 지우고 진행하셔도 무방합니다. 이렇게 개발 준비가 완료되었습니다. 다음 챕터에서는 노코기리 문법에 대해서 살펴보겠습니다.