読者です 読者をやめる 読者になる 読者になる

ほろ酔い開発日誌

有意義な技術的Tipsを共有出来たら嬉しいです。Ruby、Railsが好きです。Web開発全般(Rails多め、フロント、サーバー、インフラ)、データ分析、機械学習あたりの記事が中心になる予定です。

Ruby HTMLとXMLをスクレイピング

Ruby

HTMLとXMLRubyの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

以前書きました以下記事がもう少し詳しいので参照下さい。

Rails スクレイピング手法 Mechanizeの使い方

ただし、これでだけではスクレイピング出来ないことがあります。それは、クローラやボットがサイト内を走査することが出来ないようになっているサイトがあるからです。そのようなときは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 スクレイピング

次に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認証やユーザーログインの必要なサイトでもスクレイピングは可能なので必要なときは調べてみるとよいでしょう。