He estado tratando de descargar un perfil público de Instagram para obtener estadísticas como seguidores y biografía. He estado haciendo esto en una aplicación de consola de C # y descargando el HTML usando HTML Agility Pack.

Código:

string url = @"https://www.instagram.com/" + Console.ReadLine() + @"/?hl=en";
Console.WriteLine();

HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(url);
document.Save(path1);

Cuando lo guardo, todo lo que obtengo es un montón de scripts y una pantalla en blanco:

enter image description here

Me preguntaba cómo guardar el html una vez que todos los scripts se ejecutaron y formaron el contenido.

0
user8162574 15 jun. 2017 a las 11:47

3 respuestas

La mejor respuesta

RESPONDER

¡Gracias por las sugerencias sobre cómo descargar el HTML! Logré devolver alguna información de instagram al final. Aquí está el código:

//(This was done using HTML Agility Pack)

string url = @"https://www.instagram.com/" + Console.ReadLine() + @"/?hl=en";

HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(url);

var metas = document.DocumentNode.Descendants("meta");
var followers = metas.FirstOrDefault(_ => _.HasProperty("name", "description"));

if (followers == null) { Console.WriteLine("Sorry, Can't Find Profile :("); return; }

var content = followers.Attributes["content"].Value.StopAt('-');

Console.WriteLine(content);

Y HasProperty () y StopAt ()

public static bool HasProperty(this HtmlNode node, string property, params string[] valueArray)
{
    var propertyValue = node.GetAttributeValue(property, "");
    var propertyValues = propertyValue.Split(' ');
    return valueArray.All(c => propertyValues.Contains(c));
}

public static string StopAt(this string input, char stopAt)
{
    int x = input.IndexOf(stopAt);
    return input.Substring(0, x);
}

Nota:

Sin embargo, esta todavía no es la respuesta que estoy buscando. Todavía tengo un fragmento de HTML que no está estructurado de la misma manera que el HTML que recibo cuando lo miro en Google Chrome. Haciendo un poco de búsqueda en el HTML, logré escalar el html sin contenido para una metaetiqueta que contiene el contenido. Esto está bien para esto, pero si voy a continuar este método para encontrar contenido HTML, entonces puede que no sea lo mismo :(

0
user8162574user8162574 15 jun. 2017 a las 16:49
    public MainWindow()
    {
        InitializeComponent();
        WB_1.Navigate(@"https://www.instagram.com/" + Console.ReadLine() + @"/?hl=en");

        WB_1.LoadCompleted += wb_LoadCompleted;
    }

    void wb_LoadCompleted(object sender, NavigationEventArgs e)
    {
        dynamic doc = WB_1.Document;
        string htmlText = doc.documentElement.InnerHtml;
    }
0
15 jun. 2017 a las 11:13

Cuando recupera contenido mediante una solicitud web, devuelve un documento HTML que luego es procesado por el navegador para mostrar el contenido.

En este momento, está guardando el documento HTML que le dio el servidor. En lugar de hacer esto, debe renderizarlo antes de obtener los detalles. Una forma de hacerlo es usar un control de navegador web. Si configura la URL en la URL de instragram, deje que el motor de representación lo maneje y una vez que el control active el evento de carga, puede obtener la salida HTML representada.

A partir de ahí, puede deserializar como un documento Xml e identificar exactamente qué detalles necesita recuperar de la salida renderizada.

0
Nathangrad 15 jun. 2017 a las 08:58