[C#] HttpWebRequestを利用してウェブページを読み込みする方法
こんにちは。明月です。
この投稿はC#のHttpWebRequestを利用してウェブページを読み込みする方法に関する説明です。
我々がプログラミングをする時にウェブのオブジェクトを読み込みが必要な時があります。例えば、ブログのrssあるいはsitemapのxmlを読み込みするかまたはウェブページの情報を取得する必要な時です。
でもHttpWebRequestはウェブページだけ読み込むことでスクレイピングとは意味が違います。スクレイピングはウェブのレンダリング、つまり、Javascriptの動的に処理されたデータを読み込むデータを取得することです。
HttpWebRequestはウェブレンダリングがされてない純粋なページの要素データを読み込むことです。
Httpプロトコールは単純なソケット方法で要請(Request)と応答(Response)が終わればソケット接続を終わらせる流れです。
プロトコールの中でヘッダを定義して要請すればそのヘッダ値に合わせて応答することがHttpプロトコールです。
Httpプロトコールはソケットでたくさん使うオブジェクトです。それでC#にはHttpWebRequestのクラスがあってそれを簡単に接続してデータを取得できるようになっています。
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Http;
namespace Example
{
class Program
{
// HttpRequestを実行してウェブページからHtmlを取得する関数
public static string GetRequest(String url, HttpMethod method, object param = null)
{
// パラメータがある場合、データを匿名クラスで受け取るのでReflectionを利用してデータを読み込む。
if (param != null)
{
// Stringバッファ
var parameter = new StringBuilder();
// 「パラメータキー=パラメータ値&パラメータキー=パラメータ値」の形で作成する。
foreach (var p in param.GetType().GetProperties())
{
// バッファにデータがあれば「&」をつける。
if (parameter.Length > 0)
{
parameter.Append("&");
}
// 「パラメータキー=パラメータ値」の形で作成する。
parameter.AppendFormat("{0}={1}", p.Name, p.GetValue(param));
}
// パラメータをStringタイプに変換
param = parameter.ToString();
}
else
{
// パラメータをStringタイプに変換
param = "";
}
// Http methodがGETタイプの場合、パラメータをurlアドレスに後につける。
if (HttpMethod.Get.Equals(method))
{
// urlがホストだけなら「?」をつける。
if (url.Contains("?"))
{
url += "&" + param;
}
else
{
// urlでパラメータがある場合、「&」で連結する。
url += "?" + param;
}
}
// urlを通ってHttpWebRequestクラスを生成する。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
// ヘッダのメソッドを定義する。
request.Method = method.ToString();
// ヘッダのContentTypeを定義する。
request.ContentType = "application/x-www-form-urlencoded";
// requestのプロパティがないヘッダの場合にIndexerタイプ(Dictionaryみたいな文法)で設定できる。
// プロパティがあるヘッダの場合、下記とおりに設定するとエラーが発生する。
request.Headers["Upgrade-Insecure-Requests"] = "1";
// Http methodがPOSTタイプの場合
if (HttpMethod.Post.Equals(method))
{
// Stringをbyte[]タイプに変換する。
byte[] byteArray = Encoding.UTF8.GetBytes((string)param);
// ヘッダのコンテンツ長さを設定
request.ContentLength = byteArray.Length;
// ヘッダのストリームを取得する。
using (Stream dataStream = request.GetRequestStream())
{
// パラメータを設定
dataStream.Write(byteArray, 0, byteArray.Length);
}
}
// Httpプロトコールに接続してresponseを受け取る。
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
// プロトコールの応答コードを受け取ってコンソールに出力する。(200なら正常)
Console.WriteLine((int)response.StatusCode);
// ストリームで応答結果を受け取る。
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
// すべてStringデータを返却する。
return reader.ReadToEnd();
}
}
}
// 実行関数。
static void Main(string[] args)
{
// localhostにGetタイプで接続する。パラメータは「param=test」だ。
// http://localhost/index.php?param=test
String html = GetRequest("http://localhost/index.php", HttpMethod.Get, new { param = "test" });
// 結果をコンソールに出力
Console.WriteLine(html);
// localhostにPostタイプで接続する。パラメータは「param=test」だ。
html = GetRequest("http://localhost/index.php", HttpMethod.Post, new { param = "test" });
// 結果をコンソールに出力
Console.WriteLine(html);
Console.WriteLine("Press any key...");
Console.ReadKey();
}
}
}
上のソースをテストするようにPHPファイルを作成しましょう。
<?php
// NOTICEログは表示しない。
error_reporting(E_ALL & ~E_NOTICE);
// POSTタイプの場合、POST値を出力
echo "POST - ".$_POST["param"];
echo "<br />";
// GETタイプの場合、パラメータのデータを出力
echo "GET - ".$_GET["param"];
?>
「200」は応答コードでGetRequest関数の中でresponse.StatusCodeをコンソール出力したことです。「200」は正常です。
私がGetRequest関数を二回に呼び出したので、二つの結果を受け取りました。
始めはGETタイプで接続したので、GETの変数に「test」というデータがあります。
二つ目はPOSTタイプで接続したので、POSTの変数に「test」というデータがあります。
ここまでC#のHttpWebRequestを利用してウェブページを読み込みする方法に関する説明でした。
ご不明なところや間違いところがあればコメントしてください。
- [C#] EMailを送信する方法(System.Net.Mail)2020/04/22 19:00:42
- [C#] ini環境ファイルを使う方法2020/04/22 00:09:39
- [C#] 環境設定ファイルを扱う方法(System.Configuration)2020/04/20 19:37:57
- [C#] Reflectionを利用してクラス複製する方法2020/04/17 00:34:33
- [C#] XMLをXPathを利用してデータを取得する方法2020/04/16 00:47:17
- [C#] NSoupライブラリを利用してXMLとHTMLをパーシングする方法2020/04/14 19:34:15
- [C#] 日付フォーマット2020/04/09 20:53:20
- [C#] ログライブラリ(log4net)を設定する方法2020/04/08 13:04:22
- [C#] Zipの圧縮ファイルを解凍するコードを作成する方法2020/04/07 11:17:44
- [C#] Zip圧縮コードを作成する方法2020/04/06 14:56:13
- [C#] 数字フォーマット(お金表示及び小数点以下表示)2020/04/03 00:38:37
- [C#] コマンド(cmd)を実行する方法(Processクラス)2020/03/31 07:15:40
- [C#] FTPに接続してファイルダウンロード、アップロードする方法2020/03/27 19:20:14
- [C#] HttpWebRequestを利用してウェブページを読み込みする方法2020/03/27 00:23:19
- [C#] Base64のエンコード、デコードする方法2020/03/26 02:19:50
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07