.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 ...
随机推荐
- codeforces 456 E. Civilization(并查集+数的直径)
题目链接:http://codeforces.com/contest/456/problem/E 题意:给出N个点,M条边,组成无环图(树),给出Q个操作,操作有两种: 1 x,输出x所在的联通块的最 ...
- codeforces 799 D. Field expansion(dfs+思维剪枝)
题目链接:http://codeforces.com/contest/799/problem/D 题意:给出h*w的矩阵,要求经过操作使得h*w的矩阵能够放下a*b的矩阵,操作为:将长或者宽*z[i] ...
- 如何将idea工程打包成jar文件
如何将idea工程打包成jar文件 近日在工作中遇到了一个问题,需要把本地的java文件打成jar包,传到云服务器上运行.于是学习了一下如何在intellij idea中将java工程打成jar包. ...
- Ubuntu18.04双系统下安装CUDA10+cuDNN7.5
前言 本篇写于2019-4-25 这两天装Ubuntu18.04双系统简直装到崩溃.一是非常著名的开机卡死在Logo界面的问题,另一个是在装Nvidia驱动和CUDA的时候,更是费心.而网上的资料又良 ...
- 基于GitLab+Jenkins的DevOps赋能实践
随着微服务.中台架构的兴起,DevOps也变得非常关键,毕竟是一些基础设施层面的建设,如果搞好了对后面的研发工作会有很大的效率提升.关于DevOps本身的概念,网上已经非常多了,在园子里随便搜索一些都 ...
- 【LeetCode】105#从前序与中序遍历序列构造二叉树
题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...
- [淘宝客技术篇005]如何取站点id和推广位id
我们知道,生成一个用于推广的淘客链接,是需要指定对应的站点id和推广位id的,也就是siteid和adzoneid. 今天,火星来客跟大家分享两个不同的方法获取站点id和推广位id. 方法一:直接获取 ...
- 树、图、堆、STL(来自菜鸡的"炒鸡"干粮)
树.图.堆.STL 图论基础 简单图: 没有自环,两个顶点之间最多只有一条边. 完全图: 一个简单图,每两个顶点之间都有一条边.一共有(n-1)*n/2条边. 二分图: 一个简单图,设G=(V,E)是 ...
- Python连载38-协程、可迭代、迭代器、生产者消费者模型
一.生产者消费者模型 import multiprocessing from time import ctime def consumer(input_q): print("Into con ...
- Qt线程实现分析-moveToThread vs 继承
最近抽空研究了下QThread,使用起来方式多种多样,但是在使用的同时,我们也应该去了解Qt的线程它到底是怎么玩儿的. Qt的帮助文档里讲述了2种QThread的使用方式,一种是moveToThrea ...