HTMLとXMLをRubyのgem「Mechanize」を使ってスクレイピングを行う手法を簡単にまとめておきます。 まず、
gem 'mechanize'
これでgemの準備done。
HTMLスクレイピング
agent = Mechanize.new page = agent.get("http://hoge.com") # スクレイピングしたいページのURL sections = page.search(".section") # seachメソッドで該当するオブジェクトを配列として取得 sections.each do |section| # atメソッドは該当するオブジェクトのはじめのひとつだけを取得 # inner_textメソッドはタグで囲まれた文字列の取得 puts section.at(".title").inner_text # get_attributeメソッドは指定した属性の値を取得 puts section.at("a").get_attribute("href") puts section.at(".description").inner_text end
以前書きました以下記事がもう少し詳しいので参照下さい。
ただし、これでだけではスクレイピング出来ないことがあります。それは、クローラやボットがサイト内を走査することが出来ないようになっているサイトがあるからです。そのようなときはUser-Agentを偽装することで対応出来ます。User-Agentとはクライアントの情報で「私はsafariです」とか「私はiPhoneです」といったような情報が入っています。
botを走査させないためには robots.txt
というファイルをサイト内に置けばいいのですが、実はこの対策をしたからといってクローラーやボットが来ないかというとそういうことではありません。そのため、「私はクローラーです」とは名乗らずに「私はsafariです」と偽名を使えばいいわけです。これをUser-Agentの偽装といいます。
ちなみに偽装と聞くと犯罪みたいですが違法ではありません。
さて、User-Agentを偽装してみましょう。
agent = Mechanize.new agent.user_agent_alias = "Mac Safari" # これを足すだけ page = agent.get("http://hoge.com") sections = page.search(".section") sections.each do |section| puts section.at(".title").inner_text puts section.at("a").get_attribute("href") puts section.at(".description").inner_text end
やることは実は簡単で1行付け足すだけです。
ちなみに
agent.user_agent_alias = "iPhone"
とするとスマホ版のhtml構造で返ってくることも知っておくとためになるかもしれません。
XML スクレイピング
file = open("http://hoge.com", "User-Agent" => "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0") xml = Nokogiri::XML(file) entrys = xml.search("entry") entrys.each do |entry| puts entry.at("title").inner_text puts entry.at("link").inner_text puts entry.at("description").inner_text end
はじめの2行がHTMLスクレイピングと違います。Nokogiriを使っていますがMechanizeをインストールしているので使えるようになっています。(Mechanizeがnokogiriをベースにしている)
XMLでもUser-Agentを偽装していますが、しなくても良い場合も多いです。 その他はHTMLでやったことと同じ感覚で出来ます。
以上、スクレイピングの簡単な使い方でした。これだけ知るだけでも大分出来ると思います。Basic認証やユーザーログインの必要なサイトでもスクレイピングは可能なので必要なときは調べてみるとよいでしょう。