.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 ...
随机推荐
- lightoj 1134 - Be Efficient(组合数)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1134 题解:简单的一道组合题,现求一下前缀和,然后只要找前缀和膜m的结果相同的 ...
- atcode E - guruguru(思维+前缀)
题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 题解:一道思维题.不容易想到类似区间求和具体看一下代码. #include <iostr ...
- java 面试题 1-10
1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 1.一个".java&q ...
- [DP]矩阵的最小路径和
题目 给定一个矩阵m, 从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的树子累加起来就是路径和,返回所有的路径中最小的路径和. 解法一 这是一道经典的动态规划题,状态转移方程为d ...
- 题解 洛谷P2833 【等式】
运用暴力解方程吸氧过了这道题 通过数据范围看,要是枚举x和y只能炸掉三成的数据. 所以考虑枚举从x1到x2枚举x,通过方程移项可知y=-(ax+c)/b,再判断y是否在y1和y2之间即可. 本题本做法 ...
- Dijkstra算法的Java实现
package main.java; import main.java.utils.GraphUtil; import java.util.ArrayDeque; import java.util.L ...
- jvm默认垃圾收集器(JDK789)
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel ...
- MySQL Explain学习笔记
目录 一.执行计划概念 二.Explain用法 三.Explain属性介绍 3.1 id属性 3.2 select_type属性 3.3 table属性 3.4 type属性 3.5 possible ...
- PyTorch在笔记本上实现CUDA加速
最近刚开始学习深度学习,参考了一篇深度学习的入门文章,原文链接:https://medium.freecodecamp.org/everything-you-need-to-know-to-maste ...
- postman--请求以及变量设置的实例练习
我们可以在2个地方添加需要执行的js脚本,一个是Pre-request Script,还有一个tests,我们先看请求之前的 1 在请求被发送到服务器之前:就是在“Pre-request Script ...