【问题标题】:Obtaining twitter screen names from a twitter list从 twitter 列表中获取 twitter 屏幕名称
【发布时间】:2015-07-15 19:32:33
【问题描述】:

我渴望使用 R 从特定的 twitter 列表中获取用户名和全名列表。 我在任何包中都看不到函数,但这段代码有效

library(XML)
library(httr)


url.name <- "https://twitter.com/TwitterUK/lists/premier-league-players/members"
url.get=GET(url.name)
url.content=content(url.get, as="text")
pagehtml <- htmlParse(url.content)

screenNames <-xpathSApply(pagehtml, '//*/span[@class="username js-action-profile-name"]',xmlValue)
realName <- xpathSApply(pagehtml, '//*/strong[@class="fullname js-action-profile-name"]',xmlValue)

但是,它只提供前 20 个值(?屏幕上显示的内容),而列表要长得多

如果有 rvest 解决方案,这也将受到欢迎

干杯

【问题讨论】:

    标签: r twitter


    【解决方案1】:

    如果你想使用 R 和 twitter,你应该看看twitteRpackage。它没有检索你想要的信息的功能,但我们可以利用它的内部功能来使用OAuth,然后发送correct API call。使用 API 调用的好处是您不依赖解析 HTML 页面,您实际上是在做开发人员应该做的事情。

    下面的代码假设您已经使用setup_twitter_oauth() 进行了身份验证,您可以轻松找到这方面的教程,因为它是包基础知识。一旦通过身份验证,让我们加载我们需要的包:

    library(rjson)
    library(httr)
    # library(twitteR) Should have been loaded already of course
    

    现在进行 API 调用,我们将使用 POST。该 URL 有一个 slug 参数,它是 Twitter 列表名称,以及一个 owner_screen_name 参数,它是列表的 Twitter 帐户所有者。我们将使用内部twitteR:::get_oauth_sig() 来验证调用。

    twlist <- "premier-league-players"
    twowner <- "TwitterUK"
    api.url <- paste0("https://api.twitter.com/1.1/lists/members.json?slug=",
               twlist, "&owner_screen_name=", twowner, "&count=5000")
    response <- POST(api.url, config(token=twitteR:::get_oauth_sig()))
    #Count = 5000 is the number of names per result page,
    #        which for this case simplifies things to one page.
    

    这会返回一个 JSON 响应,我们可以使用 fromJSON 读取它:

    response.list <- fromJSON(content(response, as = "text", encoding = "UTF-8"))
    

    现在,我们有一个列表,其中每个元素都是一个 Twitter 列表成员的 Twitter 数据。提取他们的名字和用户名:

    users.names <- sapply(response.list$users, function(i) i$name)
    users.screennames <- sapply(response.list$users, function(i) i$screen_name)
    

    分别是:

    > head(users.names)
    [1] "Peter Crouch"         "barry bannan"         "Jose Leonardo Ulloa "
        "Paul McShane"         "nacho monreal"        "James Ward-Prowse"
    > head(users.screennames)
    [1] "petercrouch"   "bazzabannan25" "Ciclone1923"   "pmacca15"
        "_nachomonreal" "Prowsey16"
    

    现在这段代码最好的部分是它从 R 中打开了几乎整个 twitter API,作为一个已经过身份验证的请求。您可以查看响应列表和子列表,了解每个查询的所有可用信息。

    【讨论】:

    • 非常感谢您出色的评论回答。正如你所说,它打开了很多信息。找出列表和子列表中可用元素的最佳方法是什么,例如名称、屏幕名称
    • 我使用names(response.list) 来检查其中的内容,然后使用names(response.list$users) 等等。 str(response.list) 也可以,但是如果嵌套列表太多可能会难以理解。
    • 是的 str(response.list) 是少数。但是,我收到NULLnames(response.list$users) 的回复
    • 那是我的错误。 $users是一个无名列表,但是每个用户都是一个有名列表,所以应该是response.list$users[[1]]。用户数量无关紧要,因为所有用户都拥有相同类型的数据。实际上,您可以使用(未​​经测试的代码)do.call(rbind, response.list$users) 将其转换为数据框。
    【解决方案2】:

    Molx 的解决方案似乎不再有效。问题似乎出在

    api.url <- paste0("https://api.twitter.com/1.1/lists/members.json?slug=",
               twlist, "&owner_screen_name=", twowner, "&count=5000")
    

    对于我尝试过的任何 twlist 或 twowner,此 URL 似乎无效。 编辑:问题来自我认为的身份验证

    {"errors":[{"code":215,"message":"Bad Authentication data."}]}
    

    我想我已经通过这个验证了

    ## Twitter authentication, 
    consumer_key = "xxxxx"
    consumer_secret = "xxx"
    access_token = "xxxxx"
    access_secret = "xxx"
    setup_twitter_oauth(consumer_key, consumer_secret, access_token,
    access_secret)
    

    问题出在哪里?

    编辑:当我输入 get_oauth_sig() 我得到下面的结果

    > twitteR:::get_oauth_sig()
    <Token>
    NULL
    <oauth_app> twitter
      key:    XXXXXXX
      secret: <hidden>
    <credentials> oauth_token, oauth_token_secret
    ---
    

    这正常吗?

    Molx 的解决方案似乎不再有效。问题似乎出在

    api.url <- paste0("https://api.twitter.com/1.1/lists/members.json?slug=",
               twlist, "&owner_screen_name=", twowner, "&count=5000")
    

    对于我尝试过的任何 twlist 或 twowner,此 URL 似乎无效。 编辑:问题来自我认为的身份验证

    {"errors":[{"code":215,"message":"Bad Authentication data."}]}
    

    我想我已经通过这个验证了

    ## Twitter authentication, 
    consumer_key = "xxxxx"
    consumer_secret = "xxx"
    access_token = "xxxxx"
    access_secret = "xxx"
    setup_twitter_oauth(consumer_key, consumer_secret, access_token,
    access_secret)
    

    问题出在哪里?

    编辑:当我输入 get_oauth_sig() 我得到下面的结果

    > twitteR:::get_oauth_sig()
    <Token>
    NULL
    <oauth_app> twitter
      key:    XXXXXXX
      secret: <hidden>
    <credentials> oauth_token, oauth_token_secret
    ---
    

    这正常吗?

    编辑:我通过将 POST 替换为 GET 来解决问题

    library(rjson)
    library(twitteR)
    consumer_key = "xxxxx"
    consumer_secret = "xxx"
    access_token = "xxxxx"
    access_secret = "xxx"
    setup_twitter_oauth(consumer_key, consumer_secret, access_token,
    access_secret)
    https://twitter.com/ivalerio/lists/justice?lang=fr
    twlist <- "d-put-s-2017-2022"
    twowner <- "ivalerio"
    api.url <- paste0("https://api.twitter.com/1.1/lists/members.json?slug=",
               twlist, "&owner_screen_name=", twowner, "&count=5000")
    response <- GET(api.url, config(token=twitteR:::get_oauth_sig()))
    #Count = 5000 is the number of names per result page,
    #        which for this case simplifies things to one page.
    # This returns a JSON response which we can read using fromJSON:
    response.list <- fromJSON(content(response, as = "text", encoding = "UTF-8"))
    # Now, we have a list where each element is the Twitter data of one Twitter-list member. To extract their names and user_names:
    users.names <- sapply(response.list$users, function(i) i$name)
    users.screennames <- sapply(response.list$users, function(i) i$screen_name)
    # Which are:
    head(users.names)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多