【问题标题】:twitteR package skipping tweets?推特包跳过推文?
【发布时间】:2016-06-16 22:28:07
【问题描述】:

我正在尝试使用 twitteR 包来抓取一系列公共 Twitter 个人资料,然后将这些推文收集到数据库中。我遇到的问题是 API 似乎没有收集可用推文的全部。

这是我的代码:

library(RColorBrewer)
library(NLP)
library(twitteR)
library(foreign)
library(wordcloud)
library(tm)
library(base64enc)
library(httr)

access_token<-"" #not including these, but the oauth works for me
access_secret<-""
consumer_key<-""
consumer_secret<-"" 

###Scrapes Twitter Account

setup_twitter_oauth(consumer_key, consumer_secret, access_token, access_secret)
set.seed(123)
user.tweets<-userTimeline('@HillaryClinton', n=3200)
df<-twListToDF(user.tweets)

此代码从希拉里克林顿的推特页面抓取 340 条推文。但她有超过 8,000 条推文,所以我很困惑为什么它只抓取这些。我查看了最早推文的日期,是今年 4 月 27 日。这是 API 只收集到那个日期的问题吗?

我不认为 是这种情况,因为我也在朋友的 Twitter 个人资料中使用了此代码。这仅收集了他 451 条推文中的 106 条,但它一直追溯到 2013 年。但在这种情况下,它跳过了他撰写的一些推文(它们不是转发)。

我的代码中是否缺少某些内容,我缺少的 userTimeline 函数是否存在限制?

谢谢。

【问题讨论】:

    标签: r twitter


    【解决方案1】:

    您的代码似乎是正确的,因为它也适用于我,实际上,我以前使用过这个包并处理过类似的问题。

    在努力理解为什么会发生这种情况后,我发现这是由于 API 限制,请检查here。我相信这是可以避免的,因此您可以获得更多推文。然而,这将意味着抓取 Twitter 和更多的代码行。

    解决这个问题的一种方法可能是在你的 for 循环中使用一些计时器,例如:

    user.tweets<-userTimeline('@HillaryClinton', n=3200)
    df<-twListToDF(user.tweets)
    for(i in 1:100){
    user.tweets<-userTimeline('@HillaryClinton', n=3200)
    df<-rbind(user.tweets)
    Sys.sleep(900)
    }
    

    这样,您每 900 秒、15 分钟运行一次查询,但您可以将此计时器更改为您认为的任何值。 或者建议here 的另一个选项,您可以在给定计时器的情况下运行脚本。我想这样你会得到一些重复的推文,但你可以通过以下方式轻松摆脱它们:

    df[duplicated(df), ]
    

    这个解决方案很可能不是理想的,但这对我来说效果很好。关键是要有一点创意! :)

    我希望它会有所帮助,如果有人对如何改进它有任何建议,我会很高兴听到。

    【讨论】:

    • 这只会一遍又一遍地拉回相同的响应(直到希拉里发推文,然后它会抓住新推文,并放弃最旧的推文)。您需要使用 Max ID 参数和Since_id 参数。 Twitter 在此处提供了一些很好的文档:dev.twitter.com/rest/public/timelines
    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 2019-03-18
    • 2012-02-27
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多