谁说爬虫只能Python?看我用C#快速简单实现爬虫开发和演示!
前言:说到爬虫,基本上清一色的都知道用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());
}
}
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);
}
}
}
如果大佬们想要直接获取我本地测试的源码demo,可以在我的公众号【Dotnet Dancer】后台回复:【爬虫】 即可获取我的本地demo源码自行调试和把玩。
最近园子时不时会图片全挂掉,如果图片没掉了,可以移步另一个地方围观:
https://mp.weixin.qq.com/s/NB2UWsfUdgNU82UVRbWe3Q
如果以上内容对你有帮助,欢迎关注我的公众号【Dotnet Dancer】,或点赞、推荐和分享。我会时不时更新一些其他C#或者其他技术文章。
谁说爬虫只能Python?看我用C#快速简单实现爬虫开发和演示!的更多相关文章
- 微博爬虫,python微博用户主页小姐姐图片内容采集爬虫
python爬虫,微博爬虫,需要知晓微博用户id号,能够通过抓取微博用户主页内容来获取用户发表的内容,时间,点赞数,转发数等数据,当然以上都是本渣渣结合网上代码抄抄改改获取的! 要抓取的微博地址:ht ...
- 爬虫实践---悦音台mv排行榜与简单反爬虫技术应用
由于要抓取的是悦音台mv的排行榜,这个排行榜是实时更新的,如果要求不停地抓取,这将有可能导致悦音台官方采用反爬虫的技术将ip给封掉.所以这里要应用一些反爬虫相关知识. 目标网址:http://vcha ...
- Python之路【第二十三篇】爬虫
difference between urllib and urllib2 自己翻译的装逼必备 What is the difference between urllib and urllib2 mo ...
- python高级—— 从趟过的坑中聊聊爬虫、反爬以及、反反爬,附送一套高级爬虫试题
前言: 时隔数月,我终于又更新博客了,然而,在这期间的粉丝数也就跟着我停更博客而涨停了,唉 是的,我改了博客名,不知道为什么要改,就感觉现在这个名字看起来要洋气一点. 那么最近到底咋不更新博客了呢?说 ...
- 【Python开发】【神经网络与深度学习】网络爬虫之python实现
一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一 ...
- 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)
Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...
- 纯手工打造简单分布式爬虫(Python)
前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. ...
- 基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看)
前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就先带大家开发一个最简单低端的爬虫,突破携程网超 ...
- [Python]网络爬虫(九):百度贴吧的网络爬虫(v0.4)源码及解析
转自:http://blog.csdn.net/pleasecallmewhy/article/details/8934726 百度贴吧的爬虫制作和糗百的爬虫制作原理基本相同,都是通过查看源码扣出关键 ...
- [Python]网络爬虫(八):糗事百科的网络爬虫(v0.2)源码及解析
转自:http://blog.csdn.net/pleasecallmewhy/article/details/8932310 项目内容: 用Python写的糗事百科的网络爬虫. 使用方法: 新建一个 ...
随机推荐
- 及刻周边惠:拥抱HarmonyOS原子化服务
原文链接:https://mp.weixin.qq.com/s/Y75eiRlvDLXzoZWzAiZdeg,点击链接查看更多技术内容: 开发背景 及刻周边惠是梦享网络旗下本地生活服务平台,旨在为消费 ...
- Godot.NET C#IOC重构(2):TileMap 详解
目录 前言 TileMap添加 TileMap绘制 TileMap 连续图块 修改纹理原点 统一设置 自动地形 匹配规则 修改匹配概率 修改概率前 修改概率后 随机图块 Scattering 不连续间 ...
- k8s 深入篇———— docker 镜像是什么[二]
前言 简单介绍一下docker的镜像. 正文 前面讲到了容器的工作原理了(namespace 限制了时间, cgroup限制了资源),知道docker 历史的也知道,docker 之所以能够称为容器大 ...
- spring boot oauth2 取消认证
最近有一个项目需要从微服务中抽离,但是因为调用的包里关联了认证所以就算抽离处理还是会进oauth2默认的登入页面: @SpringBootApplication(exclude = {EurekaCl ...
- GaussDB(DWS)基于Flink的实时数仓构建
本文分享自华为云社区<GaussDB(DWS)基于Flink的实时数仓构建>,作者:胡辣汤. 大数据时代,厂商对实时数据分析的诉求越来越强烈,数据分析时效从T+1时效趋向于T+0时效,为了 ...
- 【笔记】go语言--函数式编程
[笔记]go语言--函数式编程 简单来说,go语言的函数式编程体现的是一个闭包的情况 函数式编程 VS 函数指针 函数是一等公民:参数,变量,返回值都可以是函数 高阶函数 函数->闭包 &quo ...
- 力扣306(java)-累加数(中等)
题目: 累加数 是一个字符串,组成它的数字可以形成累加序列. 一个有效的 累加序列 必须 至少 包含 3 个数.除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和. 给你一个只包含数 ...
- 牛客网-SQL专项训练18
①在下列sql语句错误的是?B 解析: 在sql中若要取得NULL,则必须通过IS NULL或者IS NOT NULL进行获取,无法直接使用等号. 一个等号(=)表示把1赋值给变量啊 ==:称为等值符 ...
- dotnet 6 使用 File.Exists 判断管道是否存在将让下次连接失败
我尝试在 dotnet 6 使用 File.Exists 判断管道是否存在,如果管道存在再进行连接.然而这个逻辑将会接下来的 NamedPipeClientStream 调用 Connect 连接失败 ...
- Istio微服务入门---通过istio部署微服务实现灰度发布(15)
一.Istio简介 1.1 Istio介绍 官方文档:https://istio.io/docs/concepts/what-is-istio/ 中文官方文档:https://istio.io/zh/ ...