HttpClient raspa los datos del sitio web con inicio de sesión c #

c# html-agility-pack httpclient

Pregunta

Me gustaría raspar algunos datos del siguiente sitio web:

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

El sitio web contiene algunos datos sobre el tenis de mesa. Se puede acceder a la temporada actual sin iniciar sesión las últimas temporadas solo con el inicio de sesión. Para la temporada actual, ya he creado un código para obtener los datos y funciona bien. Estoy usando el HttpClient del HtmlAgilityPack. El código se ve así:

            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...

Ahora me gustaría obtener los datos del sitio web que necesita un inicio de sesión. ¿Alguien tiene una idea de cómo iniciar sesión en el sitio web y obtener los datos? El inicio de sesión debe hacerse haciendo clic en "Ergebnishistorie freischalten ..." y luego ingresando el nombre de usuario y la contraseña.

Respuesta aceptada

Hay muchas formas de iniciar sesión en un sitio web, y eso depende del método de autenticación utilizado por el sitio específico (autenticación de formularios, autenticación básica, autenticación de Windows, etc.). Normalmente los sitios web utilizan la autenticación de formularios.

Para realizar un inicio de sesión en un sitio web estándar de FormsAuthentication utilizando el HttpClient, debe configurar el CookieContainer, porque los datos de autenticación se establecerán en las cookies.

En su ejemplo específico, el formulario de inicio de sesión hace un POST a cualquiera de las páginas en HTTPS, utilicé https://wttv.click-tt.de/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teamtable=1673669&pageState = rueckrunde y campeonato = SK + Bez. + BB + 13% 2F14 y grupo = 204559 como ejemplo. Este es el código para realizar la solicitud utilizando HttpClient:

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
}

Sin embargo, muchos sitios web utilizan algunos valores de formulario cargados en javascript o incluso más controles de captcha, y obviamente esta solución no funcionará. Esto podría hacerse como se dijo con un control WebBrowser (al automatizar la entrada del usuario en los campos de formulario y luego hacer clic en el botón de inicio de sesión, este enlace tiene un ejemplo: https://social.msdn.microsoft.com/Forums/vstudio/en- US / 0b77ca8c-48ce-4fa8-9367-c7491aa359b0 / yahoo-login-via-systemnetsockets-namespace? Forum = vbgeneral ).

Como regla general para inspeccionar cómo funciona el inicio de sesión en su sitio web deseado, use Fiddler: http://www.telerik.com/fiddler : cuando haga clic en el botón de inicio de sesión en su sitio web, mire Fiddler y busque la solicitud de inicio de sesión (generalmente es la primera solicitud justo después de hacer clic en el botón "Iniciar sesión", y generalmente es una solicitud POST).

Luego inspeccione los datos de la solicitud (seleccione la solicitud y vaya a la pestaña "Inspectores" - "TextView") e intente replicar la solicitud en su código.

En el panel izquierdo hay todas las solicitudes interceptadas por Fiddler, en el panel derecho están los inspectores de solicitudes y respuestas

En el panel izquierdo hay todas las solicitudes interceptadas por Fiddler, en el panel derecho están los inspectores de solicitud y respuesta (en la parte superior hay inspectores de solicitud, en la parte inferior están los inspectores de respuesta)

Editar

El mismo código con la antigua clase de solicitud de Web: http://rextester.com/LLP86817

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
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué