Anemone(Ruby)の使い方 - Rubyでクローラーを作る -

# Anemone

指定したドメインのリンク先を読み込み、URLを取得するサンプル。

```rb:anemone.rb

# -*- coding: utf-8 -*-

require 'anemone'

URL = ARGV[0]
Anemone.crawl(URL) do |anemone|
  anemone.on_every_page do |page|

      # URLを取得
      puts page.url

  end
end

```

実行する

```bash
$ ruby anemone.rb http://www.example.com/
```

注） ``` http://www.example.com/ ``` には任意のURLを入力してください。
　　サイトによってはクローリングに時間がかかるのでご注意ください。

### Anemon.crawl について

第一引数はURLを渡す。以下は第二引数以下。

| 引数 | 概要 |
| ---- | ---- |
| :depth_limit | 階層の制限を指定 |
| :delay | sleep機能(アクセス間隔を指定) |
| :user_agent | UAを指定 |
| :skip_query_strings | trueにするとURLのパラメーターを無視する |

#### depth_limit (sample)

```rb:crawl_depth.rb
# -*- coding: utf-8 -*-
require 'anemone'
URL = ARGV[0]
Anemone.crawl(URL, depth_limit: 1) do |anemone|
  anemone.on_every_page { |page| puts page.url }
end
```

#### delay (sample)

```rb:crawl_delay.rb
# -*- coding: utf-8 -*-
require 'anemone'
URL = ARGV[0]
Anemone.crawl(URL, delay: 2) do |anemone|
  anemone.on_every_page { |page| puts page.url }
end
```

#### skip_query_strings (sample)

```rb:crawl_skip_query_strings.rb
# -*- coding: utf-8 -*-
require 'anemone'
URL = ARGV[0]
Anemone.crawl(URL, skip_query_strings: true) do |anemone|
  anemone.on_every_page { |page| puts page.url }
end
```




----



### Anemone::Coreで使用するメソッドについて

| メソッド | 概要 |
| ---- | ---- |
| on_every_page | 取得したすべてのページごとに処理を実行できる。 |
| after_crawl | クロール後に各ページのデータに処理を実行できる。 |
| focus_crawl | 各ページごとに巡回するリンク先を指定することができる。 |
| on_pages_like | 指定された正規表現にマッチするURLを持つページに処理を実行できる。 |
| skip_links_like | 指定された正規表現にマッチするURLを持つページは取得しない。 |

### on_every_page (sample)

```rb:core_on_every_page.rb
# -*- coding: utf-8 -*-

require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.url }

end
```

### after_crawl (sample)

```rb:after_crawl.rb
```

### focus_crawl (sample)

```rb:core_focus_crawl.rb
# -*- coding: utf-8 -*-

require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # ページから取得したリンクの最初の10個のみ取得する
  anemone.focus_crawl { |page| page.links.slice(0..9) }

  # 出力
  anemone.on_every_page { |page| p page.url }

end
```

### on_pages_like (sample)
```rb:core_on_pages_like.rb
# -*- coding: utf-8 -*-

require 'anemone'

URL = ARGV[0]
REGEXP = /news/

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_pages_like(REGEXP) { |page| p page.url }

end
```

### skip_links_like (sample)
```rb:core_skip_links_like.rb
```

### Anemone::Pageで使用する主なメソッドについて

| メソッド | 概要 |
| ---- | ---- |
| url | ページのURLを取得 |
| headers | header情報を取得 |
| code | HTTPのレスポンスコード(e.g. 200, 301, 404)を取得 |
| body | HTMLを取得 |
| doc | bodyをNokogiriで使用できる形式(Nokogiri::HTML::Document)で取得 |
| links | ページ内の ```<a>``` タグのリンクリストを取得（URI::HTTPで取得） |

### url (sample)
```rb:page_url.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|
  
  # 出力
  anemone.on_every_page { |page| p page.url }

end
```

### headers (sample)
```rb:page_headers.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.headers }

end
```

### code (sample)
```rb:page_code.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.code }

end
```

### body (sample)
```rb:page_body.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.body }

end
```

### doc (sample)
```rb:page_doc.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.doc }

end
```

### links (sample)
```rb:page_links.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page do |page|
    page.links.each { |link| p link.path }
  end

end
```



# サンプル

```rb:sample02.rb
# -*- coding: utf-8 -*-
require 'anemone'
require 'nokogiri'


###########################################
# urlにnewsを含むページだけを取得して表示する。
###########################################

URL = ARGV[0]
REGEXP = /news/

site_data = []

Anemone.crawl(URL, depth_limit: 1) do |anemone|

  # 例 1
  anemone.focus_crawl do |page|
    # 条件に一致するリンクだけ残す
    page.links.keep_if { |link| link.to_s.match(REGEXP) }
  end

  anemone.on_every_page do |page|
    site_data << {
        url: page.url.to_s,
        title: page.doc.title.to_s
    }
  end


  # 例 2
  anemone.on_pages_like(REGEXP) do |page|
    page_doc = page.doc ? page.doc : nil
    site_data << {
        url: page.url.to_s,
        title: page_doc.title.to_s
    }
  end

end

p site_data
```




### 参考サイト

http://anemone.rubyforge.org/index.html