Webサイトにプログラム的にログインしてスクリーンスケープを作成する方法は?
-
13-09-2019 - |
質問
私のものではないウェブサイトからいくつかの情報が必要です。この情報を取得するには、情報を収集するためにWebサイトにログインする必要があります。これはHTMLフォームを介して発生します。 C#でこの認証されたスクリーンスケーピングを行うにはどうすればよいですか?
追加情報:
- Cookieベースの認証。
- 必要なポストアクション。
解決
フォームに記入したようにリクエストを行うでしょう。たとえば、それが投稿であると仮定すると、正しいデータを使用して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;
多分。
他のヒント
使用できます ウェブブラウザ コントロール。サイトのURLにフィードしてから、DOMを使用してユーザー名とパスワードを適切なフィールドに設定し、最終的に[送信]ボタンにクリックします。これにより、2つの入力フィールドと送信ボタン以外は何も気にしません。クッキーの取り扱いも、生のHTML解析も、HTTPスニッフィングもありません - ブラウザコントロールによって行われます。
あなたがそのように行くなら、もう少し提案:
- Flashなどのアドインのロードが制御されないようにすることができます。時間を節約できます。
- ログインしたら、DOMから必要な情報を取得できます。生のHTMLを解析する必要はありません。
- サイトが将来変更された場合に備えて、ツールをさらにポータブルにしたい場合は、明示的なDOM操作をJavaScriptの注入に置き換えることができます。 JSは外部リソースから取得でき、一度呼び出されると、フィールドの母集団と提出を行うことができます。
場合によっては、 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;
ドラミンの答えに加えて、持っている必要があります
http.AllowAutoRedirect=false;
さもないと
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
初期のURLに別のリクエストが行われ、URL2を取得できなくなります。
httpwebrequestを使用して投稿する必要があります。このリンクは、始めるのに役立つはずです。重要なのは、投稿を送信するためにフォームが必要とするすべてのパラメーターを表示するために投稿しようとしているページのHTMLフォームを確認する必要があることです。
http://www.netomatix.com/httppostdata.aspx
http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx