注目の記事 PICK UP!

  • C#

C# Webページのデータを取得する方法

C#を使ってWebページのデータを取得できるサンプルプログラムを作成しました。背景としては、業務で10社以上ある競合他社のホームページから手動で情報収集を行っていた部署があったため、なるべく楽に情報収集できるように、このプログラムを作成しました。

指定したWEBページのデータを取得する

WEBページからデータを取得するために、WebBrowserコントロールをサブクラス化してNonDispBrowserクラスを作成します。

こちらのサブクラスは、ITmediaさんのソースを丸パクリしてますので、詳細はリンク先でご確認ください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace Study
{
    public class NonDispBrowser : WebBrowser
    {
        bool done;

        // タイムアウト時間(10秒)
        TimeSpan timeout = new TimeSpan(0, 0, 10);

        /// <summary>
        /// ページにフレームが含まれる場合にはフレームごとに
        /// このメソッドが実行されるため実際のURLを確認します
        /// </summary>
        /// <param name="">なし</param>
        protected override void OnDocumentCompleted(WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url == this.Url)
            {
                done = true;
            }
        }

        /// <summary>
        /// ポップアップ・ウィンドウの抑制します
        /// </summary>
        /// <param name="">なし</param>
        protected override void OnNewWindow(CancelEventArgs e)
        {
            e.Cancel = true;
        }

        /// <summary>
        /// 実行エラーとなるスクリプト(Javascript)が含まれる場合
        /// エラーダイアログが表示されないように抑制します
        /// </summary>
        /// <param name="">なし</param> NonDispBrowser
        public NonDispBrowser()
        {
            // スクリプト・エラーを表示しない
            this.ScriptErrorsSuppressed = true;
        }

        /// <summary>
        /// 指定したWEBページの取得
        /// 取得完了までWaitします
        /// </summary>
        /// <param name="">なし</param>
        public bool NavigateAndWait(string url)
        {

            base.Navigate(url); // ページの移動

            done = false;
            DateTime start = DateTime.Now;

            while (done == false)
            {
                if (DateTime.Now - start > timeout)
                {
                    // タイムアウト
                    return false;
                }
                Application.DoEvents();
            }
            return true;
        }
    }
}

HTML内のclass名から場所を特定する

HTMLのタグを見ると、idやclass名といったものが記述されているのが分かると思います。このidやclass名を利用して、取得したいデータの位置を特定します。ここで作成したサンプルは、tableタグ内のデータを取得するサンプルコードとなっています。

using System.Windows.Forms;

namespace Study
{
    class GetHtml
    {
        NonDispBrowser ndb = new NonDispBrowser();

        /// <summary>
        /// HTMLの要素を取得します
        /// </summary>
        public void PrintDom()
        {
            ndb.NavigateAndWait("URL");
            HtmlDocument doc = ndb.Document;

            foreach (HtmlElement table in doc.GetElementsByTagName("table"))
            {
                // テーブルレコード
                foreach (HtmlElement tr in table.GetElementsByTagName("tr"))
                {
                    // 指定したclass名に一致した場合
                    if (tr.GetAttribute("domのclass名") == "class名")
                    {
                        // テーブルデータ
                        foreach (HtmlElement td in tr.GetElementsByTagName("td"))
                        {
                            // 指定したclass名に一致した場合
                            if (td.GetAttribute("className") == "class名")
                            {
                                string txt = td.InnerText;
                            }
                        }
                    }
                }
            }
        }
    }
}

関連記事

  1. C# DataTableのカラム名を変更

  2. C# JSONファイルからLINQを使って集計する方法 – 合計値

  3. C# JSONファイルからLINQを使って集計する方法 – 勝率の算出

  4. C# DataTableにカラムを追加

  5. C# DataTableにレコード追加

  6. C# LINQを使って合計値や平均値を算出する

  7. C# ディクショナリを使う目的と方法

  8. C#でHTMLのtableタグを生成する方法

  9. C# LINQでDataTableから高速に特定行を検索する方法

PAGE TOP