QA@IT

RubyのNokogiriとAnemoneをつかってクローリング、スクレイピング。

5273 PV

NokogiriとAnemoneをつかってクローリング、スクレイピングしております。
下記は、URLが/page/がつくものだけをクローリングしてそのページのurlとh2タグのものを表示させるつもりで書きましたが、上手くできません。
urlの表示はできますが、h2の表示ができません。
どのようにすれば良いでしょうか?
参考になるページはありますか?
またなにかクローリングでよいツール等あれば教えてください。

#!/usr/bin/ruby

require 'open-uri'
require 'nokogiri'
require 'rubygems'
require 'anemone'

opts = {
  :user_agent => "TestRobot/0.00",
  :skip_query_strings => true, #URL に付与する ? で始まるオプション文字列)はスキップ
  # :delay => 1,
  :storage => Anemone::Storage.MongoDB,
  # :depth_limit => 1,
}

url = "https://www.example.com/"
ANY_PAGE = %r[page\/+]


Anemone.crawl(url, opts) do |anemone|

    anemone.on_pages_like(ANY_PAGE) do |page|

        puts page.url

      doc = Nokogiri::XML(open(page.url))
      p doc.css('h2').inner_text()

    end
end

【【追記】】
なるほど!ありがとうございます。puts docをしてみたところ、、

<!DOCTYPE html PUBLIC "">
<html><body><p>[{"facebook_uid":"1665176","id":9840,"name_en":"&eacute;&#149;&middot;&aring;&#141;&#151;&auml;&frac12;&#145;&egrave;&frac14;&#148;","name_ja":"&eacute;&#149;&middot;&aring;&#141;&#151;&auml;&frac12;&#145;&egrave;&frac14;&#148;","registered":true},{"facebook_uid":"130722
。。。。
</body></html>

みたくなっており、そのサイトはfacebookログインで使うサイトなのですが、h1とか普通のタグがないようです。
こういうサイトのスクレイピングはどうするのでしょう???

回答

手元の環境で URL とパターンを変えて試すと期待通り動作するので、なんらかの理由で目的のページが取得できていないのではないでしょうか?

anemone.on_pages_like ブロックの最後で puts doc して、正しく目的のページが取得できているか確認してみてください。

あと、URL が正しく出力されるなら無関係かも知れませんが、ANY_PAGE%[page/] の誤りでは?

環境: Ruby 2.0.0 / Anemone 0.7.2 / Nokogiri 1.6.0

追記に対する回答

まず facebook アカウントでの認証の処理が必要です。API もあるかもですが、汎用的な方法は下記のようなものです。

  • A. リンクのクリックやフォームへの入力をスクリプトでシミュレートする
  • B. ブラウザでログインしておいて Cookie を流用する

A は Mechanize とか使うと割と楽です。Anemone でできるかはわかりません。

B は、Chrome なら Developer Tools で Cookie 見れるので、これを Hash に整形して、Anemone.crawl の cookies オプションに渡してやればいけそうな気がします (未検証 / accept_cookies オプションも true にしておいたほうがよさそう)。

ただ、レスポンスがどうみても JSON なのが気になります。ちょっとどういうページなのかわかりませんが、JavaScript 無効にしてブラウザで目的のページを見られるでしょうか? JS 必須なら Capybara, Selenium などの利用も検討する必要があるかもしれません。

編集 履歴 (1)
  • ありがとうございます!ちょっとまだできないですが、追記しました! -
  • 追記に対する回答を書きました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。