• ホーム
  • C#
  • C#でウェブサイトのソースを取得してみた

C#でウェブサイトのソースを取得してみた

C#でウェブサイトのソースを取得してみました。表形式でデータを公開しているサイトから、データを自動的に抜き出したいのです。こういう作業をスクレイピングと言うそうです。Visual Studio 2015なのでHttpClientクラスが使えるのですが、非同期の処理がどうしてもうまくいかなくて、代わりにWebClientクラスを使用します。

目次

  1. WebClientクラスってどう使うのでしょう
  2. 読み取ってみた

WebClientクラスってどう使うのでしょう

こちらに解説記事があります。 指定したURIのデータをストリームに流して、そのストリームから文字列を読み取るという感じです。

読み取ってみた

まず、WebClientクラスを使用するためにSystem.Netを、Streamクラスを使用するためにSystem.IOをそれぞれインポートします。

using System.Net;
using System.IO;

フォームにテキストボックスを2つ、ボタンを1つ貼り付けます。1つ目のテキストボックスに読み取りたいアドレスを入力し、ボタンをクリックしたら、読み取ったデータを2つ目のテキストボックスに表示させてみます。 151028-1-00 コードは下記のようになります。(インポート部や本稿に関係ない箇所は省略します。)

private void button1_Click(object sender, EventArgs e)
{
    Uri webUri = new Uri(textBox1.Text);

    WebClient client = new WebClient();
    try
    {
        // URIからダウンロードしたデータのストリームを開く
        Stream st = client.OpenRead(webUri);

        Encoding enc = Encoding.GetEncoding("Shift_JIS");
        // 文字コードを指定して、StreamReaderクラスのインスタンスを作る
        StreamReader sr = new StreamReader(st, enc);
        // ストリームから文字列を末尾まで読み込む
        string result = sr.ReadToEnd();

        textBox2.Text = result;
        sr.Close();
        st.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

これを実行してこのサイトを読み取ってみると、下図のようになります。 151028-1-01 文字化けてます。サイトの文字エンコーディングがUTF-8になってるのにストリームからシフトJISで読んでるからですね。文字コードをShift_JISからutf-8に変えると下図のように正しく読み取れます。 151028-1-02 HttpClientクラスを使うとウェブサイトの文字コード設定(charset)に合わせて読んでくれるらしいのですが、非同期動作がロックしたまま帰ってこないんですよね。私の使い方に問題あるのでしょうが、解決できないうちはWebClientクラスでやってみようと思います。

公開日

広告