C#基于.Net-HtmlAgilityPack库的爬虫初体验

讲故事

前几天有点空闲时间,在github上看一些.Net的开源库,看到了关于爬虫相关的库,于是加入了一个QQ群,看到里面各位大佬讨论的是爬的越好,进去越快,于是我自己也想做一个爬虫相关的东西,但是爬虫是个危险的东西,自己也不敢随便爬别人的网页,于是找到了一个朋友,拿他的网站来进行练习!

e79977f18774459a7d9daa7a97d7c378.png

练习

对于.Net来说。爬虫相关的库还是蛮多的,于是我选择了HtmlAgilityPack来做一个爬虫练习!

当然什么是爬虫呢?

简而言之:

爬虫的基本流程是:下载数据(发送 HTTP 请求并获得返回的 resonse) -> 解析返回的文本(可以是 text、json、html) -> 存储解析到的数据

学习一个框架,我们肯定是从它的官方文档开始, 地址:https://html-agility-pack.net/

Html解析器
  • From File(从文件加载 HTML 文档)

  • From String (从指定的字符串加载 HTML 文档)

  • From Web (从 Internet 资源中获取 HTML 文档)

  • From Browser(从 WebBrowser 获取 HTML 文档)

于是我选择了From Web 来解析我们的html文档, 代码如下:

var html = @"https://dotnet9.com/";HtmlWeb web = new HtmlWeb();var htmlDoc = web.Load(html);

既然Html文档被我们获取到了,我们肯定就要对Html内容进行一个解析了。

Html选择器
  • SelectNodes()(选择与 XPath 表达式匹配的节点列表)

  • SelectSingleNode(String)(选择与 XPath 表达式匹配的第一个 XmlNode)

打开网站,找到我们想要爬取的网站,今天我们就来爬该网站的特色专辑下的所有文章。

27a13a53d528b8055766901bb81bcb01.png

打开调试模式,我们可以看到特色专辑是一个a标签,我们再来查看该标签的上一级元素是li,li上一级元素是ui,那我们就可以来获取该节点

9108c0a927e52a6ba3b7b054d65a3ea0.png

var allNodes = htmlDoc.DocumentNode.SelectNodes("//ul[@id='starlist']//li[@class='menu']");

当然我们也可以使用Xpath来获取节点内容

var singNodes = htmlDoc.DocumentNode.SelectSingleNode("/html[1]/body[1]/header[1]/div[3]/nav[1]/ul[1]/li[3]//ul[1]")

然后我们再来获取该特色专辑下的子菜单的的网址,经发现,a标签的href 属性规定链接的目标地址,那我们第一步肯定是要获取该子菜单下的所有链接!

de403ce36a948db94eba050b02e5e422.png

var singNodes = htmlDoc.DocumentNode.SelectSingleNode("/html[1]/body[1]/header[1]/div[3]/nav[1]/ul[1]/li[3]//ul[1]").ChildNodes.Where(o => o.Name=="li");List<string> lstUrl = new List<string>();foreach (var item in singNodes){var aNodes = item.ChildNodes.Where(o => o.Name == "a").First();string url = aNodes.Attributes["href"].Value;lstUrl.Add(url);}

随意打开一个子菜单,可以看到相关的文章标题描述以及图片等!这就是我们想要的内容了!分析方法还是和刚才一样!代码如下

381305a497202b0d1ceedea054f627f1.png

foreach (var item in lstUrl){htmlDoc = web.Load("https://dotnet9.com"+item);var resultNodes = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='pics-list-box whitebg']//ul").ChildNodes.Where(o=>o.Name=="li");foreach (var itemResultNodes in resultNodes){WebData webData = new WebData();var aNodes = itemResultNodes.ChildNodes.Where(o => o.Name == "a").First();webData.Url= aNodes.Attributes["href"].Value;webData.Title = aNodes.ChildNodes["h2"].InnerText;webData.Desc = aNodes.ChildNodes["p"].InnerText;webData.Img = aNodes.ChildNodes["i"].ChildNodes["img"].Attributes["src"].Value;Console.WriteLine($"标题:{webData.Title}-描述:{webData.Desc}-Img:{webData.Img}-{webData.Url}\r\n");}}

这样我们就能够获取到我们想要的东西了!运行一下代码,我们的第一个爬虫就成功了。

a46ec9127ca54d697eb9f082d40bfb12.png

总结

即兴发挥写了第一个爬虫,大家要是有更好的方案,欢迎交流,独乐乐不如众乐乐,本篇就说到这里啦,希望对您有帮助。

最后声明一下: 总的来说,技术本无罪,但是你利用技术爬取别人隐私、商业数据,那你就是蔑视法律了,请各位守好各自的底线!

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

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

相关文章

C语言试题二十四之编写一个函数unsigned function(unsigned w),w使一个大于10的无符号整数,若w是n(n≥2)位的整数,则函数求出w后n-1位的数作为函数值返回。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

Github上影响力最大的十位Pythoner

http://mp.weixin.qq.com/s?__bizMzAxMjUyNDQ5OA&mid2653551864&idx1&sn493bbba119d6888c7ee5bdcc1a1aaba4&scene1&srcid09115MPDroKR2mgxBaOOIzSb#rd 转载于:https://www.cnblogs.com/ITniu/p/5862322.html

Android中文图混排时文图的居中对齐 FontMetrics以及自定义ImageSpan实现

文章转自&#xff1a;http://www.sohu.com/a/150059234_611601 本文作者CnPeng的博客地址&#xff1a; http://www.jianshu.com/p/2650357f7547 这个标题有点长&#xff0c;乍一看这么个标题你可能没明白啥意思&#xff0c;且听我慢慢道来。 公司的项目中新增了一个“心动”…

关于事件监听机制的总结(Listener和Adapter)

记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.) 附上事件监听机制的分析图: 一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以,男人就不支持生孩子的事件) 事件和监听器有对应关系的. 下面用awt中…

【专升本计算机】专升本计算机期末考试复习题(C卷附答案)

文章目录 一、单选题(每空2分,共20分)。二、填空题(每空2分,共30分)。三、程序题(每小题10分,共50分)一、单选题(每空2分,共20分)。 世界上第一台电子计算机诞生于( B )年。 A.1956   B.1946   C.1944   D.1940关闭正在运行的程序窗口,可以按( D )。 A.…

C语言试题二十五之编写一个函数float function(double h),函数的功能使对变量h中的值保留2位小数,并对第三位进行四舍五入(规定h中的值位正数)。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写一个函…

一、首页、详情页、文章编辑页制作《iVX低代码/无代码个人博客制作》

注&#xff1a;iVX也有免费直播课《第八期直播课》 一、首页制作 首页预览如下&#xff1a; 首先在博客页创建一个相对应项目&#xff1a; 接着选择前台&#xff0c;创建一个页面&#xff0c;命名为首页&#xff1a; 接着更改当前屏幕为小屏尺寸&#xff1a; 接着我们分…

HDU 4085 Steiner树模板称号

Dig The Wells Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 971 Accepted Submission(s): 416Problem DescriptionYou may all know the famous story “Three monks”. Recently they find some places ar…

Saga体系结构模式:微服务架构下跨服务事务的实现

在服务端应用程序中&#xff0c;我们往往会通过事务处理来保证数据一致性&#xff08;Data Consistency&#xff09;&#xff0c;例如&#xff1a;当用户从库存中取走了一定数量的物品&#xff0c;这些物品会体现在用户的提货单上&#xff0c;与此同时&#xff0c;库存中物品的…

Css样式基础

1.Css的语法 CSS的语法主要由两个部分组成&#xff0c;一个是选择器&#xff0c;一个是属性、 选择器又分为以下几种&#xff1a; 1.元素选择器&#xff1a;即Html标签去掉括号的就是元素 2.类选择器&#xff1a;所谓的类就是说class“名称”&#xff0c;类的名称是可以相同&am…

Android 清除png图片的白色背景

/**清除背景颜色 * param mBitmap* param mColor 背景颜色值 eg&#xff1a;Color.WHITE** return*/ private static Bitmap getAlphaBitmap(Bitmap mBitmap, int mColor) {Bitmap mAlphaBitmap Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Confi…

【ArcGIS遇上Python】Python使用栅格数据

栅格数据是一个独特的空间数据类型。很多地理处理工具都是为了处理栅格数据而开发的。 1. 列出栅格数据 ListRaster函数是以Python列表的形式返回工作控件中的栅格数据,该函数的语法格式是: ListRaster({wild_card},{raster_type}) 可选参数wild_card通过名称限制返回的结果…

GPhone、OPhone、UPhone、APhone、IPhone:满城尽带XPhone

本文为原创&#xff0c;如需转载&#xff0c;请注明作者和出处&#xff0c;谢谢&#xff01; 最近一段时间智能手机市场是翻天覆地。各大厂商纷纷推出自己的手机操作系统和手机。Google、Apple、中国移动、中国联通纷纷推出或即将推出自已 的智能手机操作系统&#xff08;虽…

C语言试题二十六之请编写一个函数function(char *s),该函数的功反转字符串中的内容。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

二、文章发布页制作及后台实现《iVX低代码/无代码个人博客制作》

注&#xff1a;iVX也有免费直播课《第八期直播课》 一、文章编辑页制作 当首页制作完毕后&#xff0c;需要显示内容就需要有文章数据&#xff0c;此时我们创建一个文章编辑页增加对应的数据。 那么我们创建一个页面&#xff0c;命名为文章发布页&#xff1a; 接着我们查看标…

VS2013配置pro*C/C++开发环境

2019独角兽企业重金招聘Python工程师标准>>> 1、软件&#xff1a;VS2013&#xff0c;oracle10g 2、VS2013 新建VC空项目&#xff0c;然后在源文件中新建一个*.pc文件&#xff08;不知道我的配置哪儿有问题&#xff0c;新建的pc文件必须和工程同名&#xff09;&#…

查看linux版本的三种常用方法

1) 登录到服务器执行 lsb_release -a &#xff0c;即可列出所有版本信息&#xff0c;例如&#xff1a; [root3.5.5Biz-46 ~]# lsb_release -a LSB Version: 1.3 Distributor ID: RedHatEnterpriseAS Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 1) Rel…

Windows 11 23H2 25131 推送!全新搜索体验,优化应用商店

面向 Dev频道的 Windows 预览体验成员&#xff0c;微软现已推送 Windows 11 预览版 Build 25131。主要变化1.微软为 Windows 11 搜索引入全新体验&#xff0c;当您在搜索结果中点击“打开文件位置”时&#xff0c;现在将选择文件资源管理器中的文件&#xff0c;此前只是打开文件…

C# RichTextBox 实现循环查找关键字

实现效果如上图&#xff0c;点击“Search”按钮&#xff0c;开始从文首查找关键字“menu”&#xff0c;并高亮&#xff0c;再次点击“Search”按钮&#xff0c;继续查找下一个。查找到文末&#xff0c;自动从文首重新查找。 private int _searchIndex 0;//查找开始位置/// <…

C语言试题二十七之请编写程序,实现矩阵(3行3列)的转置(即行列互换)。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…