2009/06/16 10:56
Mechanize gem은 웹사이트로 요청을 보내고, 받은 페이지의 링크를 따라가고, 폼을 제출하는 동작을 간편하게 준다. Mechanize는 Cookie를 저장하고, redirect를 따라가며, 방문한 사이트 목록(history)을 가지고 있다. 웹사이트와 상호작용하는 클라이언트를 만들고 싶은 경우 mechanize는 좋은 선택이 될 것이다.
간단한 사용법은 다음과 같다.
- require 'rubygems'
- require 'mechanize'
- 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의 Guilde와 Exampe 페이지를 읽어 보면 더 좋은 이해를 할 수 있다.
조금 더 자세히 알아보자.
페이지 가져오기
- page = agent.get(“http://www.site.com”)
혹은 header와 referer 같은 것들을 설정하고 싶다면,
- page = agent.get({:url => url, :params => params, :referer => referer, :headers => headers})
가져온 페이지의 content_type이 html일 경우에 page는 WWW::Mechanize::Page 객체이다. 이 Page 객체는 기본으로 nokogiri parser를 사용한다. 그래서 다음과 같이 css로 element를 선택할 수 있다.
- page.search(“#element_id”)
다른 parser를 사용하고 싶다면
- WWW::Mechanize.html_parser = Hpricot
form 제출하기
페이지의 모든 form은 다음과 같이 확인할 수 있다.
- page.forms
form의 제출은 다음과 같다.
- page.form_with(:name => “login”) do |form|
- form.action = “http://www.site.com/login”
- form.login = “id”
- form.passwd = “pass”
- end.submit
link, frame 따라가기
page의 link 목록은 다음과 같이 따라갈 수 있다.
- page.link_with(:text => “follow”).click
iframe이 사용되고 있는 경우 다음과 같이 iframe을 열 수 있다.
- page = page.iframes.first.click
파일의 저장
이미지 파일을 저장하고 싶으면
- file = agent.get("http://www.site.com/image/1.JPG")
page.save_as("image.jpg")
마지막으로 구글에서 이미지 검색을 한 후 이미지들을 저장하는 코드는 다음과 같다.
- 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 |