R YouTube评论刮刀返回有限的结果

R YouTube评论刮刀返回有限的结果,r,youtube-api,web-scraping,R,Youtube Api,Web Scraping,任务: 我想从给定的视频中抓取所有YouTube评论 我成功地改编了上一个问题()中的R代码 代码如下: library(RCurl) library(XML) x <- "https://gdata.youtube.com/feeds/api/videos/4H9pTgQY_mo/comments?orderby=published" html = getURL(x) doc = htmlParse(html, asText=TRUE) txt = xpathSApply(doc,

任务:

我想从给定的视频中抓取所有YouTube评论

我成功地改编了上一个问题()中的R代码

代码如下:

library(RCurl)
library(XML)
x <- "https://gdata.youtube.com/feeds/api/videos/4H9pTgQY_mo/comments?orderby=published"
html = getURL(x)
doc  = htmlParse(html, asText=TRUE) 
txt  = xpathSApply(doc, 
"//body//text()[not(ancestor::script)][not(ancestor::style)[not(ancestor::noscript)]",xmlValue)
库(RCurl)
库(XML)

xXML
包的另一个替代方案是
rvest
包。使用您提供的URL,删除注释如下所示:

library(rvest)
x <- "https://gdata.youtube.com/feeds/api/videos/4H9pTgQY_mo/comments?orderby=published"
x %>% 
  html %>% 
  html_nodes("content") %>% 
  html_text
init_results <- httr::content(httr::GET(base_url, query = api_opts))
##
R> names(init_results)
#[1] "nextPageToken" "items"
R> init_results$nextPageToken
#[1] "Cg0Q-YjT3bmSxQIgACgBEhQIABDI3ZWQkbzEAhjVneqH75u4AhgCIGQ="       
R> class(init_results)
#[1] "list"
api_opts$pageToken <- gsub("\\=","",init_results$nextPageToken)
next_results <- httr::content(
    httr::GET(base_url, query = api_opts))
##
R> next_results$nextPageToken
#[1] "ChYQ-YjT3bmSxQIYyN2VkJG8xAIgACgCEhQIABDI3ZWQkbzEAhiSsMv-ivu0AhgCIMgB"
rObj <- yt_scraper()
##
R> rObj$data
#list()
R> rObj$unique_count
#[1] 0
##
rObj$scrape_all()
##
R> rObj$unique_count
#[1] 1673
R> length(rObj$data)
#[1] 1673
R> ##
R> head(rObj$core_df)
                                                           Comment              User ReplyCount LikeCount              PublishTime
1                    That Andorra player was really Ruud..<U+feff>         Cistrolat          0         6 2015-03-22T14:07:31.213Z
2                          This just in; Karma is a bitch.<U+feff> Swagdalf The Obey          0         1 2015-03-21T20:00:26.044Z
3                                          Legend! Haha B)<U+feff>  martyn baltussen          0         1 2015-01-26T15:33:00.311Z
4 When did Van der sar ran up? He must have run real fast!<U+feff> Witsakorn Poomjan          0         0 2015-01-04T03:33:36.157Z
5                           <U+003c>b<U+003e>LOL<U+003c>/b<U+003e>           F Hanif          5        19 2014-12-30T13:46:44.028Z
6                                          Fucking Legend.<U+feff>        Heisenberg          0        12 2014-12-27T11:59:39.845Z
                            CommentId
1   z123ybioxyqojdgka231tn5zbl20tdcvn
2   z13hilaiftvus1cc1233trvrwzfjg1enm
3 z13fidjhbsvih5hok04cfrkrnla2htjpxfk
4   z12js3zpvm2hipgtf23oytbxqkyhcro12
5 z12egtfq5ojifdapz04ceffqfrregdnrrbk
6 z12fth0gemnwdtlnj22zg3vymlrogthwd04

可以找到有关rvest的更多信息。

您的问题在于获得最大结果

求解算法

首先,您需要调用url
,此url包含视频评论计数的信息,从中提取该数字并使用它进行迭代

<gd:comments><gd:feedLink ..... countHint='1797'/></gd:comments> <gd:feedLink。。。。。countHint='1797'/> 之后,使用它用这两个参数迭代思想url

当您进行迭代时,您需要将开始索引从1,51101151更改为。。。是否测试了
最大结果
它限制为50

通过使用最新版本的和R软件包
httr
,我(在很大程度上)能够做到这一点。我采取的基本方法是将多个
GET
请求发送到适当的URL,并以100个(API允许的最大数量)的批量获取数据,即

第二个元素-
items
-是第一批的实际结果集:它是一个长度为100的列表,因为我们在GET请求中指定了
maxResults=100
。第一个元素-
nextPageToken
-是我们用来确保每个请求返回适当的结果序列的元素。例如,我们可以得到以下100个结果:

library(rvest)
x <- "https://gdata.youtube.com/feeds/api/videos/4H9pTgQY_mo/comments?orderby=published"
x %>% 
  html %>% 
  html_nodes("content") %>% 
  html_text
init_results <- httr::content(httr::GET(base_url, query = api_opts))
##
R> names(init_results)
#[1] "nextPageToken" "items"
R> init_results$nextPageToken
#[1] "Cg0Q-YjT3bmSxQIgACgBEhQIABDI3ZWQkbzEAhjVneqH75u4AhgCIGQ="       
R> class(init_results)
#[1] "list"
api_opts$pageToken <- gsub("\\=","",init_results$nextPageToken)
next_results <- httr::content(
    httr::GET(base_url, query = api_opts))
##
R> next_results$nextPageToken
#[1] "ChYQ-YjT3bmSxQIYyN2VkJG8xAIgACgCEhQIABDI3ZWQkbzEAhiSsMv-ivu0AhgCIMgB"
rObj <- yt_scraper()
##
R> rObj$data
#list()
R> rObj$unique_count
#[1] 0
##
rObj$scrape_all()
##
R> rObj$unique_count
#[1] 1673
R> length(rObj$data)
#[1] 1673
R> ##
R> head(rObj$core_df)
                                                           Comment              User ReplyCount LikeCount              PublishTime
1                    That Andorra player was really Ruud..<U+feff>         Cistrolat          0         6 2015-03-22T14:07:31.213Z
2                          This just in; Karma is a bitch.<U+feff> Swagdalf The Obey          0         1 2015-03-21T20:00:26.044Z
3                                          Legend! Haha B)<U+feff>  martyn baltussen          0         1 2015-01-26T15:33:00.311Z
4 When did Van der sar ran up? He must have run real fast!<U+feff> Witsakorn Poomjan          0         0 2015-01-04T03:33:36.157Z
5                           <U+003c>b<U+003e>LOL<U+003c>/b<U+003e>           F Hanif          5        19 2014-12-30T13:46:44.028Z
6                                          Fucking Legend.<U+feff>        Heisenberg          0        12 2014-12-27T11:59:39.845Z
                            CommentId
1   z123ybioxyqojdgka231tn5zbl20tdcvn
2   z13hilaiftvus1cc1233trvrwzfjg1enm
3 z13fidjhbsvih5hok04cfrkrnla2htjpxfk
4   z12js3zpvm2hipgtf23oytbxqkyhcro12
5 z12egtfq5ojifdapz04ceffqfrregdnrrbk
6 z12fth0gemnwdtlnj22zg3vymlrogthwd04
可以这样使用:

library(rvest)
x <- "https://gdata.youtube.com/feeds/api/videos/4H9pTgQY_mo/comments?orderby=published"
x %>% 
  html %>% 
  html_nodes("content") %>% 
  html_text
init_results <- httr::content(httr::GET(base_url, query = api_opts))
##
R> names(init_results)
#[1] "nextPageToken" "items"
R> init_results$nextPageToken
#[1] "Cg0Q-YjT3bmSxQIgACgBEhQIABDI3ZWQkbzEAhjVneqH75u4AhgCIGQ="       
R> class(init_results)
#[1] "list"
api_opts$pageToken <- gsub("\\=","",init_results$nextPageToken)
next_results <- httr::content(
    httr::GET(base_url, query = api_opts))
##
R> next_results$nextPageToken
#[1] "ChYQ-YjT3bmSxQIYyN2VkJG8xAIgACgCEhQIABDI3ZWQkbzEAhiSsMv-ivu0AhgCIMgB"
rObj <- yt_scraper()
##
R> rObj$data
#list()
R> rObj$unique_count
#[1] 0
##
rObj$scrape_all()
##
R> rObj$unique_count
#[1] 1673
R> length(rObj$data)
#[1] 1673
R> ##
R> head(rObj$core_df)
                                                           Comment              User ReplyCount LikeCount              PublishTime
1                    That Andorra player was really Ruud..<U+feff>         Cistrolat          0         6 2015-03-22T14:07:31.213Z
2                          This just in; Karma is a bitch.<U+feff> Swagdalf The Obey          0         1 2015-03-21T20:00:26.044Z
3                                          Legend! Haha B)<U+feff>  martyn baltussen          0         1 2015-01-26T15:33:00.311Z
4 When did Van der sar ran up? He must have run real fast!<U+feff> Witsakorn Poomjan          0         0 2015-01-04T03:33:36.157Z
5                           <U+003c>b<U+003e>LOL<U+003c>/b<U+003e>           F Hanif          5        19 2014-12-30T13:46:44.028Z
6                                          Fucking Legend.<U+feff>        Heisenberg          0        12 2014-12-27T11:59:39.845Z
                            CommentId
1   z123ybioxyqojdgka231tn5zbl20tdcvn
2   z13hilaiftvus1cc1233trvrwzfjg1enm
3 z13fidjhbsvih5hok04cfrkrnla2htjpxfk
4   z12js3zpvm2hipgtf23oytbxqkyhcro12
5 z12egtfq5ojifdapz04ceffqfrregdnrrbk
6 z12fth0gemnwdtlnj22zg3vymlrogthwd04
rObj rObj$数据
#列表()
R> rObj$唯一计数
#[1] 0
##
rObj$scrape_all()
##
R> rObj$唯一计数
#[1] 1673
R> 长度(rObj$数据)
#[1] 1673
R>##
R> 头部(rObj$core_df)
注释用户ReplyCount LikeCount PublishTime
1.那个安道尔球员真的是路德。。顺曲拉0 6 2015-03-22T14:07:31.213Z
2这是刚刚进来的;因果报应是个婊子。Swagdalf The Obey 0 1 2015-03-21T20:00:26.044Z
3传奇!哈哈B)martyn baltussen 01 2015-01-26T15:33:00.311Z
范德萨什么时候跑上来的?他一定跑得很快!Witsakorn Poomjan 0 0 2015-01-04T03:33:36.157Z
哈尼夫5号楼2014-12-30T13:46:44.028Z
他妈的传奇人物。海森堡012014-12-27T11:59:39.845Z
评论
1 z123ybioxyqojdgka231tn5zbl20tdcvn
2 Z13HILIFTVUS1C1233TRVRWZFJG1nm
3 Z13 FIDJHBSVIH5HOK04CFRKRNLA2HTJPXFK
4 z12js3zpvm2hipgtf23oytbxqkyhcro12
5 Z12EGTFQ5OJIFDAPZ04CEFFQFREGDNRRBK
6 Z12FTH0GEMNWDTLNJ22ZG3VYMLROGHTHWD04

正如我前面提到的,这几乎可以让你得到所有东西——1790条评论中的1673条。出于某种原因,它似乎无法捕获用户的嵌套回复,我不太确定如何在API框架中指定这一点



我之前为使用Google Analytics API设置了一段时间,但是如果您还没有这样做,那么它应该非常简单。这里有一个-您不需要设置OAuth或类似的东西,只需创建一个项目并创建一个新的公共API访问密钥。

我在R中使用“tuber”包尝试了不同的视频,我的结果在这里。 如果一个作者只有回复(没有关于视频的评论),那么根据回复的数量来表现。如果作者的回复不超过5条,那么不要删除任何人。但是如果有5条以上的回复,那么一些评论就是删除。
如果一位作者同时拥有自己的评论和回复,那么不止第二位作者(我告诉过他)的评论正在被删除。

@hrbrmstr请不要链接到不推荐使用的API。这个链接对OP真的没有帮助。@JAL谢谢。这正是API方法的问题所在。我看不出上面发布了什么链接,但这一个怎么样?这不是一个答案,但听起来你好像遇到了一个“页面大小”限制,你需要自己爬过许多“页面”的结果。这是一个可能会让你开始的问题。@jennybryan谢谢你的建议,但是这个问题与查询视频有关,而不是评论。你好@francojc,谢谢你的建议,但这并没有解决我在问题中提到的我想要完成的任务。您提供的代码返回25条注释,但在上面的示例中,视频上大约有1800条注释。我想返回所有的评论,而不是一小部分。谢谢,谢谢,@nrussell!我可以确认,这种解决方案对于非嵌套评论(即任何给定视频上的大多数评论)效果良好。这当然足够开始了。干杯