C#爬取动态网页上信息得流程步骤

 更新时间:2024年10月21日 08:46:15   作者:小码编匠  
动态内容网站使用 JavaScript 脚本动态检索和渲染数据,爬取信息时需要模拟浏览器行为,否则获取到的源码基本是空的,这篇文章主要给大家详细介绍了C#爬取动态网页上信息得流程步骤,需要的朋友可以参考下

简介

动态内容网站使用 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 得到:

分析代码中的 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 请求数据

最后

以上就是C#爬取动态网页上信息得流程步骤的详细内容,更多关于C#爬取动态网页信息的资料请关注脚本之家其它相关文章!

相关文章

  • C# Task Cancellation使用总结

    C# Task Cancellation使用总结

    本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延续
    2024-12-12
  • 把DLL文件打包进EXE的操作技巧

    把DLL文件打包进EXE的操作技巧

    用VS2005建立一个windows项目,取名test,之后把生成DLL文件打包进EXE,接下来介绍详细的操作技巧,感兴趣的朋友可以了解下啊,或许对你有所帮助
    2013-02-02
  • C#中DataBindings用法实例分析

    C#中DataBindings用法实例分析

    这篇文章主要介绍了C#中DataBindings用法,结合实例形式详细分析了DataBindings绑定数据源及刷新数据的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • .Net中的json操作类用法分析

    .Net中的json操作类用法分析

    这篇文章主要介绍了.Net中的json操作类用法分析,是非常实用的一个技巧,需要的朋友可以参考下
    2014-08-08
  • c#中文转unicode字符示例分享

    c#中文转unicode字符示例分享

    本文介绍了中文转unicode字符的方法,还有UNICODE字符转为中文的方法,大家参考使用吧
    2014-01-01
  • 利用C#与PLC通信实现设备远程控制与管理

    利用C#与PLC通信实现设备远程控制与管理

    PLC是工业自动化中用于控制机械设备、生产线等的核心设备,通过与PLC的通信,我们可以实现设备的远程监控、数据采集等功能,C#作为一种现代化的编程语言,能够非常方便地与PLC进行通信,本文将介绍如何利用C#与PLC进行通信,并实现设备的远程控制与管理
    2025-02-02
  • C# 图片格式转换的实例代码

    C# 图片格式转换的实例代码

    这篇文章主要介绍了C# 图片格式转换的实例代码,文中讲解非常详细,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-08-08
  • C# 泛型集合的自定义类型排序的实现

    C# 泛型集合的自定义类型排序的实现

    这篇文章主要介绍了C# 泛型集合的自定义类型排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#使用Redis的基本操作

    C#使用Redis的基本操作

    这篇文章主要介绍了C#使用Redis的基本操作,需要的朋友可以参考下
    2017-06-06
  • C#中使用Override和New关键字进行版本控制

    C#中使用Override和New关键字进行版本控制

    在 C# 中,override 和 new 关键字用于控制类之间的成员方法的隐藏和重写,理解它们之间的差异和使用场景对于设计灵活且易于维护的代码至关重要,在这篇博客中,我们将详细探讨这两个关键字的用法,并通过示例来说明它们的实际应用,需要的朋友可以参考下
    2024-10-10

最新评论