C#测试调用DotnetSpider爬取网页内容

news2024/7/2 3:24:46

  微信公众号“DotNet”的文章《.NET快速实现网页数据抓取》介绍了调用开源网页爬取模块DotnetSpider爬取cnblog网站文章的基本方式。之前学习过使用HtmlAgilityPack抓取并分析网页内容,DotnetSpider也依赖HtmlAgilityPack模块,不过前者属于轻量、高效的爬取框架,按其规则继承实现爬取类及数据解析类即可完成网页内容爬取。本文学习DotnetSpider的基本用法,并用其测试爬取B站的视频检索页面。
  在浏览器中访问B站并搜索火影,虽然能看到检索结果,但是查看网页源码时却无法直接看到返回结果的html结构,如下图所示。

在这里插入图片描述
在这里插入图片描述
  使用postman获取网页返回结果,并将结果复制到HBuilder X中分析网页结构。如下图所示,所有的返回结果都保存到类名包含“video-list-item col_3 col_xs_1_5 col_md_2 col_xl_1_7 mb_x40”的div元素内,下方右侧图划红线处保存每条检索结果的标题、up主、上传时间等信息。
在这里插入图片描述
  新建Winform项目,在Nuget包管理器中搜索并安装DotnetSpider包。
在这里插入图片描述
  定义下列数据结构保存视频检索结果。

public class BiliBiliSearchData
{
    public string Title { get; set; } = string.Empty;
    public string Uper { get; set; } = string.Empty;
    public string UpDate { get; set; } = string.Empty;
}

  使用DotnetSpider模块需集成并实现Spider类和DataParser类,前者用于异步下载网页内容,而后者用于从网页内容中检索所需结果,参照参考文献1中的示意代码,定义相关类,主要代码如下图所示:

public class BiliBiliVideoSpider : Spider
{
    public BiliBiliVideoSpider(IOptions<SpiderOptions> options,
        DependenceServices services,
        ILogger<Spider> logger) : base(options, services, logger)
    {
    }

    public static async Task RunAsync()
    {
        var builder = Builder.CreateDefaultBuilder<BiliBiliVideoSpider>();            
        builder.UseDownloader<HttpClientDownloader>();
        builder.UseQueueDistinctBfsScheduler<HashSetDuplicateRemover>();
        builder.Build().RunAsync();
    }

    protected override async Task InitializeAsync(CancellationToken stoppingToken = default)
    {
        AddDataFlow(new Parser());
 
        await AddRequestsAsync(new Request(url)
        {
            Timeout = 10000
        });
    }

    class Parser : DataParser
    {
        public override Task InitializeAsync()
        {
            return Task.CompletedTask;
        }

        protected override Task ParseAsync(DataFlowContext context)
        {
            var videoList = context.Selectable.SelectList(Selectors.XPath(".//div[contains(@class,'video-list-item col_3 col_xs_1_5 col_md_2 col_xl_1_7 mb_x40')]"));
            foreach (var videos in videoList)
            {
                BiliBiliSearchData record = new BiliBiliSearchData();
                record.Title= videos.Select(Selectors.XPath(".//h3[@class='bili-video-card__info--tit']"))?.Value;
                record.Uper = videos.Select(Selectors.XPath(".//span[@class='bili-video-card__info--author']"))?.Value;
                record.UpDate = videos.Select(Selectors.XPath(".//span[@class='bili-video-card__info--date']"))?.Value;

                searchRecords.Add(record);
            }

            return Task.CompletedTask;
        }
    }

  参考文献1、4的示例代码中,数据解析后要么直接输出到控制台,要么保存到数据库,但要将检索数据显示在Winfom中,没看到如何将解析的数据回传回Winform的示例或类似代码(仅看到在数据解析类中将数据保存到Context属性中,但不清楚怎么读取数据)。最后简单粗暴的定义了全局变量,直接在数据解析类中将数据保存到全局变量,然后在Winform中显示。
  最后是测试程序运行效果,如下图所示。DotnetSpider与HtmlAgilityPack相比,前者作为开源框架,用法标准化,实现简单,但需了解框架的大致结构才能灵活应用与扩展,而后者的使用更随意,用法因人而异。

在这里插入图片描述

参考文献:
[1]https://blog.csdn.net/sdgfafg_25/article/details/139146871
[2]https://www.cnblogs.com/Can-daydayup/p/18208192
[3]https://github.com/dotnetcore/DotnetSpider
[4]https://gitee.com/stylexing/DotnetSpider
[5]https://www.cnblogs.com/wendyw/p/11633588.html
[6]https://blog.csdn.net/shizuguilai/article/details/135557118

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昇思MindSpore学习笔记5--数据变换Transforms

摘要&#xff1a; 昇思MindSpore的数据变换&#xff0c;包括通用变换Common Transforms、图像变换Vision Transforms、标准化Normalize、文本变换Text Transforms、匿名函数变换Lambda Transforms。 一、数据变换Transforms概念 原始数据需预处理后才能送入神经网络进行训练…

docker网络功能介绍

一、 网络启动过程二、 修改容器dns和主机名① 临时处理&#xff08;容器终止或重启后不会保存&#xff09;② 通过参数指定 三、 容器内访问控制① 容器访问外部网络② 容器间互相访问&#xff08;1&#xff09;访问所有端口&#xff08;2&#xff09;访问指定端口 四、 docke…

.[emcrypts@tutanota.de].mkp勒索病毒新变种该如何应对?

引言 在数字化时代&#xff0c;随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显。其中&#xff0c;勒索病毒作为一种极具破坏力的恶意软件&#xff0c;给个人和企业带来了巨大的经济损失和数据安全风险。近期&#xff0c;一种名为“.mkp勒索病毒”的新型威胁开始在网络…

2000-2021年县域金融机构存贷款数据

2000-2021年县域金融机构存贷款数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;统计年度、地区编码ID、县域代码、县域名称、所属地级市、所属省份、年末金融机构贷款余额/亿元、年末金融机构存款余额/亿元、年末城乡居民储蓄存款余额/亿元 3、来源&#xff1a;县…

VBA技术资料MF171:创建指定工作表数的工作簿

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Vue.js 和 Node.js 全栈项目的运行与部署指南

Vue.js 和 Node.js 全栈项目的运行与部署指南 前言具体运行方式导入数据库初始化安装配置nodejs启动server后端启动client前端确保前后端正确连接 前言 本博客用来介绍一下一个包含前端和后端代码的全栈项目MoreMall&#xff0c;前端部分使用了 Vue.js&#xff0c;后端部分使用…

Numpy array和Pytorch tensor的区别

1.Numpy array和Pytorch tensor的区别 笔记来源&#xff1a; 1.Comparison between Pytorch Tensor and Numpy Array 2.numpy.array 4.Tensors for Neural Networks, Clearly Explained!!! 5.What is a Tensor in Machine Learning? 1.1 Numpy Array Numpy array can only h…

镂空的文字?分享 1 段优质 CSS 代码片段!

大家好&#xff0c;我是大澈&#xff01; 本文约 800 字&#xff0c;整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段优质 CSS 代码片段&#xff0c;实现 CSS 文字镂空的效果。 老规矩&#xff0c;先阅读代码片段并思考&#xff0c;再看代码解析再思考&#…

Jmeter性能场景设计

为什么会有性能场景设计呢&#xff1f; 相信有部分同学对场景设计优点模糊&#xff0c;前面博文提到的是场景提取 场景设计&#xff1a;在压测的过程中怎么设置线程数、Ramp-Up时间(秒)、循环次数等等 一、 性能场景分类 场景的概念&#xff1a; a. 单场景 b. 混合场景 c. 容…

ArtTS语言基础类库内容的学习(2.10.1)

上篇回顾&#xff1a; ArkTS开发系列之Web组件的学习&#xff08;2.9&#xff09; 本篇内容&#xff1a;ArtTS语言基础类库-异步同步并发内容的学习(2.10.1&#xff09; 一、知识储备 1. 异常并发 Promise和Async/await提供异步并发能力&#xff0c;是标准的JS异步语法 Pr…

kicad第三方插件安装问题

在使用KICAD时想安装扩展内容&#xff0c;但是遇到下载失败&#xff0c;因为SSL connect error。 因为是公司网络&#xff0c;我也不是很懂&#xff0c;只能另寻他法。找到如下方法可以曲线救国。 第三方插件包目录 打开存放第三方插件存放目录&#xff0c;用于存放下载插件包…

什么是中断?---STM32篇

目录 一&#xff0c;中断的概念 二&#xff0c;中断的意义 三&#xff0c;中断的优先级 四&#xff0c;中断的嵌套 如果一个高优先级的中断发生&#xff0c;它会立即打断当前正在处理的中断&#xff08;如果其优先级较低&#xff09;&#xff0c;并首先处理这个高优…

AGPT•intelligence:带你领略全新量化交易的风采

随着金融科技的快速发展&#xff0c;量化交易已经成为了投资领域的热门话题。越来越多的投资者开始关注和使用量化交易软件来进行投资决策。在市场上有许多量化交易软件可供选择。 Delaek&#xff0c;是一位资深的金融科技专家&#xff0c;在 2020年成立一家专注于数字资产量化…

【全球首个开源AI数字人】DUIX数字人-打造你的AI伴侣!

目录 1. 引言1.1 数字人技术的发展背景1.2 DUIX数字人项目的开源意义1.3 DUIX数字人技术的独特价值1.4 本文目的与结构 2. DUIX数字人概述2.1 定义与核心概念2.2 硅基智能与DUIX的关系2.3 技术架构2.4 开源优势2.5 应用场景2.6 安全与合规性 3. DUIX数字人技术特点3.1 开源性与…

[OtterCTF 2018]Bit 4 Bit

我们已经发现这个恶意软件是一个勒索软件。查找攻击者的比特币地址。** 勒索软件总喜欢把勒索标志丢在显眼的地方&#xff0c;所以搜索桌面的记录 volatility.exe -f .\OtterCTF.vmem --profileWin7SP1x64 filescan | Select-String “Desktop” 0x000000007d660500 2 0 -W-r-…

Java新手启航:Windows下JDK安装,开启编程之旅

你是不是对编程充满好奇&#xff0c;想要迈入Java的世界&#xff0c;却不知道从何开始&#xff1f;别担心&#xff0c;每一个Java大师都是从安装JDK开始的&#xff0c;而今天&#xff0c;我将手把手教你如何轻松完成JDK的安装&#xff0c;让你迈出编程之旅的第一步! 接下来&am…

[Cloud Networking] BGP

1. AS (Autonomous System) 由于互联网规模庞大&#xff0c;所以网络会被分为许多 自治系统&#xff08;AS-Autonomous system&#xff09;。 所属类型ASN名称IPv4 数量IPv6数量运营商ISPAS3356LEVEL3 - Level 3 Parent, LLC, US29,798,83273,301,954,048互联网企业AS15169GO…

vue组件全局注册

描述&#xff1a; vue组件的注册分为局部和全局注册两部分&#xff0c;局部注册相对容易&#xff0c;不做赘述&#xff1b;而不同框架的注册方法又有所不同&#xff0c;下面针对vite框架和vue-cli框架的注册分别进行说明 vue组件全局注册 一、vite框架中全局组件注册二、Vue-cl…

AI复活亲人市场分析:技术、成本与伦理挑战

“起死回生”这种事&#xff0c;过去只存在于科幻电影里&#xff0c;但今年&#xff0c;被“复活”的案例却越来越多。 2月底&#xff0c;知名音乐人包晓柏利用AI“复活”了她的女儿&#xff0c;让她在妈妈生日时唱了一首生日歌&#xff1b;3月初&#xff0c;商汤科技的年会上…

ComfyUI汉化插件安装

步骤一&#xff1a;点击Manager 步骤二&#xff1a;选择安装插件 步骤三&#xff1a;搜索Translation&#xff0c;选择第一个点击右边得安装 步骤四&#xff1a;点击下放得RESTART进行重启 步骤五&#xff1a;等待重启完成后&#xff0c;点击设置 步骤六&#xff1a;选择中文语…