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

前提:引用包HtmlAgilityPack

先来个爬取文本。

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

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文件夹内
以我两天前写的博客内容为例,进行抓取。博客地址为:https://www.cnblogs.com/weskynet/p/18213135
Main里面调用有关方法,进行爬取。
说明:添加 User-Agent 头部信息可以帮助模拟常规的浏览器请求,避免被目标服务器拒绝。
看下我当前的根目录:
运行完毕,多出Texts文件夹
文件夹内多出程序里面写定的text.txt文件
打开文本文件,可以看到文章全部内容,以及所有文本都被抓取下来了。
 
同文本处理,新增一个图片处理方法:
 
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);
}
}
}
网页爬取方法里面把文本有关改成图片
以下是一个辅助方法,辅助方法用于处理相对URL,确保所有请求的URL是绝对的,防止资源加载失败。
static string EnsureAbsoluteUrl(string baseUrl, string url) { return Uri.IsWellFormedUriString(url, UriKind.Absolute) ? url : new Uri(new Uri(baseUrl), url).AbsoluteUri; }
执行程序,执行完毕,根目录下新增Images文件夹
文件夹内会看到该网址的所有图片文件。
图片文件格式都会被抓取,可以根据自己需要进行过滤。如果是整个站点,可以根据循环进行获取每个页面的数据。
最后再提供一个视频爬取的代码,由于没找到可以爬取的站点,此处演示就不演示了,仅供代码出来给大家学习和技术分享使用。感兴趣的大佬可以自行尝试。

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#快速简单实现爬虫开发和演示!的更多相关文章

  1. 微博爬虫,python微博用户主页小姐姐图片内容采集爬虫

    python爬虫,微博爬虫,需要知晓微博用户id号,能够通过抓取微博用户主页内容来获取用户发表的内容,时间,点赞数,转发数等数据,当然以上都是本渣渣结合网上代码抄抄改改获取的! 要抓取的微博地址:ht ...

  2. 爬虫实践---悦音台mv排行榜与简单反爬虫技术应用

    由于要抓取的是悦音台mv的排行榜,这个排行榜是实时更新的,如果要求不停地抓取,这将有可能导致悦音台官方采用反爬虫的技术将ip给封掉.所以这里要应用一些反爬虫相关知识. 目标网址:http://vcha ...

  3. Python之路【第二十三篇】爬虫

    difference between urllib and urllib2 自己翻译的装逼必备 What is the difference between urllib and urllib2 mo ...

  4. python高级—— 从趟过的坑中聊聊爬虫、反爬以及、反反爬,附送一套高级爬虫试题

    前言: 时隔数月,我终于又更新博客了,然而,在这期间的粉丝数也就跟着我停更博客而涨停了,唉 是的,我改了博客名,不知道为什么要改,就感觉现在这个名字看起来要洋气一点. 那么最近到底咋不更新博客了呢?说 ...

  5. 【Python开发】【神经网络与深度学习】网络爬虫之python实现

    一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一 ...

  6. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

  7. 纯手工打造简单分布式爬虫(Python)

    前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. ...

  8. 基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看)

    前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就先带大家开发一个最简单低端的爬虫,突破携程网超 ...

  9. [Python]网络爬虫(九):百度贴吧的网络爬虫(v0.4)源码及解析

    转自:http://blog.csdn.net/pleasecallmewhy/article/details/8934726 百度贴吧的爬虫制作和糗百的爬虫制作原理基本相同,都是通过查看源码扣出关键 ...

  10. [Python]网络爬虫(八):糗事百科的网络爬虫(v0.2)源码及解析

    转自:http://blog.csdn.net/pleasecallmewhy/article/details/8932310 项目内容: 用Python写的糗事百科的网络爬虫. 使用方法: 新建一个 ...

随机推荐

  1. 第八篇:socket网络编程

    一.网络编程简绍 二.socket连接过程 三.socket文件传输 四.socket循环接收 五.socket粘包处理 六.FTP文件传输 七.socketServer 八.web框架 #!/usr ...

  2. CentOS下修改 MySQL 的密码

    做服务器运维,修改 MySQL 的密码是经常的需要,定期修改 MySQL 密码是网站安全的一个保证.这里记录一下修改 MySQL 密码的一些命令,方便以后查看. 修改root密码 CentOS 下 M ...

  3. 刪除k个数字后的最小值

    前言 比如说 1593212,去掉一个数字后,保留的是最小值. 原理:因为要保留最小值,那么要删除最高位的数字是最明显的. 那么1和5到底删除哪一个呢?当然是删除最大值了. 代码 public sta ...

  4. git合并某分支上的单次提交(cherry-pick)

    1. 查找提交对应的hash值 git log 查看 d 查看下一页,q退出 vscode通过gitlens插件查看 2.合并提交 git cherry-pick hahs值

  5. Oracle 在PL/SQL将字符串分割输出

    Oracle 在PL/SQL将字符串分割输出 示例如下: declare begin for maina in (select tt.line ll from (select regexp_subst ...

  6. 力扣459(java)-重复的子字符串(简单)

    题目: 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab"输出: true解释: 可由子串 "ab&quo ...

  7. MaxCompute非事务表如何更新数据

    简介: 本文主要讲解如何通过insert overwrite更新数据 背景 对于大数据中的大多数存储格式,支持随机更新非常复杂.它需要扫描大型文件,MaxCompute推出了最新的功能Transact ...

  8. [FAQ][Hardhat] Error HH501: Couldn't download compiler version 0.8.0. Please check your connection.

    当使用 npx hardhat compile 命令编译智能合约时,会先下载你在 hardhat.config.js 配置中对应版本的 solidity 编译器. 当网络不可达时,就会提示无法下载的错 ...

  9. [FAQ] MetaMask ALERT: 交易出错. 合约代码执行异常.

    首先确认载入的合约地址是否是最新的,比如 web3 载入的 abi 格式的 json 文件名 正不正确. 其次需要检查合约逻辑是否都正确,以及是否是合约抛出的错误,这两点最好是通过写测试用例来保证. ...

  10. MQTT GUI 客户端 可视化管理工具

    MQTT GUI 客户端 可视化管理工具 介绍 多标签页管理,同时打开多个连接 提供原生性能,并且比使用 Electron 等 Web 技术开发的同等应用程序消耗的资源少得多 支持 MQTT v5.0 ...