如何改进C# YouTube播放列表查询程序以获取100+视频?
解决YouTube公开播放列表无法获取全部视频标题的方案
你的问题核心是依赖页面初始HTML爬取,而YouTube播放列表超过100条后采用滚动动态加载,且页面结构随时可能变化,正则匹配的方式既不稳定也无法获取后续内容。下面给两种专业改进方案,优先推荐官方API方案:
方案一:使用YouTube Data API v3(官方推荐,稳定合规)
这是获取YouTube数据的标准方式,支持分页获取所有播放列表内容,不会受页面结构变动影响。
步骤:
- 前往Google Cloud控制台创建项目,启用YouTube Data API v3,生成API密钥(免费额度足够个人使用)。
- 在C#项目中安装NuGet包:
Google.Apis.YouTube.v3
代码示例:
using Google.Apis.Services; using Google.Apis.YouTube.v3; using Google.Apis.YouTube.v3.Data; static async Task<List<string>> GetAllPlaylistVideos(string playlistId, string apiKey) { var videoTitles = new List<string>(); var youtubeService = new YouTubeService(new BaseClientService.Initializer() { ApiKey = apiKey, ApplicationName = "YouTube Playlist Scraper" }); string nextPageToken = null; do { var request = youtubeService.PlaylistItems.List("snippet"); request.PlaylistId = playlistId; request.MaxResults = 50; // 单次请求最大返回50条,API限制 request.PageToken = nextPageToken; var response = await request.ExecuteAsync(); videoTitles.AddRange(response.Items.Select(item => item.Snippet.Title)); nextPageToken = response.NextPageToken; } while (!string.IsNullOrEmpty(nextPageToken)); return videoTitles; }
说明:
- 通过
PageToken处理分页,循环获取直到没有更多内容,能拿到播放列表的所有视频标题。 - API有免费配额,个人使用完全足够,超出配额后才需要付费。
方案二:模拟动态加载(非官方,不稳定)
如果不想使用API,可以模拟浏览器滚动时的XHR请求,获取后续视频数据。但这种方式依赖YouTube的内部接口,随时可能失效,且可能违反YouTube的服务条款,谨慎使用。
大致思路:
- 初始请求页面时,提取页面中的
continuation令牌(这个令牌是加载后续内容的关键)。 - 向YouTube的内部API端点发送POST请求,携带该令牌,获取下一页的视频数据。
- 解析返回的JSON数据,提取标题,同时获取新的
continuation令牌,循环直到没有更多内容。
注意:
- YouTube的内部API结构和令牌规则经常变动,需要频繁调整代码。
- 可能需要处理请求头(如User-Agent、Cookie等)来模拟真实浏览器请求,否则会被拦截。
原代码的问题总结:
- 依赖页面HTML结构,正则匹配极易因YouTube页面更新而失效。
- 只能获取初始加载的100条内容,无法处理动态加载的后续视频。
内容的提问来源于stack exchange,提问作者Ádám Benák
相关产品推荐
相关产品推荐

