ToB企服应用市场:ToB评测及商务社交产业平台

标题: C#爬取动态网页上的信息:B站主页 [打印本页]

作者: 万万哇    时间: 2024-9-27 20:58
标题: C#爬取动态网页上的信息:B站主页
目次

简介

动态内容网站使用 JavaScript 脚本动态检索和渲染数据,爬取信息时需要模拟浏览器行为,否则获取到的源码基本是空的。爬取步调如下:
新建项目,安装需要的库:
获取 HTML 文档

需要留意的主要是以下2点:
  1. private static string GetHtml(string url)
  2. {
  3.     ChromeOptions options = new ChromeOptions();
  4.     // 不显示浏览器
  5.     options.AddArgument("--headless");
  6.     // GPU加速可能会导致Chrome出现黑屏及CPU占用率过高
  7.     options.AddArgument("--nogpu");
  8.     // 设置chrome启动时size大小
  9.     options.AddArgument("--window-size=10,10");
  10.     using (var driver = new ChromeDriver(options))
  11.     {
  12.         try
  13.         {
  14.             driver.Manage().Window.Minimize();
  15.             driver.Navigate().GoToUrl(url);
  16.             // 等待页面动态加载完成
  17.             Thread.Sleep(5000);
  18.             // 返回页面源码
  19.             return driver.PageSource;
  20.         }
  21.         catch (NoSuchElementException)
  22.         {
  23.             Console.WriteLine("找不到该元素");
  24.             return string.Empty;
  25.         }
  26.     }
  27. }
复制代码
解析 HTML 文档

这里以B站为例,爬取B站UP主主页上的视频信息,如视频的标题、链接、封面。
先定义一个类来保存信息:
  1. class VideoInfo
  2. {
  3.     public string Title { get; set; }
  4.     public string Href { get; set; }
  5.     public string ImgUrl { get; set; }
  6. }
复制代码
定义解析函数,返回视频信息列表:
  1. private static List<VideoInfo> GetVideoInfos(string url)
  2. {
  3.     List<VideoInfo> videoInfos = new List<VideoInfo>();
  4.     // 加载文档
  5.     var html = GetHtml(url);
  6.     var htmlDoc = new HtmlDocument();
  7.     htmlDoc.LoadHtml(html);
  8.     // 解析文档,先定位到视频列表标签
  9.     var xpath = "/html/body/div[2]/div[4]/div/div/div[1]/div[2]/div/div";
  10.     var htmlNodes = htmlDoc.DocumentNode.SelectNodes(xpath);
  11.     // 循环解析它的子节点视频信息
  12.     foreach (var node in htmlNodes)
  13.     {
  14.         var titleNode = node.SelectSingleNode("a[2]");
  15.         var imgNode = node.SelectSingleNode("a[1]/div[1]/picture/source[1]");
  16.         var title = titleNode.InnerText;
  17.         var href = titleNode.Attributes["href"].Value.Trim('/');
  18.         var imgUrl = imgNode.Attributes["srcset"].Value.Split('@')[0].Trim('/');
  19.         videoInfos.Add(new VideoInfo
  20.         {
  21.             Title = title,
  22.             Href = href,
  23.             ImgUrl = imgUrl
  24.         });
  25.     }
  26.     return videoInfos;
  27. }
复制代码
视频列表标签的 XPath 路径是通过浏览器调试工具,在指定标签上右键 复制完备的XPath 得到:

分析代码中的 node 节点时,html文本格式可能很乱,可以通过在线 HTML 代码格式化 工具格式后再进行分析。
测试

以B站UP主 星瞳_Official 为例,爬取视频信息:
  1. static void Main(string[] args)
  2. {
  3.     var url = @"https://space.bilibili.com/401315430";
  4.     var videoInfos = GetVideoInfos(url);
  5.     foreach (var videoInfo in videoInfos)
  6.     {
  7.         Console.WriteLine(videoInfo.Title);
  8.         Console.WriteLine(videoInfo.Href);
  9.         Console.WriteLine(videoInfo.ImgUrl);
  10.         Console.WriteLine();
  11.     }
  12.     Console.ReadKey();
  13. }
复制代码
结果如下:
  1. 等一下,好妹妹
  2. www.bilibili.com/video/BV1uyxLeJEM9
  3. i0.hdslb.com/bfs/archive/46a15065d1b6722a04696ffaaa2235287ceaa452.jpg
  4. 一口一个?你的超甜辣椒
  5. www.bilibili.com/video/BV1AQsDeiEn1
  6. i0.hdslb.com/bfs/archive/d93d47d67323ee284483e963ffed34fb9884cf61.jpg
复制代码
这里只是演示爬取动态页面的方法,如果想获取B站UP主的视频信息,建议直接使用 API 哀求数据
参考文章


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4