Rubyによるクローラー開発技法 vol3 ~他人よりまず自分を疑う~

chapter2を進めていきましょう。

chapter2では、「Anemone」というライブラリを使って
Amazonのウェブサイトから書籍のランキング情報を取得する
クローラーを作っていくようです。

ちなみに、Anemoneってどういう意味?と思って
調べてみたら、植物の名前ぽいです。
花言葉は「はかない夢」とか「薄れゆく希望」とか。
このブログの事を言われてるみたいで嫌ですね笑

 
Anemoneを使ったクローラーの開発はすごく簡単で、
わずかなコードで実現できます。

1: require 'anemone'
2: 
3: url = "http://www.amazon.co.jp/gp/bestsellers/books/"
4: 
5: Anemone.crawl(url, :depth_limit => 1, :skip_query_strings => true) do |anemone|
6:   anemone.on_every_page do |page| 
7:     puts page.url
8:   end
9: end

これだけで、
Amazonのウェブサイトから
書籍の売れ筋ランキング のURL一覧を取得できます。
 
一つずつ説明していきます。
1行目のrequire 'anemone'
anemoneを使用するための記述です。
 
3行目の変数urlには、
クローラーの出発点となるurlを指定します。
今回は、書籍の売れ筋ランキングのurlをセットしています。

5行目以降が実際にクロールしてくれる処理です。
Anemone.crawlメソッド
第1引数に、urlをセットします。
第2引数に、クロールする際のオプションを指定します。
今回は、以下を指定

  • :depth_limit
    ページ内のリンクをどこまでたどるか
  • :skip_query_strings
    URLに付与する?で始まるオプション文字列をスキップするか

最後に6行目で、
ページ毎に処理を書いています。
今回はurlを出力(puts)しているだけです。
 
以上の事を書くだけでクロールしてくれます。
Anemoneを使うと簡単にクロールできますね。
 
 
ただ、本当の事を言うと私は簡単にできませんでした。
ある箇所で詰まってしまったからです。
以下のソースを見てください。

1: require 'anemone'
2: 
3: url = "http://www.amazon.co.jp/gp/bestsellers/books/"
4: 
5: Anemone.crawl(url, :depth_limit => 1, :skip_query_strings => true) do |anemone|
6:   anemone.on_every_page do |page| 
7:     puts page.uri
8:   end
9: end

初めはこのように書いていました。
さっきのソースコードとどこが違うかわかりますか?
 
これを実行すると、Anemone.crawが呼び出された後、
on_every_pageの処理中に何も反応がなくなり、
ずっと待機状態になります。
エラーも一切出ません。
 
本の通りに書いたのになぜ動かないのか?

  • Webサイトのクロールに時間がかかっているだけと思い、少し待ってみたり
  • 本の記述が間違っている可能性があると思い、ネットで正誤表を調べたり
  • そもそも私のMacの環境が悪くてAnemoneが上手く動作しないんじゃないかと疑ったり

と色々試行錯誤したんですが、わからず。
 
 
 
2時間ぐらいかかってようやく解決できました。

 
 
 

puts page.uri

 
 
ん?
 
 
 
 
あれ?
 
 
 

page.urlの最後の文字がiになってる!

 
 

今回学んだ事

他人よりまず自分を疑う  
 

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例