【问题标题】:Scraping certain data from html webpage with rvest in R在 R 中使用 rvest 从 html 网页中抓取某些数据
【发布时间】:2020-10-20 11:53:28
【问题描述】:

我无法从 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 &lt;- 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") 返回相同的空列表。

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

【问题讨论】:

  • Youtube确实提供了API,你有没有尝试过获取数据?

标签: r web-scraping rvest


【解决方案1】:

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

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

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

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

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对象以获取有关视频的更多信息,查看the API documentation

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

【讨论】:

  • 完美,谢谢!在查看文档后,我进一步构建了您的脚本。随后的 API 调用现在会根据第一个 API 调用的输入来获取订阅者的数量。这适用于几个视频 id 的向量,但我正在处理约 6300 次观察。关于批量做这样的事情有什么建议吗?我无法传递 6300 个视频 ID 的向量。谷歌允许我做这样的事情吗?
  • @Brayn 我认为这是 url 大小的服务器限制,鉴于 uri 应小于 2000 个字符,您可以在每个请求中启动 150 个视频 id 的批量(如果不工作,请尝试使用 less)
猜你喜欢
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2018-02-15
  • 1970-01-01
相关资源
最近更新 更多