プログラムからWebページを取得するクラスとして、.NET Frameworkのクラス・ライブラリには次の2系統のクラスが用意されている(いずれもSystem.NET名前空間のクラス)。
前者のWebClientクラスは、典型的なWebページ処理をメソッドとしてまとめ簡略化したクラスである。ただし、その内部では後者のWebRequestクラス/WebResponseクラスが利用されている。本稿では、WebClientクラスを利用してWebページを取得する基本的な方法についてまとめる。
通常、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メソッドによるアップロードについては別稿で解説予定)。
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
' 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
このプログラムでは、Google(http://www.google.co.jp/)のトップ・ページのHTMLデータを取得し、それをカレント・ディレクトリに「google.html」というファイル名で保存する。
アプリケーションから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
' 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
プログラムからGoogleにアクセスした場合には、ページの文字コードはデフォルトではシフトJISになるようなので(これについては後述)、このプログラムではシフトJIS用のEncodingオブジェクトを使ってページ内容を読み出し、画面に出力している。
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
' 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
ここまでのサンプル・プログラムでは、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
' 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
このプログラムの場合には、DownloadDataメソッドにより取得したバイト・データをUTF-8の文字列に変換して出力している。画面に出力される処理結果の先頭部分を見れば、<head>タグのcharset属性の値が「Shift_JIS」から「UTF-8」に変化しているのが分かるはずだ。
カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:WebClientクラス(System.Net名前空間)
使用ライブラリ:Encodingクラス(System.Text名前空間)
使用ライブラリ:StreamReaderクラス(System.IO名前空間)
関連TIPS:文字列をシフトJISとしてバイト列に変換するには?
関連TIPS:Encodingクラスで扱えるエンコーディング名は?
関連TIPS:バイト列を文字列に変換するには?
Copyright© Digital Advantage Corp. All Rights Reserved.