amazonを参照する

...または、本の情報を取得する

初めに

Webには、Wikipediaを始め様々な情報の宝庫です。でも、その中から必要な情報を探し出すとには、工夫が要ります。とはいえ、Wikipedia等のように決まった形で情報が書き込まれているPageからは、意外と簡単に情報が取り出せます。

今回は、Amazonサイトから本の情報を取り出して見ます。

Webページから、html を取り出す。

.NET Framework でWebを参照するには、二つの方法があります。WebClientWebBrowserです。今回は、WebBrowseを使います。

新規プロジェクトでWindwosフォームアプリケーションを選択し、デザイン・モードのツール・ボックスから WebBrowser を選択し、Form1 に貼り付けるだけです。Form1.h には、自動的に次のような記述が追加されます。

private: System::Windows::Forms::WebBrowser^ amazon; : this->amazon = (gcnew System::Windows::Forms::WebBrowser()); : // // amazon // this->amazon->Location = System::Drawing::Point(3, 3); :

この WebBrowser の amazon に url を指定するには、Navigateメソッドを使います。

ここで、変数isbn には、本の10桁のISBNコードが入ります。

本来は、ASINコードが入りますが、本の場合は、10桁のISBNコードと同じです。

実行すると、amazon に指定した url のページが表示されます。

WebBrowserは、文字通り、ウェブ・ブラウザになるのです。これさえあれば、IEもFireFoxも要らない?

通常、ウェブ・ブラウザは、ページの読み込みが完了するまで時間がかかります。このWebBrowser もそうです。WebClient では、OpenRead と ReadToEnd を使って、事なきを得ましたが、ここでは、読み込み完了時に発生するイベントDocumentCompletedを使います。

amazon->Navigate("http://www.amazon.co.jp/o/ASIN/" + isbn + "/");

System::Void amazon_DocumentCompleted(System::Object^ sender, System::Windows::Forms::WebBrowserDocumentCompletedEventArgs^ e) { if (e->Url == amazon->Url) { : } }

イベントが発生した時の url と amazon に設定した url が一致した時、読み込みが完了したとして次の処理にうつります。

つまり、htmlを取り出します。WebClient の時のようにそのまま取り出すのであれば、

で済みます。しかし、この、DocumentTextプロパティは、UTF-8が前提。UTF-8で書かれたWikipediaサイトならこれでよいのですが、Shift-JISで書かれたamazon日本語サイトを読み出すと文字化けします。

手動でコード変換する際は、DocumentStreamメソッドを使います。

String^ html = amazon->DocumentText;

int arraySize = amazon->DocumentText->Length; array<Byte>^ txtArray = gcnew array<Byte>(arraySize); array<Char>^ txtChars = gcnew array<Char>(arraySize); System::Text::Encoding^ utf8 = System::Text::Encoding::GetEncoding(L"UTF-8"); System::Text::Encoding^ sjis = System::Text::Encoding::GetEncoding(L"SHIFT-JIS"); amazon->DocumentStream->Read(txtArray, 0, arraySize); txtArray = System::Text::Encoding::Convert(sjis, utf8, txtArray); utf8->GetChars(txtArray, 0, txtArray->Length, txtChars, 0); String^ html = gcnew String( txtChars);

しかし、もっと良い方法があるのです。

これだけです。エンコードは自動判別されます。

しかも、htmlには、ページのHTMLそのままではなく、冗長な部分(余分な改行とか)が削除されたHTMLが入ります。

必要な情報を検索する

後は、“Wikipediaを参照する”でやったように、必要な情報を検索・抽出し、表示用に加工するだけです。 今回は、何箇所かから情報を取り出すので検索・抽出する関数を用意します。

String^ html = amazon->Document->Body->InnerHtml;

String^ getParts(String^ src, String^ pre, String^ post) { String^ res; int pos = src->IndexOf(pre); if (pos > 0) { res = src->Substring(pos); res = res->Substring(pre->Length); pos = res->IndexOf(post); if (pos > 0) res = res->Substring(0, pos); } else res = ""; return res; }

説明するまでもないですが、src文字列中で、pre文字列とpost文字列で囲まれた文字列を取り出します。

これ使って、必要な情報を抜き出し、表示用に加工します。

加工には、“Wikipediaを参照する”の時と同様、正規表現を使った関数が便利です。今回も、replaceRegex と splitRegex を使っています(regexs.h)。その中から一つ紹介しましょう。

String^ getNum (String^ str) { return removeRegex("[^0-9]+", str); return replaceRegex("[^0-9]+", str, ""); }

正規表現の表すところは、『数字以外の1文字以上の文字を含むもの』。つまり、この関数は、文字列中の数字だけを取り出し返します。

今回のサンプルプログラムを実行すると、右の図のようなウィンドウが現れ、ISBNボタン脇のテキスト・ボックスにISBN番号を入れてISBNボタンをクリックします。978から始まる13桁のISBNであれば、プログラムのほうで10桁に変換します。そして、その本がAmazonサイトに登録されていれば、Amazon Site タブにそのページが表示されます。

Book Information 左下のテキスト・ボックスに書籍情報が表示されます。Descriptions にチェックを入れると本の紹介文が追加されます。右下には、あれば、表紙絵が表示されます。

もちろん、表示された情報は、右クリックでコピーできます。

サンプルの実行ファイル(amazonbooksearch.zip)とソースは、こちらからどうぞ。

プログラム作製に使ったツールは、Visual C++ 2008 Express Edition 日本語版です。レジストリ等は使用していませんので、適当なフォルダに実行ファイル(wikiAnniversary.exe)を解凍すれば使えます。なおプログラムの実行に際しては、以下のモジュールが必要です。必要に応じてインストールして下さい。

Microsoft .NET Framework Version 2.0 再頒布可能パッケージ (x86)

Microsoft .NET Framework 2.0 Service Pack 1 (x86)

Microsoft Visual C++ 2008 再頒布可能パッケージ (x86)

なお、掲載したソースおよび実行ファイルは、ご自由にお使い下さい。ただし、ご使用により、いかなる弊害や不具合が生じたとしても、当方ではいかなる責任も持ちません。予め、ご了承下さい。

Thinking-J

https://sites.google.com/site/thinkingj2007/home

mail : thinkingj.2007@gmail.com