web-dev-qa-db-ja.com

プログラムでWebサイトにログインしてスクリーンスケープする方法は?

私以外のWebサイトの情報が必要です。この情報を取得するには、Webサイトにログインして情報を収集する必要があります。これは、HTMLフォームを介して行われます。 C#でこの認証済みスクリーンキャプチャを行うにはどうすればよいですか?

追加情報:

  • Cookieベースの認証。
  • POSTアクションが必要です。
22
Tamara Wijsman

あなたはちょうどあなたがフォームに記入したかのようにリクエストをするでしょう。 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;

多分。

23
dlamblin

WebBrowser コントロールを使用できます。サイトのURLをフィードし、DOMを使用してユーザー名とパスワードを適切なフィールドに設定し、最終的にクリックを送信ボタンに送信します。この方法では、2つの入力フィールドと送信ボタン以外は何も気にしません。 Cookieの処理、生のHTML解析、HTTPスニッフィングはありません。これらはすべてブラウザコントロールによって行われます。

そのようにした場合、さらにいくつかの提案:

  1. コントロールがFlashなどのアドインをロードしないようにして、時間を節約できます。
  2. ログインすると、DOMから必要な情報を取得できます。生のHTMLを解析する必要はありません。
  3. 将来サイトが変更された場合に備えてツールをさらに移植しやすくしたい場合は、明示的なDOM操作をJavaScriptの注入に置き換えることができます。 JSは外部リソースから取得でき、呼び出されるとフィールドの作成と送信を実行できます。
5
eran

場合によっては、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;
3
Ppp

ダンビンアンサーへの追加として

http.AllowAutoRedirect=false;

さもないと

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;

最初のURLに対して別のリクエストが行われ、url2を取得できなくなります。

1
Eugeniu Torica

HTTPWebRequestを使用してPOSTを実行する必要があります。このリンクはあなたが始めるのに役立つはずです。重要なのは、投稿しようとしているページのHTMLフォームを見て、投稿を送信するためにフォームに必要なすべてのパラメーターを確認する必要があることです。

http://www.netomatix.com/httppostdata.aspx

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

0
BFree