自分のものではない Web サイトからの情報が必要です。この情報を取得するには、Web サイトにログインして情報を収集する必要があります。これは HTML フォームを介して行われます。C# でこの認証済みスクリーンスケーピングを行うにはどうすればよいですか?
追加情報:
- Cookie ベースの認証。
- POST アクションが必要です。
自分のものではない Web サイトからの情報が必要です。この情報を取得するには、Web サイトにログインして情報を収集する必要があります。これは HTML フォームを介して行われます。C# でこの認証済みスクリーンスケーピングを行うにはどうすればよいですか?
追加情報:
フォームに記入したかのようにリクエストを作成します。たとえば、それが POST であると仮定すると、正しいデータを使用して POST 要求を行います。スクレイピングしたい同じページに直接ログインできない場合は、ログイン リクエストの後に設定された Cookie を追跡し、それらをスクレイピング リクエストに含めて、ログイン状態を維持できるようにする必要があります。
次のようになります。
HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest;
http.KeepAlive = true;
http.Method = "POST";
http.ContentType = "application/x-www-form-urlencoded";
string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword;
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData);
http.ContentLength = dataBytes.Length;
using (Stream postStream = http.GetRequestStream())
{
postStream.Write(dataBytes, 0, dataBytes.Length);
}
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
// Probably want to inspect the http.Headers here first
http = WebRequest.Create(url2) as HttpWebRequest;
http.CookieContainer = new CookieContainer();
http.CookieContainer.Add(httpResponse.Cookies);
HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse;
多分。
WebBrowserコントロールを使用できます。サイトの URL を入力し、DOM を使用してユーザー名とパスワードを適切なフィールドに設定し、最後に送信ボタンをクリックします。この方法では、2 つの入力フィールドと送信ボタン以外は気にしません。Cookie の処理、未加工の HTML 解析、HTTP スニッフィングはありません。これらはすべてブラウザー コントロールによって行われます。
あなたがそのように行くなら、さらにいくつかの提案:
場合によってhttpResponse.Cookies
は空白になります。CookieContainer
代わりにを使用してください。
CookieContainer cc = new CookieContainer();
HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest;
http.KeepAlive = true;
http.Method = "POST";
http.ContentType = "application/x-www-form-urlencoded";
http.CookieContainer = cc;
string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword;
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData);
http.ContentLength = dataBytes.Length;
using (Stream postStream = http.GetRequestStream())
{
postStream.Write(dataBytes, 0, dataBytes.Length);
}
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
// Probably want to inspect the http.Headers here first
http = WebRequest.Create(url2) as HttpWebRequest;
http.CookieContainer = cc;
HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse;
dlambin answer への追加として必要です
http.AllowAutoRedirect=false;
さもないと
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
最初の URL に対して別のリクエストが行われ、url2 を取得できなくなります。
HTTPWebRequest を使用して POST を実行する必要があります。このリンクは、開始するのに役立ちます。重要なのは、投稿しようとしているページの HTML フォームを見て、投稿を送信するためにフォームが必要とするすべてのパラメーターを確認する必要があるということです。
http://www.netomatix.com/httppostdata.aspx
http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx