使用 R 中的 rvest 从 html 网页中抓取某些数据

Scraping certain data from html webpage with rvest in R

我无法从 YouTube 视频页面抓取某些数据来创建数据集。我成功地抓取了其他网页进行练习,但似乎无法让它适用于我的实际用例。

具体来说,我试图在 video_ids 的向量中获取每个 YouTube 频道的用户名。这可以在检查以下元素时在视频页面的 HTML 中找到: <a class="yt-simple-endpoint style-scope ytd-video-owner-renderer" tabindex="-1" href="/user/BonAppetitDotCom"> .... </a>

我有以下 R 脚本:

library(rvest)

# 3 random trending YouTube videos
videos <- c("2kyS6SvSYSE","iIxy3JN3-jc","jr9QtXwC9vc")
for (video in videos) {
  url <- paste0("https://www.youtube.com/watch?v=",video,"/")
  webpage <- read_html(url) #outputs a list of 2: <head> and <body> content

  #narrow down the elements to fetch what I need
  data <- html_nodes(webpage, '.ytd-video-owner-renderer a') #returns an empty list
  ...
  print(...)
}

脚本会继续从 data 列表中获取特定元素 html_text,其中包含我需要的值。

我还尝试通过 XPath 获取元素: data <- html_nodes(webpage, xpath="/html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[4]/div[1]/div/div[6]/div[3]/ytd-video-secondary-info-renderer/div/div[2]/ytd-video-owner-renderer/a") 哪个 returns 相同的空列表。

知道我的方法有什么问题吗,或者是否有更好的方法来获取我需要的数据?

您可以使用官方 API 直接搜索视频列表并获取其信息

GET https://www.googleapis.com/youtube/v3/videos

  • 转到凭据/创建凭据/API 密钥

在下面的脚本中使用 api 键。此脚本获取 video_ids 向量中所有视频的频道标题:

library(httr)

api_key = "YOUR_API_KEY"
video_ids = c("2kyS6SvSYSE","iIxy3JN3-jc","jr9QtXwC9vc")

url <- modify_url("https://www.googleapis.com/youtube/v3/videos", 
    query = list(
        "part" = "snippet",
        "id" = paste(video_ids, collapse=","),
        "key" = api_key)
)
output <- content(GET(url), as = "parsed", type = "application/json")

#build dataframe
result <- list();
index <- 1
for(t in output$items){
    result[[index]] <- list(
        id = t$id,
        channelTitle = t$snippet$channelTitle
    )
    index <- index + 1
}
df <- do.call(rbind, result)
options(width = 1200)
print(df)

输出

     id            channelTitle                          
[1,] "2kyS6SvSYSE" "CaseyNeistat"                        
[2,] "iIxy3JN3-jc" "Cleveland Cavaliers on cleveland.com"
[3,] "jr9QtXwC9vc" "Fox Family Entertainment"  

查看 snippet object 了解有关视频的更多信息,查看 the API documentation

如果您愿意,也可以使用this library