首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

C#爬取动态网页上的信息:B站主页

编程知识
2024年09月27日 16:07

目录

简介

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

  • 使用 Selenium 获取渲染后的 HTML 文档
  • 使用 HtmlAgilityPack 解析 HTML 文档

新建项目,安装需要的库:

  • Selenium.WebDriver
  • HtmlAgilityPack

获取 HTML 文档

需要注意的主要是以下2点:

  • 设置浏览器启动参数:无头模式、禁用GPU加速、设置启动时窗口大小
  • 等待页面动态加载完成:等待5秒钟,设置一个合适的时间即可
private static string GetHtml(string url)
{
    ChromeOptions options = new ChromeOptions();
    // 不显示浏览器
    options.AddArgument("--headless");
    // GPU加速可能会导致Chrome出现黑屏及CPU占用率过高
    options.AddArgument("--nogpu");
    // 设置chrome启动时size大小
    options.AddArgument("--window-size=10,10");

    using (var driver = new ChromeDriver(options))
    {
        try
        {
            driver.Manage().Window.Minimize();
            driver.Navigate().GoToUrl(url);
            // 等待页面动态加载完成
            Thread.Sleep(5000);
            // 返回页面源码
            return driver.PageSource;
        }
        catch (NoSuchElementException)
        {
            Console.WriteLine("找不到该元素");
            return string.Empty;
        }
    }
}

解析 HTML 文档

这里以B站为例,爬取B站UP主主页上的视频信息,如视频的标题、链接、封面。
先定义一个类来保存信息:

class VideoInfo
{
    public string Title { get; set; }
    public string Href { get; set; }
    public string ImgUrl { get; set; }
}

定义解析函数,返回视频信息列表:

private static List<VideoInfo> GetVideoInfos(string url)
{
    List<VideoInfo> videoInfos = new List<VideoInfo>();

    // 加载文档
    var html = GetHtml(url);
    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(html);

    // 解析文档,先定位到视频列表标签
    var xpath = "/html/body/div[2]/div[4]/div/div/div[1]/div[2]/div/div";
    var htmlNodes = htmlDoc.DocumentNode.SelectNodes(xpath);

    // 循环解析它的子节点视频信息
    foreach (var node in htmlNodes)
    {
        var titleNode = node.SelectSingleNode("a[2]");
        var imgNode = node.SelectSingleNode("a[1]/div[1]/picture/source[1]");

        var title = titleNode.InnerText;
        var href = titleNode.Attributes["href"].Value.Trim('/');
        var imgUrl = imgNode.Attributes["srcset"].Value.Split('@')[0].Trim('/');

        videoInfos.Add(new VideoInfo
        {
            Title = title,
            Href = href,
            ImgUrl = imgUrl
        });
    }
    return videoInfos;
}

视频列表标签的 XPath 路径是通过浏览器调试工具,在指定标签上右键 复制完整的XPath 得到:
image

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

测试

以B站UP主 星瞳_Official 为例,爬取视频信息:

static void Main(string[] args)
{
    var url = @"https://space.bilibili.com/401315430";
    var videoInfos = GetVideoInfos(url);
    foreach (var videoInfo in videoInfos)
    {
        Console.WriteLine(videoInfo.Title);
        Console.WriteLine(videoInfo.Href);
        Console.WriteLine(videoInfo.ImgUrl);
        Console.WriteLine();
    }
    Console.ReadKey();
}

结果如下:

等一下,好妹妹
www.bilibili.com/video/BV1uyxLeJEM9
i0.hdslb.com/bfs/archive/46a15065d1b6722a04696ffaaa2235287ceaa452.jpg

一口一个?你的超甜辣椒
www.bilibili.com/video/BV1AQsDeiEn1
i0.hdslb.com/bfs/archive/d93d47d67323ee284483e963ffed34fb9884cf61.jpg

这里只是演示爬取动态页面的方法,如果想获取B站UP主的视频信息,建议直接使用 API 请求数据

参考文章

From:https://www.cnblogs.com/timefiles/p/18436160
本文地址: http://www.shuzixingkong.net/article/2356
0评论
提交 加载更多评论
其他文章 JS数据类型&类型转换
基本数据类型 JS中的数据类型由原始值和对象共同组成,原始值一共有七种原始值: 数值(Number) 大整数(BigInt) 字符串(String) 布尔值(Boolean) 空值(Null) 未定义(Undefined) 符号(Symbol) 数值和大整数 数值(Number):在js中所有的整数
JS数据类型&类型转换 JS数据类型&类型转换
Serilog文档翻译系列(六) - 可用的接收器、增强器、格式化输出
Serilog支持多种接收器用于日志存储,增强器用于添加属性,LogContext管理动态属性,支持多种输出格式包括纯文本、JSON及ExpressionTemplate。还提供了自定义格式化选项,适用于不同需求。
Serilog文档翻译系列(六) - 可用的接收器、增强器、格式化输出
命令行gcc -v和g++ -v输出版本不一致
命令行gcc -v和g++ -v输出版本不一致 前言:本文初编辑于2024年1月30日 CSDN主页:https://blog.csdn.net/rvdgdsva 博客园主页:https://www.cnblogs.com/hassle 赞美大萌神,神不允许报错,这世上就没有了bug 本人错误描述:
命令行gcc -v和g++ -v输出版本不一致
浅谈数栈产品里的 Descriptions 组件
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。 本文作者:修能 What&#39;s? 数栈产品里的 Descriptions 组件实际上就是 antd 的 Descriptions 组件,那么 antd 的 Des
浅谈数栈产品里的 Descriptions 组件 浅谈数栈产品里的 Descriptions 组件 浅谈数栈产品里的 Descriptions 组件
剪枝的应用,bfs判重 蚱蜢跳——蓝桥p642
问题描述 总共有九个盘子,八只蚱蜢,且每个盘子中只能容下一只蚱蜢,蚱蜢的编号为1~8,如果蚱蜢所在的盘子紧邻着空盘子,那么该蚱蜢可以从自己的盘子跳到空盘子中,也可以隔一个盘子跳到空盘子中,问一开始状态是012345678,蚱蜢至少该跳多少步才可以被变为087654321 输入 无 输出 蚱蜢跳过的步
反问面试官:如何实现集群内选主
这个示例展示了多个节点通过投票选举一个新的主节点的过程。Netty 用于节点间的通信,而每个节点则负责发起和响应选举消息。
反问面试官:如何实现集群内选主 反问面试官:如何实现集群内选主
Linux 防火墙与安全管理工具详解
Linux 防火墙与安全管理工具详解 1. Iptables 概述 Iptables 是 Linux 系统中用于控制网络流量的工具,通过定义规则来过滤、转发和修改数据包。其规则可以细致地管理进入和离开系统的数据流。 1.1 三表五链 1.1.1 三表 Iptables 中主要有三种表,每种表用于不同
Linux 防火墙与安全管理工具详解
《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略
本文分享自华为云社区《《华为云DTSE》期刊第四期赋能云专刊,赋能云场景下DTSE服务各类开发者的案例分享》,作者:HuaweiCloudDeveloper。 把公司的开发者平台统一在一起,是华为云所担负的任务,其最终目的是要汇聚开发者、做厚“黑土地”,支撑三大根生态的发展壮大。这也意味着,作为支撑
《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略 《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略 《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略