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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

二、文章发布页制作及后台实现《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;&#…

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;//查找开始位置/// <…

网站常见漏洞-- XSS攻击

跨站攻击&#xff0c;即Cross Site Script Execution(通常简写为XSS&#xff0c;因为CSS与层叠样式表同名&#xff0c;故改为XSS) 是指攻击者利用网站程序对用户输入过滤不足&#xff0c;输入可以显示在页面上对其他用户造成影响的HTML代码&#xff0c;从而盗取用户资料、利用用…

【ArcGIS遇上Python】从入门到精通系列之第一章:ArcGIS Python简介

文章目录1. Python简介2. Python的特点3. ArcGIS的脚本语言4. ArcGIS中的Python脚本编辑器1. Python简介 Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell)&#xff0c;随着版…

C# RichTextBox 做简单的HTML代码编辑器 ---------左侧显示行号

说明&#xff1a;此显示行号为实际行号&#xff0c;不论是空行还是自动换行&#xff0c;都计算在内&#xff0c;跟实际IDE的行号不同&#xff0c;同步滚动会有半行高度以内的误差。 实现原理&#xff0c;在RichTextBox 编辑器左侧放置另一RichTextBox &#xff08;或其它控件也…

五、文章详情页制作及跳转功能实现《iVX低代码/无代码个人博客制作》

注&#xff1a;iVX也有免费直播课《第八期直播课》 一、详情页制作 在之前的章节中&#xff0c;我们已经制作完毕了登录、注册、首页等内容&#xff0c;在这一节中&#xff0c;我们编写详情页以及详情页功能制作。 详情页页面如下&#xff1a; 详情页头部也就是一个头部栏&…

c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast

c 数据类型转换&#xff1a; static_cast dynamic_cast reinterpret_cast const_cast 【版权声明】转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3175217.html【目录】 引言 static_cast 定义 dynamic_cast 定义 举例&#xff1a;下行转换&#xff08;把基类的指针或引用…

日用有余!国产中科方德桌面操作系统初体验

国产IT圈里最受关注的话题&#xff0c;除了芯片想必就是操作系统了。但真说起国产操作系统&#xff0c;大家是既熟悉又陌生&#xff0c;听说过的多而真正使用过的少。而伴随产业发展&#xff0c;市面上也涌现出众多国产操作软件&#xff0c;这些系统是否好用&#xff1f;能否满…

C# RichTextBox 做简单的HTML代码编辑器 ---------利用WinApi修正左侧显示行号 误差

说明&#xff1a;通过WinApi可以准确定准滚动位置。 //行号 生成显示 这里rtbLineNum用的 RichTextBox&#xff0c;也可以用其它private void ShowLineNum(){rtbLineNum.Text "";//计算行高&#xff0c;行数int linesLength 0;var pFirst tbEditor.GetPositionFr…

Angular - - angular.element

angular.element 将DOM元素或者HTML字符串一包装成一个jQuery元素。 格式&#xff1a;angular.element(element); element&#xff1a;包装成jquery对象的html字符串或者dom元素 jqLite提供的方法&#xff1a; addClass()after()append()attr()bind() – 不支持命名空间,选择器…

六、文章详情显示及点赞实现《iVX低代码/无代码个人博客制作》

注&#xff1a;iVX也有免费直播课《第八期直播课》 一、文章详情实现 上一节我们已经完成了首页的内容显示&#xff0c;那么此时我们完成点击后跳转到详情页内容。 那么此时由于我们需要跳转到详情页需要对应的数据ID&#xff0c;那么此时还需要给首页的文章数据对象数组一个…

System.CommandLine选项Option

前一篇简单看了一下CommandLine命令的使用&#xff0c;其实在一个命令行工具中&#xff0c;还有一个重要的点&#xff0c;那就是选项——Option&#xff0c;选项是为命提供参数&#xff0c;就好像C#中方法&#xff0c;Command就像方法&#xff0c;Option就像方法的参数&#xf…

【ArcGIS风暴】ArcGIS10.6栅格计算器(Raster Calculator)用法详解

扩展阅读: 【ArcGIS风暴】ArcGIS 10.2栅格计算器实用公式大全(经典珍藏版) 【ArcGIS风暴】栅格计算器(Raster Calculator)运算出现错误问题及解决方案汇总 文章目录 1. 栅格计算器简介2. 栅格计算器用法3. 简单算术运算4. 数学函数运算5. 空间分析函数运算1. 栅格计算器简…