2009-12-23 4 views
0

Notre situation: Notre équipe a besoin de récupérer des informations de journal à partir d'un site Web tiers (Plus précisément, ce journal informations est les journaux d'appels - notre client loue un 866 Lorsque les appels arrivent, ils aident personnes et ont besoin de prendre des notes en conséquence dans notre application qui correspondra à l'appel en cours ). Notre client a un compte Web avec le tiers qui leur permet d'afficher les journaux d'appels en cours (date/heure, numéro de téléphone, la durée de chaque appel, etc.).Récupération de pages HTML à partir d'un site Web de connexion tiers avec ASP.NET

J'ai contacté le développeur de leur site Web et je me suis renseigné sur API ou tout autre moyen de synchronisation notre base de données avec leur base de données mise à jour en permanence. Actuellement, ils ne prennent pas en charge l'API. I les a informés de ma situation et ils sont parfaitement bien d'une manière quelconque, nous pouvons récupérer les informations (bot/crawler). * La 3ème partie a dit qu'ils travaillaient sur l'API mais ne pouvaient pas nous donner un temps général pour savoir quand elle sera en place ... et comme pour chaque client, ils doivent commencer la production dès que possible.

Je comprends parfaitement que si la 3ème partie devait changer leur mise en page HTML, cela pourrait nous causer un léger mal de tête (tri des données de la page Web). Cela étant dit, il s'agit d'une solution temporaire à un problème à long terme. Une fois qu'ils auront implémenté leur API, nous les changerons.

Alors ma question est la suivante: Quelle est la meilleure façon de se connecter sur le site Web 3ème partie (voir l'image: http://i903.photobucket.com/albums/ac239/jreedinc/customtf.jpg) et récupérer certaines pages HTML? Nous avons examiné les codes source des webcrawlers, mais aucun d'eux n'a la capacité de stocker des cookies et de publier des informations sur le site Web (avec des informations de connexion). Nous préférerions le faire dans ASP.NET.

Existe-t-il une autre façon de se connecter au site Web, puis de récupérer ces informations?

Répondre

0

J'ai utilisé un outil récemment appelé WebQL (son un outil de grattoir web qui permet l'utilisation de développeur SQL comme syntaxe pour gratter les informations des pages Web.

WebQL on Wikipedia

0

Ceci est en fait une opération relativement simple. Qu'est-ce que vous devez faire est d'obtenir la page que la capture d'écran affiche (quelque chose comme login.php, etc) et ensuite construire un webrequest à cette page avec les données de connexion que vous avez.Vous aurez très probablement récupérer un cookiecontainer qui sera avoir votre cookie de connexion à utiliser pour toutes les demandes ultérieures

Vous pouvez regarder ce MSDN article pour les bases de la façon de le faire, mais leur écriture est un peu confuse. Regardez les commentaires de la communauté à la fin pour un exemple de comment poster les variables de la page (comme le nom d'utilisateur et mot de passe). Vous devrez vous assurer que vous passez le cookiecontainer sur les demandes suivantes.

Malheureusement, .NET n'a pas quelque chose comme WWW :: Mechanize, mais le Webclient a une "valeur de téléchargement" qui pourrait le rendre plus facile. Vous devrez toujours analyser manuellement la page pour déterminer quels champs vous devez transmettre.

2

Les classes que vous devrez utiliser sont dans l'espace de noms System.Net. Voici un code de preuve de concept rapide et sale. Pour vous connecter à un site qui utilise le formulaire de connexion + cookies pour la sécurité, puis grattez la sortie HTML d'une page.

Afin d'analyser les résultats HTML, vous devrez utiliser un outil supplémentaire.

Outils d'analyse HTML possibles. SgmlReader, peut convertir HTML en XML. Vous utilisez ensuite les fonctionnalités XML de .NET pour extraire des données du XML.
http://code.msdn.microsoft.com/SgmlReader

HTML Agility Pack, permet des requêtes XPath sur des documents HTML.
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 

// échantillon à utiliser la classe

WebWorker worker = new WebWorker(); 
worker.Login("http://localhost/test/default.aspx", "uid", "bob", "pwd", "secret"); 
worker.GetWebPageContent("http://localhost/test/default.aspx"); 
Questions connexes