連載
» 2005年05月20日 05時00分 UPDATE

.NET TIPS:WebClientクラスでWebページを取得するには?

[遠藤孝信,デジタルアドバンテージ]
.NET TIPS
Insider.NET


「.NET TIPS」のインデックス

連載目次

 プログラムから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と、それを保存するファイル名をパラメータで指定するだけでよい。以下にそのサンプル・プログラムを示す。

// wcget1.cs

using System;
using System.Net;

public class WebClientGet1 {
  static void Main() {

    WebClient wc = new WebClient();

    wc.DownloadFile(
      "http://www.google.co.jp/",
      "google.html");
  }
}

// コンパイル方法:csc wcget1.cs

DownloadFileメソッドによりWebページをファイルに保存するC#のサンプル・プログラム(wcget1.cs)
wcget1.csのダウンロード

' wcget1.vb

Imports System
Imports System.Net

Public Class WebClientGet1
  Shared Sub Main()

    Dim wc As WebClient = New WebClient()

    wc.DownloadFile( _
      "http://www.google.co.jp/", _
      "google.html")
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll wcget1.vb

DownloadFileメソッドによりWebページをファイルに保存するVB.NETのサンプル・プログラム(wcget1.vb)
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クラスで扱えるエンコーディング名は?」などを参照)。以下にそのサンプル・プログラムを示す。

// wcget2.cs

using System;
using System.IO;
using System.Net;
using System.Text;

public class WebClientGet2 {
  static void Main() {

    WebClient wc = new WebClient();

    Stream st = wc.OpenRead("http://www.google.co.jp/");

    Encoding enc = Encoding.GetEncoding("Shift_JIS");
    StreamReader sr = new StreamReader(st, enc);
    string html = sr.ReadToEnd();
    sr.Close();

    st.Close();

    Console.WriteLine(html);
  }
}

// コンパイル方法:csc wcget2.cs

OpenReadメソッドによりWebページを取得するC#のサンプル・プログラム(wcget2.cs)
wcget2.csのダウンロード

' wcget2.vb

Imports System
Imports System.IO
Imports System.Net
Imports System.Text

Public Class WebClientGet2
  Shared Sub Main()

    Dim wc As WebClient = New WebClient()

    Dim st As Stream = wc.OpenRead("http://www.google.co.jp/")

    Dim enc As Encoding = Encoding.GetEncoding("Shift_JIS")
    Dim sr As StreamReader = new StreamReader(st, enc)
    Dim html As string = sr.ReadToEnd()
    sr.Close()

    st.Close()

    Console.WriteLine(html)
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll wcget2.vb

OpenReadメソッドによりWebページを取得するVB.NETのサンプル・プログラム(wcget2.vb)
wcget2.vbのダウンロード

 プログラムからGoogleにアクセスした場合には、ページの文字コードはデフォルトではシフトJISになるようなので(これについては後述)、このプログラムではシフトJIS用のEncodingオブジェクトを使ってページ内容を読み出し、画面に出力している。

DownloadDataメソッドによるWebページの取得

 WebClientクラスのDownloadDataメソッドでは、ストリームからページ・データを取り出し、すべてのデータをバイト配列に格納するまでをメソッドが面倒みてくれる。

 以下のサンプル・プログラムでは、取得したバイト配列のデータをシフトJISの文字列に変換し、画面に表示する(この変換ついては「バイト列を文字列に変換するには?」を参照)。

// wcget3.cs

using System;
using System.Net;
using System.Text;

public class WebClientGet3 {
  static void Main() {

    WebClient wc = new WebClient();

    byte[] data = wc.DownloadData("http://www.google.co.jp/");

    Encoding enc = Encoding.GetEncoding("Shift_JIS");
    string html = enc.GetString(data);

    Console.WriteLine(html);
  }
}

// コンパイル方法:csc wcget3.cs

DownloadDataメソッドによりWebページを取得するC#のサンプル・プログラム(wcget3.cs)
wcget3.csのダウンロード

' wcget3.vb

Imports System
Imports System.Net
Imports System.Text

Public Class WebClientGet3
  Shared Sub Main()

    Dim wc As WebClient = New WebClient()

    Dim data As byte() = wc.DownloadData("http://www.google.co.jp/")

    Dim enc As Encoding = Encoding.GetEncoding("Shift_JIS")
    Dim html As String = enc.GetString(data)

    Console.WriteLine(html)
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll wcget3.vb

DownloadDataメソッドによりWebページを取得するVB.NETのサンプル・プログラム(wcget3.vb)
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メソッドにより「名前」と「値」のペアをあらかじめ追加しておけばよい。以下にその例を示す。

// wcget4.cs

using System;
using System.Net;
using System.Text;

public class WebClientGet4 {
  static void Main() {

    WebClient wc = new WebClient();

    wc.Headers.Add("User-Agent",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)");

    byte[] data = wc.DownloadData("http://www.google.co.jp/");

    Encoding enc = Encoding.UTF8;
    string html = enc.GetString(data);

    Console.WriteLine(html);
  }
}

// コンパイル方法:csc wcget4.cs

User-Agentを設定してページを取得するC#のサンプル・プログラム(wcget4.cs)
wcget4.csのダウンロード

' wcget4.vb

Imports System
Imports System.Net
Imports System.Text

Public Class WebClientGet4
  Shared Sub Main()

    Dim wc As WebClient = New WebClient()

    wc.Headers.Add("User-Agent", _
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)")

    Dim data As byte() = wc.DownloadData("http://www.google.co.jp/")

    Dim enc As Encoding = Encoding.UTF8
    Dim html As String = enc.GetString(data)

    Console.WriteLine(html)
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll wcget4.vb

User-Agentを設定してページを取得するVB.NETのサンプル・プログラム(wcget4.vb)
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」のインデックス

.NET TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。