2009-12-23 95 views
0

我們的情況: 我們的團隊需要從第三方網站檢索日誌信息(具體而言,此日誌 信息是通話記錄 - 我們的客戶租用866號碼,當來電時,他們協助 人,並且需要在我們的應用程序中做相應的記錄,這將與當前通話的 相對應)。我們的客戶在第三方有一個網絡帳戶,允許他們查看當前的通話記錄(日期/時間,電話號碼,每次通話時間等) 。使用ASP.NET從第三方登錄網站檢索HTML頁面

我聯繫了他們網站的開發人員,並詢問了API或其他方法將我們的數據庫與他們不斷更新的數據庫進行同步 。他們目前不支持API。我 通知他們我的情況,他們完全沒問題,我們可以通過任何方式檢索 信息(bot/crawler)。 *第三方表示,他們正在研究的API,但不能給我們 一般的時間表何時將達到...並且與每一位客戶,他們需要儘快開始 生產。

我完全理解,如果第三方改變他們的HTML佈局,它可能會導致我們輕微的頭痛(從網頁排序數據)。這就是說,這是一個解決長期問題的臨時解決方案 。一旦他們實現了他們的API,我們會將它們切換到它。

所以我的問題是這樣的: 什麼是登錄到第三方網站的最佳方式(見圖片:http://i903.photobucket.com/albums/ac239/jreedinc/customtf.jpg) 和檢索某些HTML頁面?我們已經審查了webcrawlers的源代碼,但它們都不具備存儲cookies並將信息發回網站的功能(以登錄信息的形式)。我們希望在ASP.NET中執行此操作。

有另一種方式來完成登錄到網站,然後檢索上述信息?

回答

0

我用了一個最近呼籲WebQL(其網絡刮刀工具的工具,讓開發人員使用SQL的語法來從網頁刮信息。

WebQL on Wikipedia

0

這實際上是一個相對簡單的操作。什麼你需要做的就是在頁面的截圖帖回(像login.php中,等等),然後建立一個WebRequest的,以頁面,你必須登錄數據。你很可能會得到一個的CookieContainer即會請將您的登錄Cookie用於所有後續請求。

你可以看一下這個MSDN article對於如何做到這一點的基礎知識,但他們寫了是一種混亂。查看最後的社區評論,瞭解如何發佈頁面變量(例如用戶名和密碼)的示例。您需要確保您在隨後的請求中傳遞cookiecontainer。

不幸的是,.NET本身並沒有像WWW :: Mechanize這樣的東西,但Webclient確實有一個「上傳值」,這可能會使它更容易。您仍然必須手動解析頁面以確定需要傳遞的字段。

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");