HttpClient scrape Daten von der Website mit Login c #

c# html-agility-pack httpclient

Frage

Ich möchte einige Daten von der folgenden Website abschaben:

http://wttv.click-tt.de/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teambtable=1673669&pageState=rueckrunde&championship=SK+Bez.+BB+13%2F14&group=204559# .

Die Website enthält einige Daten über Tischtennis. Die aktuelle Saison kann ohne Login nur in den letzten Saisons mit Login aufgerufen werden. Für die aktuelle Saison habe ich bereits einen Code erstellt, um die Daten herauszuholen und es funktioniert gut. Ich verwende den HttpClient aus dem HtmlAgilityPack. Der Code sieht so aus:

            HttpClient http = new HttpClient();
            var response = await http.GetByteArrayAsync(website);
            String source = Encoding.GetEncoding("utf-8").GetString(response, 0, response.Length - 1);
            source = WebUtility.HtmlDecode(source);
            HtmlDocument resultat = new HtmlDocument();
            resultat.LoadHtml(source);

            Do something to get the relevant data from resultat by scanning the DocumentNodes from resultat...

Jetzt möchte ich die Daten von der Website holen, die eine Anmeldung benötigt. Hat jemand eine Idee dafür, wie man sich auf der Webseite anmeldet und die Daten bekommt? Der Login erfolgt durch Klick auf "Erbstößistorie freischalten ..." und Eingabe von Benutzername und Passwort.

Akzeptierte Antwort

Es gibt viele Möglichkeiten, eine Anmeldung an einer Website durchzuführen. Dies hängt von der Authentifizierungsmethode ab, die von der jeweiligen Site verwendet wird (Formularauthentifizierung, Standardauthentifizierung, Windows-Authentifizierung usw.). Normalerweise verwenden Websites die FormsAuthentication.

Um eine Anmeldung auf einer Standard-FormsAuthentication-Website mit dem HttpClient durchzuführen, müssen Sie den CookieContainer festlegen, da Authentifizierungsdaten für Cookies festgelegt werden.

In Ihrem speziellen Beispiel macht das Login-Formular einen POST zu jeder Seite in HTTPS, ich habe https://wttv.click-tt.de/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teambtable=1673669&pageState verwendet = Rückrunde & Meisterschaft = SK + Bez. + BB + 13% 2F14 & Gruppe = 204559 als ein Beispiel. Dies ist der Code, um die Anfrage mit HttpClient zu stellen:

var baseAddress = new Uri("https://wttv.click-tt.de/");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
    //usually i make a standard request without authentication, eg: to the home page.
    //by doing this request you store some initial cookie values, that might be used in the subsequent login request and checked by the server
    var homePageResult = client.GetAsync("/");
    homePageResult.Result.EnsureSuccessStatusCode();

    var content = new FormUrlEncodedContent(new[]
    {
        //the name of the form values must be the name of <input /> tags of the login form, in this case the tag is <input type="text" name="username">
        new KeyValuePair<string, string>("username", "username"),
        new KeyValuePair<string, string>("password", "password"),
    });
    var loginResult = client.PostAsync("/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teamtable=1673669&pageState=rueckrunde&championship=SK+Bez.+BB+13%2F14&group=204559", content).Result;
    loginResult.EnsureSuccessStatusCode();

    //make the subsequent web requests using the same HttpClient object
}

Viele Websites verwenden jedoch einige Javascript-geladene Formularwerte oder noch einige andere Captcha-Steuerelemente. Diese Lösung funktioniert natürlich nicht. Dies kann mit einem WebBrowser-Steuerelement geschehen (indem Sie die Benutzereingabe in Formularfeldern automatisieren und dann auf die Schaltfläche zum Anmelden klicken. Dieser Link enthält ein Beispiel: https://social.msdn.microsoft.com/Forums/vstudio/en- US / 0b77ca8c-48ce-4fa8-9367-c7491aa359b0 / Yahoo-Login-über-Systemnettsockets-Namespace? Forum = vbgeneral ).

Um zu überprüfen, wie die Anmeldung auf der von Ihnen gewünschten Website funktioniert, verwenden Sie bitte Fiddler: http://www.telerik.com/fiddler : Wenn Sie auf die Login-Schaltfläche auf Ihrer Website klicken, beobachten Sie Fiddler und finden Sie die Login-Anfrage (normalerweise die erste Anfrage, nachdem Sie auf die Schaltfläche "Login" geklickt haben und es sich in der Regel um eine POST-Anfrage handelt.

Überprüfen Sie dann die Anforderungsdaten (wählen Sie die Anforderung aus und wechseln Sie zur Registerkarte "Inspectors" - "TextView") und versuchen Sie, die Anforderung in Ihrem Code zu replizieren.

Auf der linken Seite befinden sich alle Anfragen, die von Fiddler abgefangen wurden, auf der rechten Seite befinden sich die Request- und Response-Inspektoren

Auf der linken Seite sind alle Anfragen, die von Fiddler abgefangen wurden, auf der rechten Seite befinden sich die Abfrage- und Antwort-Inspektoren (oben befinden sich Anfrageinspektoren, unten befinden sich die Antwort-Inspektoren)

Bearbeiten

Derselbe Code mit der alten WebRequest-Klasse: http://rextester.com/LLP86817

var cookieContainer = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://wttv.click-tt.de/");
request.CookieContainer = cookieContainer;
//set the user agent and accept header values, to simulate a real web browser
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";


//SET AUTOMATIC DECOMPRESSION
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

Console.WriteLine("FIRST RESPONSE");
Console.WriteLine();
using (WebResponse response = request.GetResponse())
{
    using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        Console.WriteLine(sr.ReadToEnd());
    }
}

request = (HttpWebRequest)HttpWebRequest.Create("https://wttv.click-tt.de/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teamtable=1673669&pageState=rueckrunde&championship=SK+Bez.+BB+13%2F14&group=204559");
//set the cookie container object
request.CookieContainer = cookieContainer;
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";

//set method POST and content type application/x-www-form-urlencoded
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";

//SET AUTOMATIC DECOMPRESSION
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

//insert your username and password
string data = string.Format("username={0}&password={1}", "username", "password");
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(data);

request.ContentLength = bytes.Length;

using (Stream dataStream = request.GetRequestStream())
{
    dataStream.Write(bytes, 0, bytes.Length);
    dataStream.Close();
}

Console.WriteLine("LOGIN RESPONSE");
Console.WriteLine();
using (WebResponse response = request.GetResponse())
{
    using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        Console.WriteLine(sr.ReadToEnd());
    }
}

//request = (HttpWebRequest)HttpWebRequest.Create("INTERNAL PROTECTED PAGE ADDRESS");
//After a successful login, you must use the same cookie container for all request
//request.CookieContainer = cookieContainer;

//....


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum