Htmlagilitypack después de iniciar sesión

c# facebook html-agility-pack httprequest

Pregunta

Quiero analizar algún sitio HTML como Facebook,
Por ejemplo (www.facebook.com/somePage)
Si quiero pegar este enlace a mi explorador, me redirige para iniciar sesión en mi cuenta primero. Así que no veo esa página. Así que no puedo usar Htmlagilitypack para obtener respuesta.
Entonces, ¿cómo puedo iniciar sesión en el sitio de manera programática (sin usar el control del navegador web) y luego llamar a esa página de Facebook y obtener respuesta y analizar con Htmlagility pack. Sé cómo puedo usar el paquete HtmlAgility y sé cómo configurar las cookies con Httprequest. Utilizo el siguiente código para configurar las cookies, pero después, ¿cómo puedo analizar esa página?

CookieCollection cookies = new CookieCollection();
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.facebook.com");
            request.CookieContainer = new CookieContainer();
            request.CookieContainer.Add(cookies);
            //Get the response from the server and save the cookies from the first request..
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            cookies = response.Cookies;
            response.Close();
        }
        catch (WebException)
        {
            MessageBox.Show("error");
        }

        string getUrl = "https://www.facebook.com/login.php?login_attempt=1";
        string postData = String.Format("email={0}&pass={1}", "xxxx@hotmail.com", "xxxxx");
        HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
        getRequest.CookieContainer = new CookieContainer();
        getRequest.CookieContainer.Add(cookies); //recover cookies First request
        getRequest.Method = WebRequestMethods.Http.Post;
        getRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
        getRequest.AllowWriteStreamBuffering = true;
        getRequest.ProtocolVersion = HttpVersion.Version11;
        getRequest.AllowAutoRedirect = true;
        getRequest.ContentType = "application/x-www-form-urlencoded";

        byte[] byteArray = Encoding.ASCII.GetBytes(postData);
        getRequest.ContentLength = byteArray.Length;
        Stream newStream = getRequest.GetRequestStream(); //open connection
        newStream.Write(byteArray, 0, byteArray.Length); // Send the data.
        newStream.Close();
        //How I parse (www.facebook.com/somePage) here?
       HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
       HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse();
       using (StreamReader sr = new StreamReader(getResponse.GetResponseStream(), Encoding.GetEncoding("windows-1251")))
        {

            doc.LoadHtml(sr.ReadToEnd());

        }

        foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
        {
            listBox1.Items.Add(link.InnerHtml);
        }

Respuesta aceptada

En su HttpWebRequest llame al método GetResponse . Esto produce un objeto WebResponse en el que puede llamar a GetResponseStream() para obtener los contenidos.

Como Facebook no devuelve casi ningún contenido HTML (envían una carga de Javascript para que el navegador genere el documento), HtmlAgilityPack realmente no te ayudará. Descargará el Javascript, pero no podrá ejecutarlo, por lo que está atascado con un documento que es difícil de interpretar.

Otros paquetes Html, como Awesonium o PhantomJS, pueden ejecutar el Javascript y devolverle el HtmlDomDocument interpretado. Estos no requerirán que ejecute todo el navegador, ambos pueden funcionar sin cabeza (ya que se llama para ejecutar un navegador sin una interfaz de usuario en la parte superior).

Alternativamente, use la API de Facebook Graph para acceder a los datos en Facebook sin analizar el HTML, es mucho más estable y está diseñado para el propósito exacto de interactuar con los datos en Facebook.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow