.Net Core下使用HtmlAgilityPack解析采集互联网数据
HtmlAgilityPack应该算是.Net下最好用的html解析库了。
因为最近帮朋友采集一些数据,在nuget里面搜索了好几个库,最后决定就用HtmlAgilityPack。并简单的记录下使用的姿势。
直接使用nuget包安装
Install-Package HtmlAgilityPack -Version 1.11.
1.下载网页
该库提供了一个下载网页的类:HtmlWeb
var webGet = new HtmlWeb();
var document = webGet.Load(url);
如果网络正常的话,就会拿到一个HtmlDocument的对象。后面我们所有的操作都是基于该类做的。
我个人更喜欢使用HttpClient来下载网页,然后使用HtmlDocument来LoadHtml。因为自己使用HTMLClient可控性更高。比如要加代理IP,随机设置UA等操作。
当然简单的使用,使用HtmlWeb就差不多了。
2.解析网页
第一步拿到的htmlDocument对象,里面提供了很多操作。

举个栗子,比如我们要获取网页的文章的作者,直接在Chrome中右键->审查元素->elements->右键->Copy->Copy Xpath
document.DocumentNode.SelectSingleNode("Chrome复制的xpath")?.InnerText
然后就成功采集到了作者名字
如何解析列表?
用博客园举栗子,首页就是一个列表文章页。我们如何获取到这个列表所有的项呢?
var nodes =  document.DocumentNode.SelectNodes("xpath表达式")
如果熟悉xpath的老哥们就知道使用双斜杠开头的,就可以获取到多项节点的结果。比如博客园的表达式为: //div[@class='post_item'],然后获取到HtmlDocument的一个集合,再解析集合的子节点,就行了!
如何删除标签?
有些文章中,会隐藏a标签来给批量采集的人下毒。
可以直接使用Descendants方法找到所有的a标签,然后删除
var aNodes = 获取到的HtmlDocument对象.DocumentNode.Descendants("a")
 foreach (var anode in aNodes.ToArray())
            {
                anode.Remove();
            }
如果要采集图片呢?
一般图片地址放在img的src属性上,
var imgNodes = detail.DocumentNode.Descendants("img");
            foreach (var img in imgNodes)
            {
                string imgurl = img.GetAttributeValue("src","");
            }
获取到地址,就可以使用HTTPClient来下载图片并保存到文件夹中
如何修改节点属性?
举个栗子,如果我们把图片上传到我们的服务器,然后要在文章中替换掉别人的图片地址,那应该怎么做呢?
 var imgNodes = detail.DocumentNode.Descendants("img");
            foreach (var img in imgNodes)
            {
                img.SetAttributeValue("src", "图片地址");
            }
基本上,掌握这几点,就能到处去采集别人的网站了。
当然HtmlAgilityPack的功能远远不止本文所描述的这些,更多的功能,可能需要有更深入的需求才会用到,
有不懂或者需要交流的大佬们,可以加我的QQ:862640563 QQ群:545594312
.Net Core下使用HtmlAgilityPack解析采集互联网数据的更多相关文章
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
		第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ... 
- Asp.net core下利用EF core实现从数据实现多租户(1)
		前言 随着互联网的的高速发展,大多数的公司由于一开始使用的传统的硬件/软件架构,导致在业务不断发展的同时,系统也逐渐地逼近传统结构的极限. 于是,系统也急需进行结构上的升级换代. 在服务端,系统的I/ ... 
- 云计算下PAAS的解析一
		云计算下PAAS的解析一 PaaS是Platform-as-a-Service的缩写,意思是平台即服务. 把服务器平台作为一种服务提供的商业模式.通过网络进行程序提供的服务称之为SaaS( ... 
- AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控 (无心打造文字不喜勿喷谢谢!)
		概述 Prometheus的主要特点 组件 结构图 适用场景 不适用场景 安装node_exporter,系统性能指数收集(收集系统性能情况) 下载文件 解压并复制node_exporter应用程序到 ... 
- .NET Core中的CSV解析库
		感谢 本篇首先特别感谢从此启程兄的<.NetCore外国一些高质量博客分享>, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下. .NET ... 
- Spark RDD/Core 编程 API入门系列之简单移动互联网数据(五)
		通过对移动互联网数据的分析,了解移动终端在互联网上的行为以及各个应用在互联网上的发展情况等信息. 具体包括对不同的应用使用情况的统计.移动互联网上的日常活跃用户(DAU)和月活跃用户(MAU)的统计, ... 
- EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱
		前言 上一节我们针对最开始抛出的异常只是进行了浅尝辄止的解析,是不是有点意犹未尽的感觉,是的,我也有这种感觉,看到这里相信您和我会有一些疑惑,要是我们接下来通过注解.Fluent APi.DbSet分 ... 
- 4.5 .net core下直接执行SQL语句并生成DataTable
		.net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs& ... 
- .Net Core 之 图形验证码  本文介绍.Net Core下用第三方ZKWeb.System.Drawing实现验证码功能。
		本文介绍.Net Core下用第三方ZKWeb.System.Drawing实现验证码功能. 通过测试的系统: Windows 8.1 64bit Ubuntu Server 16.04 LTS 64 ... 
随机推荐
- hdu6354 杭电第五场 Everything Has Changed 计算几何
			Everything Has Changed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java ... 
- Atcoder D - Black and White Tree(树dp+博弈)
			题目链接:http://agc014.contest.atcoder.jp/tasks/agc014_d 题意:有一棵树先手涂白色,后手涂黑色,直到不能再涂为止.涂完后再把所有黑色直接相邻的白色都变成 ... 
- Increasing heap size while building the android source code on Ubuntu 15.10
			http://stackoverflow.com/questions/34940793/increasing-heap-size-while-building-the-android-source-c ... 
- C#基础——事件初步
			事件是C#语言的重要成员之一,初学者往往不能很好的去理解和运用事件,特别是自定义事件.在这里将以较简单的方式呈现事件最基本的用法. 1.事件的定义 给事件下定义是一个较困难的事,因为它体现的是对象与对 ... 
- PHP如何解决表单重复提交
			利用session 表单隐藏域中存放session(表单被请求时生成的标记).采用此方法在接收表单数据后,检查此标志值是否存在,先进行删除,然后处理数据; 若不存在,说明已提交过,忽略本次提交. ... 
- Markdown 直接转换公众号文章,不再为排版花时间
			上一篇「又一家数据公司被查,爬虫到底做错了什么?」反响强烈,虽然我这是新号,但还是获得了不少公众号的转发,借机也结识了很多业内大佬,在此感谢大家的抬爱! 同时也有不少号主问我的文章排版是用的哪个网站, ... 
- Winforn中导入Excel并显示然后获取多选框选中的内容
			场景 使用NPOI导入Excel并赋值给DataTable,然后显示在DataGrdView上,并且添加多选框,然后获取选中行的内容. Winform中使用NPOI实现Excel导入并赋值给DataT ... 
- struts2表单提单细节处理
			1. 上传文件 大部分项目避免不了要上传文件. struts2提供了封闭的上传文件的入口, 网络上也存在大量的插件用于网页表单中上传文件. 由于自己习惯用SSH框架, 所以介绍一下struts2中文件 ... 
- 神奇的 SQL 之谓词 → 难理解的 EXISTS
			前言 开心一刻 我要飞的更高,飞的更高,啊! 谓词 SQL 中的谓词指的是:返回值是逻辑值的函数.我们知道函数的返回值有可能是数字.字符串或者日期等等,但谓词的返回值全部是逻辑值(TRUE/FALSE ... 
- ES6入门八:Promise异步编程与模拟实现源码
			Promise的基本使用入门: ——实例化promise对象与注册回调 ——宏任务与微任务的执行顺序 ——then方法的链式调用与抛出错误(throw new Error) ——链式调用的返回值与传值 ... 
