2015-05-05 77 views
2

我渴望得到使用R. 我沒有看到任何包中的一個函數從特定的Twitter列表的用戶名和fullnames名稱的列表,但是這個代碼工作獲取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的解決方案,這也將受到歡迎

歡呼

回答

4

如果你想使用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。該網址有一個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")) 

現在,我們有一個列表,其中每個元素是一個微博列表構件的微數據。爲了提取他們的名字和USER_NAMES:

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,作爲一個已經驗證的請求。您可以檢查每個查詢的所有可用信息的回覆列表和子列表。

+0

感謝這麼多的極好註釋的答案更換POST解決問題。正如你所說,它打開了很多信息。什麼是找出列表和子列表中可用元素的最佳方式,例如name,screen_name – pssguy

+0

我正在使用'names(response.list)'來檢查內容是什麼,然後'names(response.list $ users )',等等。 'str(response.list)'也適用,但如果嵌套列表太多,可能會很難理解。 – Molx

+0

是'str(response.list)'是少數。但是,我得到了'NULL'響應'names(response.list $ users)' – pssguy

0

來自Molx的解決方案似乎不再有效。這個問題似乎在於

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

這個URL似乎對我嘗試的任何twlist或twowner都不是有效的。 編輯:這個問題來自於身份驗證我想我得到

{"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") 

這個URL似乎對我嘗試的任何twlist或twowner都不是有效的。 編輯:這個問題來自於身份驗證我想我得到

{"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 
--- 

結果是這正常嗎?

編輯:我通過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) 
+0

我通過GET取代POST來解決問題 – Julien

相關問題