[ruby]スクレイピングまとめ[nokogiri]

library

lib
gem install nokogiri
gem install mechanize

require

require
require 'nokogiri'
require 'mechanize'

Classes,Methods

Mechanize
Nokogiri
Ruby Mechanize wiki (ja)

login

login
agent = Mechanize.new
agent.verify_mode = OpenSSL::SSL::VERIFY_NONE

page = agent.get('URL')
page.form_with(:id => 'login_form') do |form|
form['mail(name)'] = mail
form['pass(name)'] = pass
end.click_button

httpsでアクセスする際、agent.verify_modeで証明書の検証方法を指定する必要がある。上記では「証明書を検証しない」を指定。
証明書を指定する方法はこちら(httpsでMechanizeを使う)

formタグの指定

色々な書き方ができる。属性からフックさせる場合、idやactionで引っ掛けても良い。

designation
page = agent.get(URL)
doc = Nokogiri::HTML(page.body)

#Nokogiri
doc.at_css('form')
#Nokogiri
doc.css('form')[0]
#Nokogiri
doc.css('form[name="login"]')

#Mechanize
page.forms[0]
#Mechanize
page.form_with(:name => 'login')

value

value
page = agent.get(URL)
form = page.forms[0]

#field_withで値を入れる場合
form.field_with(:name => 'name').value = str
#name属性を指定して値を入れる場合
form['name'] = str
method type
form_with form
field_with text, password, hidden, textarea
field_button submit, reset, image, button
radiobutton_with radio
checkbox_with checkbox

userAgent

例:iPhone
agent.user_agent_alias = 'iPhone'
  • Linux Firefox
  • Linux Konqueror
  • Linux Mozilla
  • Mac Firefox
  • Mac Mozilla
  • Mac Safari
  • Mac Safari 4
  • Mechanize
  • Windows IE 6
  • Windows IE 7
  • Windows IE 8
  • Windows IE 9
  • Windows Mozilla
  • iPhone
  • iPad

post

post
page = agent.get('URL')
doc = Nokogiri::HTML(page.body)
hash = {}

for input in 0..doc.css("input").length - 1
name = doc.css("input")[input]["name"]
value = doc.css("input")[input]["value"]
hash.store(name, value)
end

page = agent.post("URL", hash)

Nokogiri

html
#HTML
page = agent.get("URL")
doc = Nokogiri::HTML(page.body)

#element
doc.css("title")

#all-elements
doc.css("li")

#first-elements
doc.at_css("li")
doc.css("li")[0]
doc.css("li:nth-child(1)")

#children
doc.css("#parent .child")
doc.css("#parent").css(".child")

#text
doc.at_css("li").text

#attribute
#※明確に1つの要素を指定すること
doc.css("#box").at_css("img")["src"]
doc.css("#box").at_css("a")["href"]

#get
agent.get(src).save_as("directory")

Mechanize

title
page = agent.get("URL")

#all-form
page.forms

#all-link
doc.links

#click
puts doc.links[0].click

#visited_page
agent.visited_page("URL")

#search
doc.link[0].click.search("title")