¿Cómo identificar si el tweet es original o retwittea al raspar con HtmlAgilityPack?

c# filter html-agility-pack tweetr web-scraping

Pregunta

Quería tweets de usuario de Twitter para el análisis de datos. Para eso he usado el paquete HtmlAgilityPack para raspar Twitter y me da 30 tweets principales.

Reconocí el elemento de texto de tweet y busqué todos los tweets. Pero quiero identificar si es un tweet o un retweet. ¿Cómo puedo hacer eso?

He analizado HTML. En el retweet habrá un elemento que tiene una clase tweet-context with-icn . Pero cuando hago un tweet en esa clase, se lanza una excepción nula, porque no todos los tweets tendrán esa clase. Luego, en función de qué y cómo puedo saber si se trata de un retweet o no.

Código:

HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load("https://twitter.com/BarackObama");

var TweetsNode= doc.DocumentNode.SelectNodes("//tr[@class='tweet-container']").ToList();

foreach (var item in TweetsNode)
{
    var tweet = new Tweets
    {
        console.WriteLine(item.innertext);
    };
}

En el código anterior, he tratado de obtener tweets del perfil de Barack Obama. Estoy recibiendo top 30 tweets. ¿Cómo puedo reconocer cuál es el retweet?
Gracias.

Respuesta aceptada

Raspando Twitter 101

  1. Obtenga todos los tweets de una página (que viene en tablas prácticas <table class='tweet '> )

    HtmlWeb p = new HtmlWeb();
    var doc = p.Load(@"https://twitter.com/dailygametips");
    var nodes = doc.DocumentNode.SelectNodes("//table[@class='tweet  ']");
    
  2. Busque en los nodos el <span class='context'> para indicar que este tweet es un retweet.

    List<Tweet> tweets = new List<Tweet>();
    foreach (var node in nodes)
    {
        bool isRetweet = false;
        var spanNode = node.SelectSingleNode(".//span[@class='context']");
        if (spanNode != null && spanNode.InnerHtml.Contains("retweeted"))
        {
            isRetweet = true;
        }
    
  3. También queremos el texto del mensaje, así que deseche el siguiente <div class='tweet-text'> :

        string msg = string.Empty;
        var msgNode = node.SelectSingleNode(".//div[@class='tweet-text']");
        if (msgNode != null)
        {
            msg = msgNode.InnerText.Trim();
        }
        tweets.Add(new Tweet(msg, isRetweet));
    }
    

Adicional a la Clase Contenedor de Tweet:

class Tweet
{
    public Tweet(string message, bool isRetweet)
    {
        Message = message;
        IsRetweet = isRetweet;
    }

    string Message { get; private set; }
    bool IsRetweet { get; private set; }
}

Como dices, esto no es realmente ciencia espacial. Pero necesitas entender los principios básicos de XPath y Scrapping.



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é