当前位置: 代码网 > it编程>编程语言>C# > C#爬取动态网页上信息得流程步骤

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

2024年11月25日 C# 我要评论
简介动态内容网站使用 javascript 脚本动态检索和渲染数据,爬取信息时需要模拟浏览器行为,否则获取到的源码基本是空的。本文使用的爬取步骤如下:使用 selenium 获取渲染后的 html 文

简介

动态内容网站使用 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#爬取动态网页信息的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com