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

#Mechanize
Mechanizeはスクレイピングを行うためのgemです。

##gemの追加

gemファイルに下記を追記して、```bundle install```

```
gem 'mechanize'
```

##インスタンスの生成とgetメソッド

まず、Mechanizeクラスのインスタンスを生成し、getメソッドを用いてスクレイピングするウェブサイトのHTML情報を取得します。

```rb
agent = Mechanize.new
page = agent.get("http://hoge.com")
```

pageはMechanize::Pageオブジェクトです。

##任意の情報を抜き出す
###searchメソッド

cssで指定するのと同じ要領で要素を指定出来る。

```rb
agent = Mechanize.new
page = agent.get("http://qiita.com")
elements = page.search('title')
```

```
puts elements
```

```
<title>Qiita - A technical knowledge sharing platform for programmers.</title>
```


複数該当するものがあれば全て取ってきます。「title」はひとつしかありませんでしたが。「li a」は複数存在します。

```rb
agent = Mechanize.new
page = agent.get("http://qiita.com")
elements = page.search('li a')
```

```
puts elements
```

```
<a class="footer_copyright" href="http://increments.co.jp">© 2015 Increments Inc.</a>
<a href="https://qiita.com/terms">Terms</a>
<a href="https://qiita.com/privacy">Privacy</a>
<a href="http://help.qiita.com">Help</a>
<a href="https://increments.zendesk.com/anonymous_requests/new">Contact</a>
<a href="https://qiita.com/about">About</a>
<a href="http://blog.qiita.com">Blog</a>
<a href="https://qiita.com/api/v2/docs">API</a>
<a href="https://teams.qiita.com/">Team</a>
<a href="http://kobito.qiita.com">Kobito</a>
<a href="http://career.qiita.com">Career</a>
<a class="js-public-form-feedback-link" data-target=".js-feedback-form" data-toggle="modal" href=""><i class="fa fa-heart"></i> Feedback <i class="fa fa-caret-down"></i></a>
```

###atメソッド
searchメソッドは該当要素全てを取得するのに対して、atメソッドは該当1件のみを取得します。

```rb
agent = Mechanize.new
page = agent.get("http://qiita.com")
elements = page.at('li a')
```

```
puts elements
```

```
<a class="footer_copyright" href="http://increments.co.jp">© 2015 Increments Inc.</a>
```

###inner_textメソッド
searchメソッド、atメソッドはタグも含めて取り出します。
inner_textメソッドでタグの中身のメソッドだけ取り出します。

```rb
agent = Mechanize.new
page = agent.get("http://qiita.com")
elements = page.search('li a')

elements.each do |ele|
  puts ele.inner_text
end
```

```
© 2015 Increments Inc.
Terms
Privacy
Help
Contact
About
Blog
API
Team
Kobito
Career
 Feedback
```

seachメソッドは複数の要素の情報を取得するので、eachを使うことに注意です。

###get_attributeメソッド
aタグの中のhref属性の値を取り出すなど、タグの属性値を取得するときに使うのがget_attributeメソッドです。

```rb
agent = Mechanize.new
page = agent.get("http://qiita.com")
elements = page.search('li a')

elements.each do |ele|
  puts ele.get_attribute(:href)
end
```

```
http://increments.co.jp
https://qiita.com/terms
https://qiita.com/privacy
http://help.qiita.com
https://increments.zendesk.com/anonymous_requests/new
https://qiita.com/about
http://blog.qiita.com
https://qiita.com/api/v2/docs
https://teams.qiita.com/
http://kobito.qiita.com
http://career.qiita.com
```

なお、get_attributeメソッドは省略して書けて

```ele.attribute(:href)``` は ```ele[:href]```と書けます。


##参考
[楽々スクレイピング! Ruby Mechanizeの使い方](http://www.xmisao.com/2013/10/05/ruby-www-mechanize.html)
[楽々スクレイピング! Ruby Mechanizeの使い方(2)](http://www.xmisao.com/2014/04/02/ruby-www-mechanize-2.html)

##関連URL
[Ruby MechanizeでBASIC認証する](http://www.xmisao.com/2013/10/11/ruby-mechanize-basic-auth.html)
[mechanizeの基本的な使い方 -フォーム処理とHTMLの解析-](http://blog.livedoor.jp/sasata299/archives/51393413.html)