C#でウェブサイトのソースを取得してみた
C#でウェブサイトのソースを取得してみました。表形式でデータを公開しているサイトから、データを自動的に抜き出したいのです。こういう作業をスクレイピングと言うそうです。Visual Studio 2015なのでHttpClientクラスが使えるのですが、非同期の処理がどうしてもうまくいかなくて、代わりにWebClientクラスを使用します。
目次
WebClientクラスってどう使うのでしょう
こちらに解説記事があります。 指定したURIのデータをストリームに流して、そのストリームから文字列を読み取るという感じです。
読み取ってみた
まず、WebClientクラスを使用するためにSystem.Netを、Streamクラスを使用するためにSystem.IOをそれぞれインポートします。
using System.Net;
using System.IO;
フォームにテキストボックスを2つ、ボタンを1つ貼り付けます。1つ目のテキストボックスに読み取りたいアドレスを入力し、ボタンをクリックしたら、読み取ったデータを2つ目のテキストボックスに表示させてみます。 コードは下記のようになります。(インポート部や本稿に関係ない箇所は省略します。)
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);
}
}
これを実行してこのサイトを読み取ってみると、下図のようになります。 文字化けてます。サイトの文字エンコーディングがUTF-8になってるのにストリームからシフトJISで読んでるからですね。文字コードをShift_JISからutf-8に変えると下図のように正しく読み取れます。 HttpClientクラスを使うとウェブサイトの文字コード設定(charset)に合わせて読んでくれるらしいのですが、非同期動作がロックしたまま帰ってこないんですよね。私の使い方に問題あるのでしょうが、解決できないうちはWebClientクラスでやってみようと思います。
公開日
広告
C#カテゴリの投稿
- C#でMVVMって何でしょう
- C#でPDFを表示する(WPF)
- C#でアプリのログを記録してみる
- C#でアプリの設定を保存する
- C#でインスタンスをプログラムで作ってみた(Activator.CreateInstance編)
- C#でインスタンスをプログラムで作ってみた(Type.InvokeMember編)
- C#でインスタンス間のデータの受け渡しをしてみた
- C#でウェブサイトのソースを取得してみた
- C#でエラーの処理をする
- C#でクラスのフィールド宣言とコンストラクターでの初期化はどっちが優先する?
- C#でスタックを使って逆ポーランド記法の計算をしてみた
- C#で数式を中置記法から後置記法(逆ポーランド記法)に変換してみた(三角関数編)
- C#で選択(switch-case編)
- C#のWPFでデータバインディング
- C#のXAMLでメニューとステータスバーのレイアウトをしてみた
- C#のアプリの情報を表示してみた
- C#のクラスとインスタンスとオブジェクト
- C#の反復処理(foreach編)
- C#の命名規則
- C#へのMicrosoft.TeamFoundation.Controlsの参照の追加について