22

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

追加情報:

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

5 に答える 5

24

フォームに記入したかのようにリクエストを作成します。たとえば、それが 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;

多分。

于 2009-06-10T13:11:53.297 に答える
6

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

あなたがそのように行くなら、さらにいくつかの提案:

  1. コントロールが Flash などのアドインをロードしないようにすることができます。時間を節約できます。
  2. ログインすると、DOM から必要な情報を取得できます。生の HTML を解析する必要はありません。
  3. 将来サイトが変更された場合に備えてツールの移植性をさらに高めたい場合は、明示的な DOM 操作を JavaScript のインジェクションに置き換えることができます。JS は外部リソースから取得でき、呼び出されると、フィールドの入力と送信を実行できます。
于 2009-06-10T13:44:13.933 に答える
3

場合によって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;
于 2015-11-27T05:06:29.223 に答える
1

dlambin answer への追加として必要です

http.AllowAutoRedirect=false;

さもないと

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;

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

于 2012-02-25T12:07:20.270 に答える
0

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

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

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

于 2009-06-10T13:13:20.267 に答える