新規作成日 2017-10-27
最終更新日
Webサイトの中には、検索サイトのように、ページの中にテキストボックを配置し、ページの閲覧者がテキストボックスにテキストを入力し、ボタンをクリックすることで特定の情報を提供するページを表示する形式のページがあります。
Webサイトでは、検索サイトのように、URLの後ろに「?」を付けて、その後にテキストボックス内の文字列を追加して、情報が存在するページに移行する仕組みがあります。これをパラメーターやクエリ文字列と呼びます。
このようなWebページをC#で取得するには、QueryStringプロパティを使用します。
C#では、このクエリ文字列をWebClientクラスのQueryStringプロパティに格納することで、使って、Webサイトのページを指定し、その情報をダウンロードすることができます。
使用例を多少変更したコードです。検索文字を入力すると、検索サイトbingで検索を行い、検索結果を「searchresult.htm」に保存します。ファイルは、プロジェクトのbinフォルダ内のDebugに保存されます。
using System;
using System.Collections.Specialized;
using System.Net;
namespace GetWebsite05
{
class Program
{
static void Main(string[] args)
{
string uriString = "https://www.bing.com/search";
try
{
// Enter the word(s), separated by space character to search for in
// 検索する空白文字で区切られた単語を入力してください
Console.Write("検索する空白文字で区切られた単語を入力してください" + uriString + ": ");
// Read user input phrase to search for at uriString.
// uriStringで検索するユーザー入力フレーズを読み込みます。
string searchPhrase = Console.ReadLine();
// Create a new NameValueCollection instance to hold the QueryString parameters and values.
// QueryStringパラメータと値を格納する、新しいNameValueCollectionインスタンスを作成します
NameValueCollection myQueryStringCollection = new NameValueCollection();
if (searchPhrase.Length > 1)
// Assign the user-defined search phrase.
// ユーザー定義の検索フレーズを割り当てます。
myQueryStringCollection.Add("q", searchPhrase);
else
// If error, default to search for 'Microsoft'.
// エラーの場合は、既定で「Microsoft」を検索します。
myQueryStringCollection.Add("q", "Microsoft");
// Assign auxilliary parameters required for the search.
// 検索のために必要とされる補助パラメータを割り当てます。
Console.WriteLine("Searching " + uriString + " .......");
using (WebClient myWebClient = new WebClient())
{
// Create a new WebClient instance.
// WebClientインスタンスを新規作成します。
// Attach QueryString to the WebClient.
// QueryStringをWebClientに添付します。
myWebClient.QueryString = myQueryStringCollection;
// Download the search results Web page into 'searchresult.htm' for inspection.
//検査のために、「searchresult.htm」に検索結果のWebページをダウンロードします。
myWebClient.DownloadFile(uriString, "searchresult.htm");
}
// "\nDownload of " + uriString + " was successful. Please see 'searchresult.htm' for results."
Console.WriteLine(uriString + " のダウンロードは、成功しました。結果については、「searchresult.htm」を参照ください。");
}
catch (Exception e)
{
// Let the user know what went wrong.
// ユーザーに、何が問題になったのかを知らせます。
// The file could not be read:
Console.WriteLine("指定されたサイトを読み取れませんでした:");
Console.WriteLine(e.Message);
}
// Keep the console window open in debug mode.
// デバッグモードで、コンソール・ウインドウを開いた状態に維持します。
System.Console.WriteLine("何かキーを押すと終了します。");
System.Console.ReadKey();
}
}
}
次のURLは、Yahoo!ファイナスの株式ページのURLです。クエリ文字列を使用して、株価コードを指定して、必要な情報を呼び出します。
https://stocks.finance.yahoo.co.jp/stocks/history/?code=4689.T
URLには、「?」の後に、「code=4689.T」のクエリ文字列があります。
このWebサイトの情報を取得するコードは以下のとおりです。取得した結果は、文字列としてコンソールに表示されます。
using System;
using System.Collections.Specialized;
using System.Net;
using System.Text;
namespace GetWebsite06
{
class Program
{
static void Main(string[] args)
{
try
{
// 読み込むページのURL ヤフーファイナンスの株式-時系列
string url = @"https://stocks.finance.yahoo.co.jp/stocks/history/";
// 株価コード「4689」は、ヤフー株
string StockCode = "4689.T";
// 読み込んだWebページのコードを格納する変数
string html;
// QueryStringパラメータと値を格納する、新しいNameValueCollectionインスタンスを作成します
NameValueCollection myQueryStringCollection = new NameValueCollection();
// クエリ文字を設定する
myQueryStringCollection.Add("code", StockCode);
using (WebClient wc = new WebClient())
{
// WebClientインスタンスを作成します
// ユーザーエージェント文字列をHeaders プロパティに追加する
//wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0");
// QueryStringをWebClientに添付します。
wc.QueryString = myQueryStringCollection;
wc.Encoding = Encoding.UTF8;
html = wc.DownloadString(url);
}
// 取得したWebページのコードをコンソールに出力する
Console.WriteLine(html);
}
catch (Exception e)
{
// Let the user know what went wrong.
// ユーザーに、何が問題になったのかを知らせます。
// The file could not be read:
Console.WriteLine("指定されたサイトを読み取れませんでした:");
Console.WriteLine(e.Message);
}
// Keep the console window open in debug mode.
// デバッグモードで、コンソール・ウインドウを開いた状態に維持します。
System.Console.WriteLine("何かキーを押すと終了します。");
System.Console.ReadKey();
}
}
}