0

我想要用户的 Twitter 推文进行数据分析。为此,我使用了HtmlAgilityPack包来抓取 Twitter,它给了我 30 条热门推文。

我识别了 tweet-text 元素并获取了所有推文。但我想确定它是推文还是转推。我怎样才能做到这一点?

我已经分析了 HTML。在转推中将有一个具有tweet-context with-icn类的元素。但是,当我在该类上抓取推文时,它会引发空异常,因为并非所有推文都具有该类。然后基于什么以及如何抓取以了解它是否转发?

代码:

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);
    };
}

在上面的代码中,我试图获取巴拉克奥巴马个人资料的推文。我收到了前 30 条推文。我如何识别哪一个是转发的?
谢谢你。

4

1 回答 1

1

抓取 Twitter 101

  1. 从页面获取所有推文(方便的表格<table class='tweet '>

    HtmlWeb p = new HtmlWeb();
    var doc = p.Load(@"https://twitter.com/dailygametips");
    var nodes = doc.DocumentNode.SelectNodes("//table[@class='tweet  ']");
    
  2. 在节点中查找<span class='context'>to 表示此推文是转推。

    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. 我们还想要消息文本,所以接下来将其废弃<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));
    }
    

添加 Tweet 容器类:

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

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

正如你所说,这不是真正的火箭科学。但是您需要了解 XPath 和 Scrapping 的基本原理。

于 2018-06-11T14:27:35.800 回答