使用 R Loop 批量下载带有 youtubecaption 的 Youtube 脚本

Use R Loop to Bulk Download Youtube Transcripts with youtubecaption

我正在尝试使用 youtubecaption 库下载播放列表的所有转录本,然后创建包含所有结果的数据框。

我有一个视频 URL 列表,并尝试创建一个 for 循环以将它们传递给 get_caption() 函数。我只能将一个视频的成绩单添加到 df。

我尝试了几种方法:

vids <- as.list(mydata$videoId)

for (i in 1:length(vids)){
  vids2 <- paste("https://www.youtube.com/watch?v=",vids[i],sep="")
  test_transcript2 <-
    get_caption(
     url = vids2,
     language = "en",
     savexl = FALSE,
     openxl = FALSE,
     path = getwd())
  rbind(test_transcript, test_transcript2)
 }

同样使用主数据框的列:

captions <- sapply(mydata[,24], FUN = get_captions)

有没有有效的方法来完成这个?

在您的代码中,您执行了 rbind(test_transcript, test_transcript2) 但从未分配它 ,因此它永远丢失了。当我们将其与我关于不使用 rbind(old, newrow) 范例的评论结合起来时,您的代码可能是

vids <- as.list(mydata$videoId)

out <- list()
for (i in 1:length(vids)){
  vids2 <- paste("https://www.youtube.com/watch?v=",vids[i],sep="")
  test_transcript2 <-
    get_caption(
     url = vids2,
     language = "en",
     savexl = FALSE,
     openxl = FALSE,
     path = getwd())
  out <- c(out, list(test_transcript2))
}
alldat <- do.call(rbind, out)

其他一些提示:

    如果功能化,
  • for (i in 1:length(.)) 可能是一种不好的做法,最好使用 for (i in seq_along(vids))

  • 我们永远不需要索引号本身,我们可以使用for (vid in vids)

  • 我们可以一次完成 pasteing,通常 R 更快,使用 for (vid in paste0("https://www.youtube.com/watch?v=", vids)),然后 url=vid 调用 get_caption

  • 尽管如此,使用 lapply 可能更简单:

    path <- getwd()
    out <- lapply(paste0("https://www.youtube.com/watch?v=", vids),
                  get_caption, language = "en", savexl = FALSE,
                  openxl = FALSE, path = path)
    do.call(rbind, out)
    

(注意:未经测试。)