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

  微信公众号“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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值