BLOGTIMES
» ArchiveList (Tag for "scrape" )
«Prev || 1 · | Next»
2010/06/23

岡崎市立中央図書館事件の当事者のまとめ

scrape  law 

岡崎市立中央図書館をアクセスするクローラーを書いて、実行したために偽計業務妨害で逮捕されてしまった本人自らがまとめと見解を発表するサイトを公開していたのでメモ。

僕も被疑者が逮捕されたときからちょっと変だとは思っていました。起訴猶予ですが、結局20日間も拘留されてしまったのですね。

このサイトをご覧の方々へ | Librahack : 岡崎市立中央図書館HP大量アクセス事件まとめ

騒がしくなった原因は、コンピュータやネットを生業とする方々と、新聞記者を含む一般の方々との、知識のギャップにあるのではと予想しています。例えば、リクエスト33,000回という定量的な値ひとつとってみても、正反対の印象を受けたのではないでしょうか。

たしかにこれはあるかもしれません。エンジニアであれば1日が86400秒であることはマジックナンバーとして覚えている人が多いはずです。秒間1件のアクセスをしたとしても大量アクセスをした積算時間は9時間ちょっとに過ぎず、1日あたりのアクセス時間は1時間にも満たないことや、そのようなアクセスで毎日のようにサーバを再起動しないといけない状態にウェブサーバがなっていたという事実は新聞には載っていないですからね。

このあたりなかなか難しいところがありますが、アクセス社団等の措置をとらずにいきなり逮捕されたというのはやっぱり疑問ですね。そういえばウチのサイトでも楽天ファストモバイルサーチが秒間10件アクセスしてくるということをやらかしてくれたという事件があったなぁということを思い出しました。


    at 21:48 |
    2010/02/15

    Anemoneというクローラーフレームワークを使ってみる

    ruby  scrape 

    これまでクローラー使い捨てのクローラーは結構力業で作ってきたのですが、さすがにこういうことをやり始めてから1年以上が経ちこのままでは立ちゆかない事がいろいろと顕在化してきたので、クローラーを作るためのフレームワークをいろいろ調べていました。

    JavaであればLuceneのサブプロジェクトであるNutchや、Seasarプロジェクトで開発されているS2Robot、PerlであればGunghoあたりに興味があるのですが、後処理の部分はRubyで書いてしまってあるので今回はAnemoneというフレームワークをつかってみることにします。

    Anemone - Ruby Web-Spider Framework

    Anemone is a Ruby library that makes it quick and painless to write programs that spider a website. It provides a simple DSL for performing actions on every page of a site, skipping certain URLs, and calculating the shortest path to a given page on a site.

    The multi-threaded design makes Anemone fast. The API makes it simple. And the expressiveness of Ruby makes it powerful.
    [Anemoneというクローラーフレームワークを使ってみる の続きを読む]

      at 13:46 |
      2010/02/11

      MechanizeでUTF-8以外のページをスクレイピングするときの文字化け対策

      ruby  scrape  charset 

      RubyのMechanizeはスクレイピングをするときにとても便利なライブラリですが、UTF-8以外のページだとどうしてもうまく取得出来ないページがあって困っていたのですが、「Mechanize Nokogiri の非JIS文字対応 - それはそれ。これはこれ。」というエントリを参考にworkaroundを追加してなんとか回避することに成功したのでメモ。

      require 'rubygems' require 'mechanize' require 'nkf' agent = WWW::Mechanize.new agent.user_agent_alias = "Windows IE 7" # workaround agent.post_connect_hooks << Proc.new do |params| if %r|text| =~ params[:response]["Content-Type"] params[:response_body] = NKF.nkf("-wm0",params[:response_body]) params[:response_body].gsub(/<meta[^>]*>/) do |meta| meta.sub(/Shift_JIS|SJIS|EUC-JP/i,"UTF-8") end params[:response]["Content-Type"]="text/html; charset=utf-8" end end agent.get("http://example.jp/")

      ほとんど参考にしたエントリそのままですが、共通のルーチンでいろんなエンコードに対応させたかったので、NKFの引数から入力エンコーディングの指定を取り去ったり、metaタグ内の"Content-Typeのエンコーディングの書き換えについてはちょっと手を入れています。

      フックをつかってパーサーに渡る前の文字列のエンコーディングをあらかじめ変更しておいてあげるというなかなかの力業ですが、Nokogiri内の処理が信頼できない以上、それもいたしかたないですね。


        at 20:21 |
        2010/01/30

        HpricotのXPath実装はちゃんとしてない?

        ruby  scrape 

        HpricotのXPathの実装が完全でないことは薄々気づいていたものの、新たなライブラリを探すのも面倒だと思ってそのままにしていたのですが、とうとうちゃんと処理できない事例にあたってしまいました。

        今回処理をしようとしたのは下記のコード中のようなHTMLから「<h2>aaa111</h2>の直後の<div class="a">の中身のテキストを取り出す」というもの。取り出したいdivにidなんかがついていればいいのですが、ちゃんと構造化されていないHTMLなのでどうしようもありません。

        <html> <head><title>test</title></head> <body> <div class="b">001</div> <h2>aaa111</h2> <div class="a">002</div> <div class="b">003</div> <div class="b">004</div> <h2>aaa222</h2> <div class="a">005</div> <div class="b">006</div> <div class="b">007</div> </body> </html>

        とりあえずノードを指定するXPathである //h2[text() = 'aaa111']/following-sibling::div[@class='b'][1]/text() はすぐに書けたのですが、Hpricotだと結果がきちんと帰ってきません。どうやらfollowing-siblingが使えないようです。ちなみに同じXPathをNokogiriに食わせるときちんと結果が帰ってくることが確認できたので、これを機にNokogiriに乗り換えてしまうことにしました。

        [HpricotのXPath実装はちゃんとしてない? の続きを読む]

          at 21:06 |
          2009/01/03

          Mechanize0.9.0でスクレイピングがうまくいかないときは

          ruby  scrape  charset 

          新サーバに移行をしたらcronに仕込んであるmixi2gmailがうまく動かなくなってしまいました。

          同じスクリプトを旧サーバで実行すると正常に動作するので、何か環境に依存した問題なんだろうと思って、詳しく調べてみると

          /続きを読む/ =~ link.node.inner_html

          という部分で続きを読むがうまく見つけられていないようだったので、おそらく文字コードの問題だろうということで、文字コードを変えてみたりといろいろ試行錯誤をしていたのですが、ふとエラーを吐いているのがいつものHpricotではなくて、見慣れないNokogiriであることに気づきました。

          ということで、ググってみるとMechanizehは0.9.0からHTMLパーサーがHpricotからNokogiriに変更されていて、日本語を検索するようなスクリプトを書いている場合には、この仕様変更による副作用があるというのが結論のようです。

          RubyのMechanize0.9.0&Nokogiriは日本語をうまく扱えないことがある - きたももんががきたん。

          なお、「NokogiriはHpricotと互換」と謡われていますが、実はこの文字エンコードの扱いの部分が違います。

          Hpricot
          文字エンコードは不変で出力は素通し
          Nokogiri
          文字エンコードは入力が UTF-32/16/8 か ASCII を期待、出力は UTF-8 に強制的に変換

          これまでNokogiriは使ったことがなかったのでよく知りませんでしたが、このあたりは覚えておいた方が良さそうです。

          [Mechanize0.9.0でスクレイピングがうまくいかないときは の続きを読む]

            at 20:10 |
            2008/12/21

            JavaScriptバリバリのページをスクレイピングする

            ruby  scrape 

            普段ウェブのスクレイピングにはWWW::Mechanizeを使っています。WWW::MechanizeはJavaScriptが解釈できないので、これまでは自分でJavaScriptを解釈してプログラミングをしていたのですが、スクレイピングの妨害のためなのか何なのかは良くわかりませんが、尋常じゃない程のJavaScriptを解釈しなければならないページにぶち当たってしまって、この一週間途方に暮れていました。

            いろいろ調べた結果、IEやFirefoxを外部から操作する方法が一番早いようなので、Rubyから使えるWatirというライブラリを使ってみることにしました。内部的にはWin32APIを使ってIEをコントロールするようです。後々バッチ化をすることを考えると、あまりWindows依存で起動時に画面が必要になるアプリにはしたくないのですが、この際ですから仕方ありません。

            Watir - Overview

            Watir is an open-source library for automating web browsers. It allows you to write tests that are easy to read and maintain. It is simple and flexible.

            Watir drives browsers the same way people do. It clicks links, fills in forms, presses buttons. Watir also checks results, such as whether expected text appears on the page.

            このWatir、何と読んだらいいから分からなくて困りましたが、Watir pronounceで検索してみたらプロジェクトのトップページに"It is pronounced water."とちゃんと書いてありました。ウォーターと読めばいいようです。

            [JavaScriptバリバリのページをスクレイピングする の続きを読む]

              at 04:16 |
              2007/11/24

              WWW::Mechanizeでニコニコ動画からflvをダウンロードする

              ruby  scrape  niconico 

              rubyのWWW::Mechanizeを使ってニコニコ動画からflvをダウンロードするスクリプト。

              [ruby] ruby with mechanizeでニコニコ動画のダウンローダーを作ってみた - よしだメモ

              ちょっとそのままでは動かなかったので、スクリプトを読んでみたらどうもloginを呼んでいないようだったのでget_flvからloginを呼んであげるようにしたら動くようになりました。こういうスクリプトがサクッと作れるWWW::Mechanizeってやっぱり便利だなぁ。phpでもこういうモジュール使えるようにならないかな。。。

              [WWW::Mechanizeでニコニコ動画からflvをダウンロードする の続きを読む]

                at 21:09 |
                2007/10/20

                scRUBYt!を使ってmixiの足跡をスクレイピング

                ruby  scrape  mixi  xml 

                "ruby スクレイピング"というキーワードでいろいろ検索してまわってみたらWWW::MechanizeよりもscRUBYt!の方が面白そうだったので、これをつかって軽く練習してみることにします。他にもscrAPIというのもあるみたいですが、日ごろからXSLのコーディングをしていたりすることもあってCSSのセレクタ表記よりもXPathに馴染んでいるということでscRUBYt!を選んでみました。

                かるく肩慣らしということで、mixiの足跡をスクレイピングしてみました。
                なぜ足跡なのかといえば、特に深い意味はないんですけど。。。。。

                [scRUBYt!を使ってmixiの足跡をスクレイピング の続きを読む]

                  at 23:40 |
                  2007/05/13

                  Web::Scraper超便利

                  perl  scrape 

                  もう3年くらい前になりますが、Template::ExtractでWebのスクレーピングをするのが便利だという話がありました。で、当時作ったスクリプトが実はまだ某所で動いていたりするわけですが、いまやもっと便利なライブラリができてるんですねぇ。

                  naoyaのはてなダイアリー - Web::Scraper

                  ばっちりですね。シンボルの書き方とかがちょっと違うところ以外は Ruby 版とほぼ等化。DSL 周りのドキュメントはまだないけどとりあえず scrapi のドキュメントを読めば ok! \(^o^)/

                  時間はただ流れているわけでありませんね。ということでちょっとテストしてみました。perlを書くのは久しぶりです。

                  [Web::Scraper超便利 の続きを読む]

                    at 20:16 |
                    «Prev || 1 · | Next»
                    » ArchiveList (Tag for "scrape" )