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

news/2024/11/18 7:30:47/文章来源:https://www.cnblogs.com/timefiles/p/18436160

目录
  • 简介
  • 获取 HTML 文档
  • 解析 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 得到:
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 请求数据

参考文章

  • 使用 C#语言进行网页抓取的终极指南
  • C# 写个小爬虫,实现爬取js加载后的网页
  • Html Agility Pack 文档
  • [ 长期更新 ] C# Selenium 常用操作代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/804707.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 LangChain 的自动化测试用例的生成与执行

在前面的章节中,分别介绍了 Web、App、接口自动化测试用例的生成。但是在前文中实现的效果均为在控制台打印自动化测试的用例。用例需要手动粘贴,调整之后再执行。 那么其实这个手动粘贴、执行的过程,也是可以直接通过人工智能完成的。 应用价值通过人工智能代替人工操作的部…

数字孪生赋能BMS:开启电池管理新纪元

这几天,全世界的媒体几乎都在报道黎巴嫩爆炸案。原本此类地缘冲突的影响力是较为有限的,但是这次的事件不太一样:这次爆炸的,是几千个传呼机。这一事件迅速引发了全球范围内对于电子设备安全性的广泛关注:随着社会日益依赖各种高科技产品,从日常通信到交通出行,人们开始…

20240927

Fun is Counting 我们可以发现数组 \(a\) 必须是 \(x\) 或 \(x - 1\),然后分类讨论即可 #include <bits/stdc++.h>using namespace std;#define int long longconst int N = 1e6 + 5, mod = 998244353;int inv[N], f[N], g[N], t, n, a[N];int C(int a, int b) {if (a &l…

海报作业

海报主题:知识的力量设定: 目标:强调教育和知识对个人成长和社会发展的重要性 设计构思:1. 色彩:选择明亮且有活力的颜色,如蓝色和黄色,吸引眼球并传达积极的情绪。图像: 中心可以用一棵大树象征知识之树,树冠由书籍组成。 在树下,可以画出一群不同年龄和背景的人在学…

驱动导致win蓝屏(蓝屏code: 0x9f)

描述:在9月27日12点35分24秒系统发生蓝屏通过系统事件日志来看发现发现从发生蓝屏开始到下一次开机之间相隔4分钟左右 继续分析dump日志,此次蓝屏代码为0x9f通过dump日志来看,造成此次蓝屏的原因是驱动程序处于不一致或无效的电源状态。 In Windows Vista and later version…

wireshark抓不到TLS1.3数据包中证书的解决方案

近日工作中遇到需要分析使用TLS1.3协议进行通信的数据包的情况,但使用wireshark进行分析发现不能抓到服务端证书,感到诧异遂设法解决 这篇博客给出解决方案,和简单的原理分析近日工作中遇到需要分析使用TLS1.3协议进行通信的数据包的情况,但使用wireshark进行分析发现不能抓…

chrome实现点击书签, 新页面打开. (左键点击). 新标签打开书签 .

1. 我找了很多插件, 都没法实现点击书签, 自动新标签打开. 2. 但是我发现一款 chrome , 是可以实现的 https://www.ghxi.com/chrome.html 这是基于 chrome ++ 的增强版. 便携版和安装版使用起来没有任何区别 , 甚至重装系统依旧能用原来的数据. 如何开启新标签打开书签的功能, …

GB28181接入摄像头到LiveGBS流媒体平台时,内网ip和外网ip怎么设置才能正确接收到摄像头视频

@目录1、流媒体服务配置2、播放提示none rtp data receive3、多网卡服务器4、收流端口配置5、端口区间可以如何配置6、搭建GB28181视频直播平台 1、流媒体服务配置LiveGBS中基础配置-》流媒体服务配置中有,本地|内网 IP、外网 IP(可选)、外网IP收流勾选,如何配合使用,如何理…

springcloud整合gateway

gateway作为第二代springcloud网关,是微服务架构中不可缺少的一部分,接下去就简单介绍下如何在springcloud中整合它 此处配合用到了nacos,将gateway服务注册到nacos统一管理 一、添加依赖:<dependency><groupId>org.springframework.cloud</groupId><…

谷歌网站收录查询,利用关键词进行谷歌网站收录查询的方法

利用关键词进行谷歌网站收录查询,可以通过以下几种方法来实现: 一、使用Google Search Console(谷歌搜索控制台) 虽然Google Search Console不直接支持通过关键词批量查询收录情况,但你可以通过以下步骤间接利用关键词来评估收录情况: 注册并验证网站:首先,你需要在Goo…

Oracle:重复数据去重,只取最新的一条数据

前言 最近开发的时候遇到一个任务,需要对重复的数据进行筛选,只取插入时间最早的一条数据。这里介绍一下解决这类去重问题的几种思路 先看样例数据解决思路一 先group by找到每个人最新的数据插入时间(insert_time),再通过insert_time作为条件表关联的条件筛选出每个人最新…