谁说爬虫只能Python?看我用C#快速简单实现爬虫开发和演示!

python · 浏览次数 : 0

小编点评

## C# Simple Web Scraper This code demonstrates a basic web scraper using C# and the HtmlAgilityPack library. **Required Packages:** * HtmlAgilityPack **Instructions:** 1. Save the code in a file named `Scraper.cs` 2. Run the program 3. The text, images, and videos will be saved to the current directory 4. You can modify the `baseUrl` variable to target any website **Code:** ```csharp using HtmlAgilityPack; static async Task ProcessText(HtmlDocument doc, string textDir) { var textNodes = doc.DocumentNode.SelectNodes("//*[text()]"); if (textNodes != null) { StringBuilder allText = new StringBuilder(); foreach (HtmlNode node in textNodes.Where(node => !string.IsNullOrWhiteSpace(node.InnerText))) { string textContent = WebUtility.HtmlDecode(node.InnerText.Trim()); if (!string.IsNullOrWhiteSpace(textContent)) { allText.AppendLine(textContent); } } string filePath = Path.Combine(textDir, "text.txt"); await File.WriteAllTextAsync(filePath, allText.ToString()); } } static async Task ProcessImages(HtmlDocument doc, string baseUrl, string imagesDir) { var imageNodes = doc.DocumentNode.SelectNodes("//img[@src]"); if (imageNodes != null) { foreach (HtmlNode imageNode in imageNodes) { string imageUrl = imageNode.GetAttributeValue("src", null); imageUrl = EnsureAbsoluteUrl(baseUrl, imageUrl); string fileName = Path.GetFileName(new Uri(imageUrl).LocalPath); string localPath = Path.Combine(imagesDir, fileName); byte[] imageBytes = await client.GetByteArrayAsync(imageUrl); await File.WriteAllBytesAsync(localPath, imageBytes); } } } static async Task ProcessVideos(HtmlDocument doc, string baseUrl, string videosDir) { var videoNodes = doc.DocumentNode.SelectNodes("//video/source[@src]"); if (videoNodes != null) { foreach (HtmlNode videoNode in videoNodes) { string videoUrl = videoNode.GetAttributeValue("src", null); videoUrl = EnsureAbsoluteUrl(baseUrl, videoUrl); string videoName = Path.GetFileName(new Uri(videoUrl).LocalPath); string videoPath = Path.Combine(videosDir, videoName); byte[] videoBytes = await client.GetByteArrayAsync(videoUrl); await File.WriteAllBytesAsync(videoPath, videoBytes); } } } static string EnsureAbsoluteUrl(string baseUrl, string url) { return Uri.IsWellFormedUriString(url, UriKind.Absolute) ? url : new Uri(new Uri(baseUrl), url).AbsoluteUri; } static async Task Main() { // Example URL string baseUrl = "your_website_url"; // Load the HTML document var doc = await HtmlWebRequest.GetHtmlDocumentAsync(baseUrl); // Process text await ProcessText(doc, "text_directory_path"); // Process images await ProcessImages(doc, baseUrl, "images_directory_path"); // Process videos await ProcessVideos(doc, baseUrl, "videos_directory_path"); } ``` **Note:** This code requires the `HttpClient` library to be installed. You can install it using NuGet: `Install-Package HttpClient`

正文

前言:说到爬虫,基本上清一色的都知道用Python,但是对于一些没玩过或者不想玩Python的来说,却比较头大一点。所以以下我站在C# 的角度,来写一个简单的Demo,用来演示C# 实现的简单小爬虫。大家感兴趣可以自己拓展出更加丰富的爬虫功能。

前提:引用包HtmlAgilityPack 

先来个爬取文本。

新建一个文本处理的方法,用于处理爬取的文本数据,并写入到指定文件夹内的text.txt文件内

0
 
static async Task ProcessText(HtmlDocument doc, string textDir)
{
    var textNodes = doc.DocumentNode.SelectNodes("//*[text()]");
    if (textNodes != null)
    {
        StringBuilder allText = new StringBuilder();
        foreach (HtmlNode node in textNodes.Where(node => !string.IsNullOrWhiteSpace(node.InnerText)))
        {
            string textContent = WebUtility.HtmlDecode(node.InnerText.Trim());
            if (!string.IsNullOrWhiteSpace(textContent))
            {
                allText.AppendLine(textContent);
            }
        }

        string filePath = Path.Combine(textDir, "text.txt");
        await File.WriteAllTextAsync(filePath, allText.ToString());
    }
}

 

 
新增一个网页处理方法,用于传入网址进行抓取网页数据,并传给以上的文本处理方法进行解析文本数据,保存到当前根目录下的Texts文件夹内
0
以我两天前写的博客内容为例,进行抓取。博客地址为:https://www.cnblogs.com/weskynet/p/18213135
0
Main里面调用有关方法,进行爬取。
0
说明:添加 User-Agent 头部信息可以帮助模拟常规的浏览器请求,避免被目标服务器拒绝。
看下我当前的根目录:
0
运行完毕,多出Texts文件夹
0
文件夹内多出程序里面写定的text.txt文件
0
打开文本文件,可以看到文章全部内容,以及所有文本都被抓取下来了。
0
 
同文本处理,新增一个图片处理方法:
0
 
static async Task ProcessImages(HtmlDocument doc, string baseUrl, string imagesDir)
{
    var imageNodes = doc.DocumentNode.SelectNodes("//img[@src]");
    if (imageNodes != null)
    {
        foreach (HtmlNode imageNode in imageNodes)
        {
            string imageUrl = imageNode.GetAttributeValue("src", null);
            imageUrl = EnsureAbsoluteUrl(baseUrl, imageUrl);
            string fileName = Path.GetFileName(new Uri(imageUrl).LocalPath);
            string localPath = Path.Combine(imagesDir, fileName);

            byte[] imageBytes = await client.GetByteArrayAsync(imageUrl);
            await File.WriteAllBytesAsync(localPath, imageBytes);
        }
    }
}

 

网页爬取方法里面把文本有关改成图片
0
以下是一个辅助方法,辅助方法用于处理相对URL,确保所有请求的URL是绝对的,防止资源加载失败。
static string EnsureAbsoluteUrl(string baseUrl, string url) { return Uri.IsWellFormedUriString(url, UriKind.Absolute) ? url : new Uri(new Uri(baseUrl), url).AbsoluteUri; }
执行程序,执行完毕,根目录下新增Images文件夹
0
文件夹内会看到该网址的所有图片文件。
0
图片文件格式都会被抓取,可以根据自己需要进行过滤。如果是整个站点,可以根据循环进行获取每个页面的数据。
最后再提供一个视频爬取的代码,由于没找到可以爬取的站点,此处演示就不演示了,仅供代码出来给大家学习和技术分享使用。感兴趣的大佬可以自行尝试。
0
 
static async Task ProcessVideos(HtmlDocument doc, string baseUrl, string videosDir)
{
    var videoNodes = doc.DocumentNode.SelectNodes("//video/source[@src]");
    if (videoNodes != null)
    {
        foreach (HtmlNode videoNode in videoNodes)
        {
            string videoUrl = videoNode.GetAttributeValue("src", null);
            videoUrl = EnsureAbsoluteUrl(baseUrl, videoUrl);
            string videoName = Path.GetFileName(new Uri(videoUrl).LocalPath);
            string videoPath = Path.Combine(videosDir, videoName);

            byte[] videoBytes = await client.GetByteArrayAsync(videoUrl);
            await File.WriteAllBytesAsync(videoPath, videoBytes);
        }
    }
}

如果大佬们想要直接获取我本地测试的源码demo,可以在我的公众号【Dotnet Dancer】后台回复:【爬虫】  即可获取我的本地demo源码自行调试和把玩。

最近园子时不时会图片全挂掉,如果图片没掉了,可以移步另一个地方围观:

https://mp.weixin.qq.com/s/NB2UWsfUdgNU82UVRbWe3Q

 

如果以上内容对你有帮助,欢迎关注我的公众号【Dotnet Dancer】,或点赞、推荐和分享。我会时不时更新一些其他C#或者其他技术文章。

 
 

与谁说爬虫只能Python?看我用C#快速简单实现爬虫开发和演示!相似的内容:

谁说爬虫只能Python?看我用C#快速简单实现爬虫开发和演示!

前言:说到爬虫,基本上清一色的都知道用Python,但是对于一些没玩过或者不想玩Python的来说,却比较头大一点。所以以下我站在C# 的角度,来写一个简单的Demo,用来演示C# 实现的简单小爬虫。大家感兴趣可以自己拓展出更加丰富的爬虫功能。 前提:引用包HtmlAgilityPack 先来个爬取

谁说.net core不好动态访问webservice?看这篇文章,C#快速实现动态访问webservice,兼容.net framework和.net core+

前言:访问webservice,大多数人都是用服务引用的方式,但是这种方式比较麻烦,例如遇到服务更新了,你还需要手动更新你的服务引用,再重新发布,很麻烦。或者已有的一些例子,至少我看到的很多案例,动态访问也只能止步于使用.net framework环境,没看到有啥.net core上面动态访问的案例

[转帖]性能调优——小小的log大大的坑

https://segmentfault.com/a/1190000042434642 引言 “只有被线上服务问题毒打过的人才明白日志有多重要!”我先说结论,谁赞成,谁反对?如果你深有同感,那恭喜你是个社会人了:) 日志对程序的重要性不言而喻,轻巧、简单、无需费脑,程序代码中随处可见,帮助我们排查定

谁会拒绝一款开源的 3D 博客呢?

说到博客大家一定都不陌生,不管你是深耕职场多年的老鸟,还是在学校努力学习的小鸟,应该都有过一段“装扮”博客的经历,比如:放上喜欢的图片、添加炫酷的交互、换上 DIY 的博客主题等等。但不管再怎么“打扮”,也跳脱不出平面的“凡胎”。 今天 HelloGitHub 给大家带来的是一款开源的 3D 博客项

[转帖]NVMe-oF以太网SSD:三星说第一家,东芝/Marvell两年前就有了?

https://aijishu.com/a/1060000000238559 目录 -到底谁是第一款原生NVMe-oFSSD? -连接方案&性能测试 -从2019年拖到现在:还能引领存储系统潮流吗? -以太网SSD应用:不只是块设备? 在ODCC 2021开放数据中心峰会上,三星展出了Etherne

[转帖]看6大国产CPU加速替代,谁才是“王者”选手?

https://baijiahao.baidu.com/s?id=1761150458273739276&wfr=spider&for=pc 2023-03-23 17:33湖北匠心计划创作者,媒体人,优质科技领域创作者,内容评审官,活力创作者 关注 说到芯片,特别是底层硬件基础设施核心CPU中央处

能将三次握手讲到这个程度,不给你offer给谁!

摘要:在后端相关岗位的入职面试中,三次握手的出场频率非常的高,甚至说它是必考题也不为过。 本文分享自华为云社区《能将三次握手理解到这个深度,面试官拍案叫绝~》,作者:龙哥手记。 在后端相关岗位的入职面试中,三次握手的出场频率非常的高,甚至说它是必考题也不为过。一般的答案都是说客户端如何发起 SYN

记一次线上问题 → Deadlock 的分析与优化

开心一刻 今天女朋友很生气 女朋友:我发现你们男的,都挺单纯的 我:这话怎么说 女朋友:脑袋里就只想三件事,搞钱,跟谁喝点,还有这娘们真好看 我:你错了,其实我们男人吧,每天只合计一件事 女朋友:啥事呀? 我:这娘们真好看,得搞钱跟她喝点 问题复现 需求背景 MySQL8.0.30 ,隔离级别是默认

[转帖]linux 上进程被随机kill掉,如何监测和查询;谁杀了我的进程;Who sends a SIGKILL to my process mysteriously on ubuntu server

https://www.cnblogs.com/xuyaowen/p/linux-audit.html 今天跑实验,发现进程被随机kill。咨询了服务器上的其他同学,他们说之前也发生过,一直存在。看来可能有可能不是我自己程序的原因,只能自己动手解决了。 在 Who sends a SIGKILL t

记一次 某智能制造MES系统CPU 爆高分析

一:背景 1. 讲故事 前段时间有位朋友找到我,说他 docker 中的web服务深夜cpu被打满,让我帮忙看一下,很多朋友问docker中怎么抓dump,我一般都推荐使用 procdump 这款自动化工具,谁用谁知道,有了 dump 之后,接下来就是分析了。 二:WinDbg 分析 1. cpu