BLOG main image
분류 전체보기 (239)
Rails (65)
Ruby (34)
이야기 (40)
스토리큐 (61)
그 밖에.. (30)
C# (6)
작은아이의 생각
agiletalk's me2DAY
[rails] Growl4Rails
美소년 ㅇㅅㅇ씨의 一日
마사키군의 생각
ayukawa's me2DAY
작은아이의 생각
agiletalk's me2DAY
[Google App Engine] 나의 첫번..
머드초보의 블로그
53,979 Visitors up to today!
Today 43 hit, Yesterday 58 hit

 SUBSCRIBE

2009/06/16 10:56

Mechanize gem은 웹사이트로 요청을 보내고, 받은 페이지의 링크를 따라가고, 폼을 제출하는 동작을 간편하게 준다. Mechanize는 Cookie를 저장하고, redirect를 따라가며, 방문한 사이트 목록(history)을 가지고 있다. 웹사이트와 상호작용하는 클라이언트를 만들고 싶은 경우 mechanize는 좋은 선택이 될 것이다.

간단한 사용법은 다음과 같다.

  1. require 'rubygems'
  2. require 'mechanize'
  3. WWW::Mechanize.new do |agent|
      agent.user_agent_alias = 'Windows IE 7'
      page = agent.get("http://www.google.com")
      page = page.form_with(:name => 'f') do |form|
        form.q = "cat"
      end.submit
      page.search("a.l").each do |ele|
        p ele.content
      end
    end

Mechanize의 GuildeExampe 페이지를 읽어 보면 더 좋은 이해를 할 수 있다.

조금 더 자세히 알아보자.

페이지 가져오기
  1. page = agent.get(“http://www.site.com”)

혹은 header와 referer 같은 것들을 설정하고 싶다면,

  1. page = agent.get({:url => url, :params => params, :referer => referer, :headers => headers})

가져온 페이지의 content_type이 html일 경우에 page는 WWW::Mechanize::Page 객체이다. 이 Page 객체는 기본으로 nokogiri parser를 사용한다. 그래서 다음과 같이 css로 element를 선택할 수 있다.

  1. page.search(“#element_id”)

다른 parser를 사용하고 싶다면

  1. WWW::Mechanize.html_parser = Hpricot
form 제출하기

페이지의 모든 form은 다음과 같이 확인할 수 있다.

  1. page.forms

form의 제출은 다음과 같다.

  1. page.form_with(:name => “login”) do |form|
  2.   form.action = “http://www.site.com/login”
  3.   form.login = “id”
  4.   form.passwd = “pass”
  5. end.submit
link, frame 따라가기

page의 link 목록은 다음과 같이 따라갈 수 있다.

  1. page.link_with(:text => “follow”).click

iframe이 사용되고 있는 경우 다음과 같이 iframe을 열 수 있다.

  1. page = page.iframes.first.click
파일의 저장

이미지 파일을 저장하고 싶으면

  1. file = agent.get("http://www.site.com/image/1.JPG")
    page.save_as("image.jpg")

마지막으로 구글에서 이미지 검색을 한 후 이미지들을 저장하는 코드는 다음과 같다.

  1. WWW::Mechanize.new do |agent|
      agent.user_agent_alias = 'Windows IE 7'
      page = agent.get("http://images.google.co.kr/imghp")
      page = page.form_with('f') do |form|
        form.q = 'cat'
      end.submit
      page.links.each do |l|
        next unless l.href =~ /imgurl=(.+?&)/
        url = $1.chop
        agent.get(url).save_as(File.basename(url))
      end
    end

'Ruby' 카테고리의 다른 글

[Ruby] Gem 만들기  (0) 2009/06/16
[ruby] sms_client gem  (0) 2009/06/16
[Ruby] mechanize gem을 이용해 웹사이트와 통신하기  (0) 2009/06/16
[ruby] RDOC 을 위한 주석 달기  (0) 2009/02/23
[Ruby] block expressions, 그리고 code block  (0) 2008/08/12
[Ruby] or 와 || 의 차이  (0) 2008/08/12