使用 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
- 转到 Google Developer Console,搜索 Youtube 数据 API / 启用 Youtube 数据 API v3
- 转到凭据/创建凭据/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
我无法从 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
- 转到 Google Developer Console,搜索 Youtube 数据 API / 启用 Youtube 数据 API v3
- 转到凭据/创建凭据/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