5月
04
2008

スクレイピングのプログラム作りをたどって

未踏の開発が未完成に終わったのは、、、サーバーで動くブラウザのようなものを作っていたのに時間を割いてしまったというのがあります。

テーマがスクレイピングだったので、いろいろなサイトにアクセスしてWebページにアクセスするということをするプログラムを書く必要がありました。

スクレイピングのレベルというのがあります(勝手につけちゃいました) 

  1. wgetやcurlを使う
  2. httpアクセスを行うライブラリを使ったプログラムを書く
  3. cookieなどを操作してくれるエミュレータを使う
  4. httpアクセスの便利なエミュレーターを使う

1. 最初にスクレイピングのプログラムを作ろうとした時は、wgetやcurlというUNIXコマンドを使いました。

どちらも wget http://www.abc.com/ のような感じで実行すれば、指定のWebページをダウンロードできます。

そのページがBasic認証がある場合(ブラウザのダイアログで要求されることがある)でも、オプションでユーザーIDとパスワードを指定すれば取り出すことが可能です。

ただこれは一回きりのコマンドなので、ページのリンクをたどったり、フォームにユーザーIDとパスワードを入れる場合は使えません。

2. 次は、PerlやRubyなどの言語を使って、同じようなことをします。

まずはRubyですと、'net/http'というライブラリを使ってサンプルプログラムを実行するところから始めます。プログラムなので、一連の操作でいろいろなデータを取り出すことができるようになります。ただ、面倒な処理をしなくてはいけないので、何かライブラリをないか探しました。

3. Perlにはmechanizeというライブラリを使うと便利です。Rubyではスクレイピングを始めるときそのライブラリはなく、http-access2というのがありました。Cookieを扱ってくれて便利でした。

ただできないことがいくつかありました。httpアクセスのときに、受け取るファイルを圧縮して受け取るオプションがありません。自分でつくったりしました。^^; ただ分割で受け取る時は不便なので、、、そうかブラウザ側で「圧縮で受け取らないよ」と言えばいいんだと気付きました。

4. Rubyではscrubytというのが、mechanizeとhpricotというライブラリを吸収して便利だとうたっていました。確かに!でも、私のプログラムをブラウザのふりをすることで、普通の人がアクセスするのと同じように動くことを真似していました。

スクレイピングというのは、法的にグレーのところがあります。グレーの部分は著作権のあるデータを他の人に見せてはいけないところです。私は個人で使うためにするのだからいいのだろうと思いますが、Webサイトによってはプログラムでアクセスしてはいけないという但し書きがある場合があります。

その部分はアウトですが、人が意図してやることを代理で行うことなので、、、、、、それ以上は言及しません。エジソンが電信機を毎晩自動で打信するということを思い出します。

 

このところで、Webサイト側がプログラムが自動的にやらないようにしているところが多いことに気付きました。

多くはスパム防止のためです。メッセージを書き込むときにCAPCHA認証というのがありまして、人間しか読めない図形を読ませてそれを入力させて、人間かプログラムかの差別化をするものです。

他にはJavaScriptを使って、動的にWebページを書いたり、ログインするときもJavaScriptを使う場合がありました。これも人間にとっては問題ありませんが、プログラムにとっては問題です。

 

特定のWebサイトを対象にプログラムを書くことは可能ですが、どこのページでもプログラムで処理するのは大変なことです。CAPCHA認証は簡単なものから複雑なものまであり、簡単なものだったら図形認識のプログラムを書けばいいでしょう。

図形を読み取り、そのベクター抽出をして、A-Z, a-z, 0-9のどれかの図形のベクターと似ているか比較すればいいのです。文字を湾曲させたり、文字の上に網をかけてベクター抽出をしにくくしたり、単色ではなくてグラデーションで画像をとりにくくしたり、いろいろ考えています。ただ複雑になりすぎると人間が読めなくなるので、そのバランスが難しいです。文脈を理解するのはAIでも難しいので、簡単なクイズの方がいいかもしれません。

 

横道がそれましたが、結局未踏でそのブラウザもどきをつくるので時間をかけすぎました。scrubytやmechanizeなどのライブラリを使うと、そのライブラリにない処理ができないと困りました。自分でライブラリを作るか、そのライブラリを改良して独自のものにするか。最終的には、Rubyという言語が既存のライブラリを変えずにメソッドを再定義することが可能なので、ライブラリのメソッドをいくつか再定義してバグ修正や機能追加をしました。

でも、サイトのスパム対策と争うのはやめました。

これで2、3か月の時間を費やしてしまったのですが、たぶんスクレイピングのプログラムを作ろうとしているところは同じことをしているんだと思います。未踏で一緒だったTさんに教えていただいたのですが、サーバーサイドのスクレイピングプログラムを作っているある会社は、JavaScriptの部分まで作りこんでいるとか、御見それしました。

私も、Javaで作っているオープンソースのブラウザを調べて、画面に表示する部分を省けば同じものを作れるかなと思いましたが、それをやるだけでも大変なことだなと思います。

 

結局、ここまで無理をしたのですが、クライアントサイドでスクレイピングをすればこんな簡単なことはありませんでした。

先日、RubyのWatirというライブラリを使って、RubyからInternet Explorerをコントロールしながら動かすプログラムに改良したのですが、あっという間に終わってしまいました。

あっ、そうか、こんなことならば、Windows 2003 serverで、IEをユーザーごとに動かす力技でスクレイピングプログラムを作ればよかったのか、、、、画面表示する(レンダリング)部分などが遅いけれども、もっと大切なところでやればよかったのに。

 

いまとなっては、あそこで苦労したことも一つの貴重な体験ですが、時間やリソースが限られているので、何を捨てて何を生かすかということが大切だと思います。口で言うのは簡単ですが、なかなか難しいことです。

Written by in: 楽天日記 | タグ: ,

コメントはまだありません »


コメント&トラックバック




トラックバック URL

コメントのRSS feed