0

私たちの状況: 私たちのチームは、サード パーティの Web サイトからログ情報を取得する必要があります (具体的には、このログ情報は通話ログです。クライアントは 866 番号を借りています。電話がかかってくると、彼らは人々を支援し、それに応じてアプリケーションにメモを作成する必要があります。現在の呼び出しに対応します)。私たちのクライアントは、現在の通話ログ (日付/時刻、電話番号、各通話の時間など) を表示できるサードパーティの Web アカウントを持っています。

私は彼らのウェブサイトの開発者に連絡し、API や、私たちのデータベースを常に更新しているデータベースと同期させる他の手段について尋ねました。現在、API をサポートしていません。私は彼らに私の状況を伝えましたが、彼らは私たちが情報を取得できる方法 (ボット/クローラー) にまったく問題ありません。*サードパーティは、API に取り組んでいると述べましたが、それがいつ稼働するかについての一般的なタイムラインを提供できませんでした...そして、すべてのクライアントと同様に、彼らはできるだけ早く生産を開始する必要があります.

サード パーティが HTML レイアウトを変更した場合、(Web ページからのデータの並べ替えで) 少し頭痛の種になる可能性があることを完全に理解しています。そうは言っても、これは長期的な問題に対する一時的な解決策です。彼らがAPIを実装したら、私たちは彼らをそれに切り替えます。

私の質問は次のとおりです: サード パーティの Web サイト (画像を参照: http://i903.photobucket.com/albums/ac239/jreedinc/customtf.jpg ) にログインして特定の HTML ページを取得する最良の方法は何ですか? ウェブクローラーのソース コードを確認しましたが、Cookie を保存し、情報をウェブサイトに (ログイン情報と共に) 送信する機能を備えたものはありません。ASP.NET でこれを行うことをお勧めします。

Web サイトにログオンして、その情報を取得する別の方法はありますか?

4

3 に答える 3

2

使用する必要があるクラスは、System.Net 名前空間にあります。以下は、概念コードの簡単で汚れた証明です。セキュリティのためにフォーム ログイン + Cookie を使用するサイトにログインし、ページの HTML 出力をスクレイピングすること。

HTML の結果を解析するには、追加のツールを使用する必要があります。

可能な HTML 解析ツール。

SgmlReader は、HTML を XML に変換できます。次に、.NET の XML 機能を使用して、XML からデータを抽出します。
http://code.msdn.microsoft.com/SgmlReader

HTML Agility Pack は、HTML ドキュメントに対する XPath クエリを許可します。
http://htmlagilitypack.codeplex.com/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


class WebWorker {

 /// <summary>  
 /// Cookies for use by web worker  
 /// </summary>  
 private System.Collections.Generic.List `<System.Net.Cookie` > cookies = new List < System.Net.Cookie > ();


 public string GetWebPageContent(string url) {
  System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);
  System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer();
  request.CookieContainer = cookieContainer;
  request.Method = "GET";

  //add cookies to maintain session state  
  foreach(System.Net.Cookie c in this.cookies) {
   cookieContainer.Add(c);
  }



  System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse;


  System.IO.Stream responseStream = response.GetResponseStream();

  System.IO.StreamReader sReader = new System.IO.StreamReader(responseStream);

  System.Diagnostics.Debug.WriteLine("Content:\n" + sReader.ReadToEnd());


  return sReader.ReadToEnd();

 }

 public string Login(string url, string userIdFormFieldName, string userIdValue, string passwordFormFieldName, string passwordValue) {

  System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);
  System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer();
  request.CookieContainer = cookieContainer;
  request.Method = "POST";
  request.ContentType = "application/x-www-form-urlencoded";
  string postData = System.Web.HttpUtility.UrlEncode(userIdFormFieldName) + "=" + System.Web.HttpUtility.UrlEncode(userIdValue) +
   "&" + System.Web.HttpUtility.UrlEncode(passwordFormFieldName) + "=" + System.Web.HttpUtility.UrlEncode(passwordValue);

  request.ContentLength = postData.Length;

  request.AllowAutoRedirect = false; //allowing redirect seems to loose cookies  
  byte[] postDataBytes = System.Text.Encoding.UTF8.GetBytes(postData);
  System.IO.Stream requestStream = request.GetRequestStream();
  requestStream.Write(postDataBytes, 0, postDataBytes.Length);
  System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse;

  // System.Diagnostics.Debug.Write(WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());  

  System.IO.Stream responseStream = response.GetResponseStream();

  System.IO.StreamReader sReader = new System.IO.StreamReader(responseStream);

  System.Diagnostics.Debug.WriteLine("Content:\n" + sReader.ReadToEnd());
  this.cookies.Clear();

  if (response.Cookies.Count > 0) {
   for (int i = 0; i < response.Cookies.Count; i++) {
    this.cookies.Add(response.Cookies[i]);
   }
  }

  return "OK";
 }


} //end class  

// クラスを使用するサンプル

WebWorker worker = new WebWorker();  
worker.Login("http://localhost/test/default.aspx", "uid", "bob", "pwd", "secret");  
worker.GetWebPageContent("http://localhost/test/default.aspx");  
于 2009-12-23T21:01:08.170 に答える
0

これは実際には比較的簡単な操作です。あなたがする必要があるのは、スクリーンショットが投稿するページ(login.phpなど)を取得し、あなたが持っているログインデータを使ってそのページへのウェブリクエストを作成することです。ほとんどの場合、後続のすべてのリクエストで使用するログインCookieを持つCookieコンテナが返されます。

その方法の基本については、このMSDNの記事を参照してください。ただし、それらの記述はやや混乱を招きます。バックページ変数(ユーザー名やパスワードなど)を投稿する方法の例については、最後にあるコミュニティのコメントを参照してください。後続のリクエストでは、必ずcookiecontainerを渡す必要があります。

残念ながら、.NETにはWWW :: Mechanizeのようなものはネイティブにはありませんが、Webクライアントにはそれを簡単にする「アップロード値」があります。渡す必要のあるフィールドを特定するには、ページを手動で解析する必要があります。

于 2009-12-23T20:54:47.233 に答える
0

最近WebQLと呼ばれるツールを使用しました(開発者がSQLのような構文を使用してWebページから情報をスクレイピングできるWebスクレイパーツールです。

ウィキペディアのWebQL

于 2009-12-23T20:42:38.363 に答える