【问题标题】:How do I scrape the subscriberCount from Youtube API through apps script on Google Sheets?如何通过 Google Sheets 上的应用程序脚本从 Youtube API 中抓取subscriberCount?
【发布时间】:2021-04-27 12:01:46
【问题描述】:

这是我目前所拥有的:

function YoutubeScraper() {
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
  var activeSheet = spreadSheet.getActiveSheet()
  var search = YouTube.Search.list("snippet, id", {q: "pizza", maxResults: 50})
  var results = search.items.map((item) => [item.id.videoId, item.snippet.title, item.snippet.publishedAt, item.snippet.thumbnails.default.url])
  var ids = results.map((id) => id[0]).join(",")
  var stats = YouTube.Videos.list("statistics", {id: ids})
  var videoStats = stats.items.map((item) => [item.statistics.viewCount, item.statistics.likeCount, item.statistics.dislikeCount])
  activeSheet.getRange(2,1,results.length, results[0].length).setValues(results)
  activeSheet.getRange(2,3, videoStats.length, results[0].length).setValues(videoStats)
}

我尝试在其中添加 item.statistics.subscriberCount

var videoStats = stats.items.map((item) => [item.statistics.viewCount, item.statistics.likeCount, item.statistics.dislikeCount])

但它不起作用。 https://developers.google.com/youtube/v3/docs/channels/list#common-use-cases 上有一条注释说“statistics.subscriberCount 属性值已更新,以反映影响订阅者数量显示方式的 YouTube 政策更改”。我该怎么做才能获得subscriberCount?输出应该是一个数据

【问题讨论】:

    标签: google-apps-script google-sheets youtube-api google-apis-explorer


    【解决方案1】:

    修改点:

    • 我认为在您的情况下,为了检索subscriberCount 的值,将使用“频道:列表”的方法,如YouTube.Channels.list。另外,您提供的官方文档网址是“频道:列表”的方法。
    • 但在您的脚本中,使用了YouTube.Videos.list。我认为这可能是您的问题的原因。
    • 在您的脚本中,我认为您想将subscriberCount 的值放在频道ID 的同一行。但是,在您当前的脚本中,results 有 4 列。但是videoStats 来自“C”列。在这种情况下,“C”和“D”列会被覆盖。

    当以上几点反映到你的脚本中时,它变成如下。

    修改后的脚本:

    function YoutubeScraper() {
      var spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
      var activeSheet = spreadSheet.getActiveSheet();
      var search = YouTube.Search.list("snippet", { q: "pizza", maxResults: 50 });
      var results = search.items.map((item) => [item.snippet.channelId, item.snippet.title, item.snippet.publishedAt, item.snippet.thumbnails.default.url]);
      var ids = results.map((id) => id[0]).join(",");
      var stats = YouTube.Channels.list("statistics", { id: ids });
      var videoStats = stats.items.map((item) => [item.id, item.statistics.viewCount, item.statistics.subscriberCount]).reduce((o, [id, ...v]) => Object.assign(o, {[id]: v}));
      results = results.map(e => videoStats[e[0]] ? e.concat(videoStats[e[0]]) : e.concat(Array(2).fill("")));
      activeSheet.getRange(2, 1, results.length, results[0].length).setValues(results);
    }
    
    • 在此修改中,videoStats 的值被转换为用于搜索频道 ID 的对象。并且,使用该对象,每个值都被推送到results 的相应行。然后,将这些值放入活动工作表中。
    • YouTube.Channels.list 没有 item.statistics.likeCount, item.statistics.dislikeCount 的属性。

    参考:

    补充:

    根据您的以下回复,

    该问题尚未完全解决。我要做的是从 YouTube.Seach 中获取所有我能获取的信息:channelId、videoId、视频标题、发布时间和缩略图。来自 YouTube.Videos:喜欢、不喜欢的观看次数和 cmets 的数量。 From YouTube.Channels:频道总观看次数和订阅人数 下面修改后的脚本怎么样?

    修改后的脚本:

    function YoutubeScraper2() {
      var spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
      var activeSheet = spreadSheet.getActiveSheet();
    
      // Retrieve YouTube.Search.list.
      var search = YouTube.Search.list("snippet", { q: "pizza", maxResults: 50 });
      var results = search.items.map((item) => [item.snippet.channelId, item.id.videoId, item.snippet.title, item.snippet.publishedAt, item.snippet.thumbnails.default.url]);
      
      // Retrieve channel IDs and video IDs.
      var {channelIds, videoIds} = results.reduce((o, [channelId, videoId]) => {
        o.channelIds.push(channelId);
        o.videoIds.push(videoId);
        return o;
      }, {channelIds: [], videoIds: []});
    
      // Retrieve YouTube.Videos.list.
      var videoList = YouTube.Videos.list("statistics", {id: videoIds.join(",")});
      var videoStats = videoList.items.map((item) => [item.id, item.statistics.viewCount, item.statistics.likeCount, item.statistics.dislikeCount]).reduce((o, [id, ...v]) => Object.assign(o, {[id]: v}), {});
    
      // Retrieve YouTube.Channels.list
      var channelList = YouTube.Channels.list("statistics", { id: channelIds.join(",") });
      var channelStats = channelList.items.map((item) => [item.id, item.statistics.viewCount, item.statistics.subscriberCount]).reduce((o, [id, ...v]) => Object.assign(o, {[id]: v}), {});
    
      // Create an array for putting values and put the values to Spreadsheet.
      results = results.map(e => channelStats[e[0]] ? e.concat(channelStats[e[0]]) : e.concat(Array(2).fill("")));
      results = results.map(e => videoStats[e[1]] ? e.concat(videoStats[e[1]]) : e.concat(Array(3).fill("")));
      var header = ["channelId", "videoId", "title", "publishedAt", "thumbnails", "viewCount", "subscriberCount", "viewCount", "likeCount", "dislikeCount"];
      results.unshift(header);
      activeSheet.getRange(1, 1, results.length, results[0].length).setValues(results);
    }
    
    • 运行上述脚本时,channelId, videoId, title, publishedAt, thumbnails, viewCount, subscriberCount, viewCount, likeCount, dislikeCount 列将被放入活动工作表中。
    • 如果不想放表头,请将最后3行修改为activeSheet.getRange(2, 1, results.length, results[0].length).setValues(results);
    • 如果要排列列,请修改上面的脚本。

    结果:

    当上面的脚本运行时,得到以下电子表格。

    【讨论】:

    • 感谢您的意见!你是对的,我需要指定 YouTube.Channels.list 才能访问subscriberCount。但是,我之所以选择 var stats = YouTube.Videos.list("statistics", {id: ids}) var videoStats = stats.items.map((item) => [item.statistics.viewCount, item.statistics.likeCount, item.statistics.dislikeCount]),是因为我还想要视频中喜欢、不喜欢和 cmets 的数量
    • @Ernesto Figueroa 感谢您的回复。我不得不为我糟糕的英语水平道歉。从您的回复和目前的情况来看,我无法理解您的问题是否得到了解决。那么,请问您的问题是否可以解决?如果我的回答仍然不能解决您的问题,我深表歉意。到时候,请告诉我它的细节。通过这个,我想修改它。
    • 嗨@Tanaike!没必要道歉。谢谢你的帮助
    • 该问题尚未完全解决。我要做的是从 YouTube.Seach 中获取所有我能获取的信息:channelId、videoId、视频标题、发布时间和缩略图。来自 YouTube.Videos:喜欢、不喜欢的观看次数和 cmets 的数量。来自 YouTube.Channels:频道的总观看次数和订阅人数。
    • @Ernesto Figueroa 感谢您的回复。从您的回复中,我又添加了一个修改后的脚本。你能确认一下吗?如果这不是您期望的结果,我深表歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多