|
.NET TIPS WebClientクラスでWebページを取得するには?デジタルアドバンテージ 遠藤 孝信2005/05/20 |
![]() |
|
|
|
プログラムからWebページを取得するクラスとして、.NET Frameworkのクラス・ライブラリには次の2系統のクラスが用意されている(いずれもSystem.NET名前空間のクラス)。
- WebClientクラス
- WebRequestクラス/WebResponseクラスとその派生クラス
前者のWebClientクラスは、典型的なWebページ処理をメソッドとしてまとめ簡略化したクラスである。ただし、その内部では後者のWebRequestクラス/WebResponseクラスが利用されている。本稿では、WebClientクラスを利用してWebページを取得する基本的な方法についてまとめる。
WebClientクラスの2種類のメソッド
通常、WebページへアクセスにはHTTPプロトコルのGETメソッド(GETリクエスト)あるいはPOSTメソッド(POSTリクエスト)が使用されるが、WebClientクラスで用意されているメソッドも、利用されるHTTPプロトコルのメソッドにより2種類に分けることができる。
| GETメソッド・ベース | POSTメソッド・ベース |
| ・DownloadDataメソッド ・DownloadFileメソッド ・OpenReadメソッド |
・OpenWriteメソッド ・UploadDataメソッド ・UploadFileメソッド ・UploadValuesメソッド |
| WebClientクラスに用意されている2種類のメソッド | |
本稿ではGETメソッドをベースとする3つのWebClientクラスのメソッドについて解説する。ちなみに、POSTメソッドをベースとするアップロード用のメソッドは、日本語データ送信時にエンコード処理が必要になるような場合などにはあまりシンプルには使えず、WebRequestクラス/WebResponseクラスを使用するのと大して手間は変わらない。このためここではそれらの解説は割愛する(WebRequestクラス/WebResponseクラスを使ったPOSTメソッドによるアップロードについては別稿で解説予定)。
DownloadFileメソッドによるWebページのファイルへの保存
WebページやWeb上のデータ(画像や圧縮ファイルなど)を取得し、そのデータをファイルとして保存したいだけであれば、WebClientクラスのDownloadFileメソッドが最もお手軽だ。DownloadFileメソッドでは、対象となるページやファイルのURLと、それを保存するファイル名をパラメータで指定するだけでよい。以下にそのサンプル・プログラムを示す。
|
|
| DownloadFileメソッドによりWebページをファイルに保存するC#のサンプル・プログラム(wcget1.cs) | |
|
|
| DownloadFileメソッドによりWebページをファイルに保存するVB.NETのサンプル・プログラム(wcget1.vb) | |
このプログラムでは、Google(http://www.google.co.jp/)のトップ・ページのHTMLデータを取得し、それをカレント・ディレクトリに「google.html」というファイル名で保存する。
OpenReadメソッドによるWebページの取得
アプリケーションからWebページを取得する場合には、取得したデータをプログラムで処理したい場合が多い。このような場合にはOpenReadメソッドあるいは後述するDownloadDataメソッドを利用する。
OpenReadメソッドでは、パラメータとして対象ページのURLを指定して呼び出すと、そのページ・データを読み取るためのストリーム(Streamオブジェクト)が返される。
ストリームからページのHTMLデータを文字列として取得するには、そのページで使用されている文字コードに対応したEncodingオブジェクトとともにStreamReaderクラス(System.IO名前空間)を使ってページの内容を読み出せばよい(Encodingオブジェクトについては「TIPS:文字列をシフトJISとしてバイト列に変換するには?」や「TIPS:Encodingクラスで扱えるエンコーディング名は?)などを参照)。以下にそのサンプル・プログラムを示す。
|
|
| OpenReadメソッドによりWebページを取得するC#のサンプル・プログラム(wcget2.cs) | |
|
|
| OpenReadメソッドによりWebページを取得するVB.NETのサンプル・プログラム(wcget2.vb) | |
プログラムからGoogleにアクセスした場合には、ページの文字コードはデフォルトではシフトJISになるようなので(これについては後述)、このプログラムではシフトJIS用のEncodingオブジェクトを使ってページ内容を読み出し、画面に出力している。
DownloadDataメソッドによるWebページの取得
WebClientクラスのDownloadDataメソッドでは、ストリームからページ・データを取り出し、すべてのデータをバイト配列に格納するまでをメソッドが面倒みてくれる。
以下のサンプル・プログラムでは、取得したバイト配列のデータをシフトJISの文字列に変換し、画面に表示する(この変換ついては「バイト列を文字列に変換するには?」を参照)。
|
|
| DownloadDataメソッドによりWebページを取得するC#のサンプル・プログラム(wcget3.cs) | |
|
|
| DownloadDataメソッドによりWebページを取得するVB.NETのサンプル・プログラム(wcget3.vb) | |
Headersプロパティによるヘッダ情報の追加
ここまでのサンプル・プログラムでは、Googleから取得したページ・データの文字コードはすべて「シフトJIS」となっている。しかし、IEでGoogleにアクセスした場合には、ブラウザが受け取るページ・データの文字コードは「UTF-8」となっているはずだ。これはアクセスしているクライアントをGoogleが判別して、クライアントの種類(IEや携帯電話のブラウザなど)により送信するデータを変えているためだ。
通常、IEなどのブラウザは、Webページ取得時には以下のような「名前(User-Agent)と値(Mozilla/4.0〜)」のペアをリクエスト・データのヘッダ情報(HTTPヘッダ)に埋め込んでリクエストを送信する(「値」となる文字列は環境によって異なる)。
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)
このようなヘッダ情報がリクエストに含まれていない場合には、GoogleはシフトJISのページを返すようだ。
WebClientクラスを使ってページを取得する際に、Webサイトに送信されるヘッダ情報を設定したい場合には、WebClientオブジェクトのHeadersプロパティに対して、Addメソッドにより「名前」と「値」のペアをあらかじめ追加しておけばよい。以下にその例を示す。
|
|
| User-Agentを設定してページを取得するC#のサンプル・プログラム(wcget4.cs) | |
|
|
| User-Agentを設定してページを取得するVB.NETのサンプル・プログラム(wcget4.vb) | |
このプログラムの場合には、DownloadDataメソッドにより取得したバイト・データをUTF-8の文字列に変換して出力している。画面に出力される処理結果の先頭部分を見れば、<head>タグのcharset属性の値が「Shift_JIS」から「UTF-8」に変化しているのが分かるはずだ。![]()
| カテゴリ:クラス・ライブラリ 処理対象:ネットワーク 使用ライブラリ:WebClientクラス(System.Net名前空間) 使用ライブラリ:Encodingクラス(System.Text名前空間) 使用ライブラリ:StreamReaderクラス(System.IO名前空間) 関連TIPS:文字列をシフトJISとしてバイト列に変換するには? 関連TIPS:Encodingクラスで扱えるエンコーディング名は? 関連TIPS:バイト列を文字列に変換するには? |
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


