C# 使用HtmlAgilityPack框架制作html爬虫
HtmlAgilityPack是一个基于C#的第三方免费开源的微型html解析类库,主要用于解析html文档。虽然是一个轻量型的html解析类库,但它的功能却不弱,为解析DOM已经提供了足够强大的功能支持,在HtmlAgilityPack中最常用的基础类其实不多,对解析DOM来说,也就只有HtmlWeb、HtmlDocument、HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类不怎么常用,接下来我们介绍下这个类库如何使用,首先我们在Nuget中搜索“HtmlAgilityPack”进行安装,安装代码如下。
Install-Package HtmlAgilityPack -Version 1.11.46
属性说明
属性 | 说明 |
---|---|
OwnerDocument | 节点所在的HtmlDocument文档 |
Attributes | 获取节点的属性集合 |
ParentNode | 获取该节点的父节点 |
ChildNodes | 获取子节点集合(包括文本节点) |
FirstChild | 获取第一个子节点 |
LastChild | 获取最后一个子节点 |
Id | 获取该节点的Id属性 |
Name | Html元素名 |
NodeType | 获取该节点的节点类型 |
InnerHtml | 获取该节点的Html代码 |
InnerText | 获取该节点的内容,与InnerHtml不同的地方在于它会过滤掉Html代码,而InnerHtml是连Html代码一起输出 |
OuterHtml | 整个节点的代码 |
PreviousSibling | 获取前一个兄弟节点 |
NextSibling | 获取下一个兄弟节点 |
HasAttributes | 判断该节点是否含有属性 |
HasChildNodes | 判断该节点是否含有子节点 |
HasClosingAttributes | 判断该节点的关闭标签是否含有属性() |
Closed | 该节点是否已关闭() |
ClosingAttributes | 在关闭标签的属性集合 |
StreamPosition | 该节点位于整个Html文档的字符位置 |
XPath | 根据节点返回该节点的XPath |
方法说明
方法 | 说明 |
---|---|
Load (string path) | 从路径中加载一个文档 |
SelectNodes (string xpath) | 根据XPath获取一个节点集合 |
SelectSingleNode (string xpath) | 根据XPath获取唯一的一个节 |
Ancestors () | 返回此元素的所有上级节点的集合 |
DescendantNodes () | 获取所有子代节点 |
Element (string name) | 根据参数名获取一个元素 |
Elements (string name) | 根据参数名获取匹配的元素集合 |
GetAttributeValue(string name, bool def) | 帮助方法,用来获取此节点的属性的值(布尔类型)。如果未找到该属性,则将返回默认值 |
ChildAttributes(string name) | 获取所有子元素的属性(参数名要与元素名匹配) |
IsEmptyElement(string name) | 确定是否一个空的元素节点 |
IsOverlappedClosingElement(string text) | 确定是否文本对应于一个节点可以保留重叠的结束标记 |
AppendChild(HtmlNode newChild) | 将参数元素追加到为调用元素的子元素(追加在最后) |
PrependChild(HtmlNode newChild) | 将参数中的元素作为子元素,放在调用元素的最前面 |
Clone() | 本节点克隆到一个新的节点 |
CopyFrom(HtmlNode node) | 创建重复的节点和其下的子树 |
CreateNavigator() | 返回的一个对于此文档的XPathNavigator |
CreateNode(string html) | 静态方法,允许用字符串创建一个新节点 |
CreateRootNavigator() | 创建一个根路径的XPathNavigator |
InsertAfter(HtmlNode newChild, HtmlNode refChild) | 将一个节点插入到第二个参数节点的后面,与第二个参数是兄弟关系 |
InsertBefore(HtmlNode newChild, HtmlNode refChild) | 将一个节点插入到第二个参数节点的后面,与第二个参数是兄弟关系 |
Remove() | 从父集合中移除调用节点 |
SetAttributeValue(string name, string value) | 设置调用节点的属性 |
WriteContentTo() | 将该节点的所有子级都保存到一个字符串中 |
WriteTo() | 将当前节点保存到一个字符串中 |
Save(string filename) | 将HTML文档保存到指定的路径 |
填写目标页面或者网站地址,获取指定DOM树下的元素;如果目标网站做了反爬虫,那就需要去代理网站购买代理然后动态切换代理,还有就是可以每次访问时都动态更换UA标识,计算机标识等手段来规避反爬虫机制;话不多说贴上示例代码,目标网站是以本博客的地址作为对象爬取网页信息,做了一个小小的示例。
internal class Program
{
private static void Main(string[] args)
{
//创建HtmlWeb对象并设置随机UA
var web = new HtmlWeb()
{
UserAgent = Sayaka.Common.ProviderFakeUserAgent.RandomComputer
};
//加载目标网页,获取DOM树,代理信息根据目标网站而定,如果目标网站做了反扒封IP之类的,那就需要去代理网站购买代理,然后在此动态切换代理
HtmlAgilityPack.HtmlDocument doc = web.Load("https://www.cisharp.com", "代理ip(选填)", 代理端口(选填), "代理账户(选填)", "代理密码(选填)");
//获取ul标签class为nav nav-sub dk下面的li标签集合;按DOM结构大概拼下来就行
var aList = doc.DocumentNode.SelectNodes("//ul[@class='nav nav-sub dk']//li//a");
foreach (var tb in aList)
{
Console.WriteLine(tb.LastChild.InnerText.Replace("\n", "").Replace("\t", ""));
}
Console.ReadLine();
}
}
另外,还有一种网页结构经常遇到,就是网页table表格抓爬。在此写一下示例方便大家参考,示例代码如下
internal class Program
{
private static void Main(string[] args)
{
//创建HtmlWeb对象并设置随机UA
var web = new HtmlWeb()
{
UserAgent = Sayaka.Common.ProviderFakeUserAgent.RandomComputer
};
//加载目标网页,获取DOM树
HtmlAgilityPack.HtmlDocument doc = web.Load("https://price.21food.cn/market/"/*由于上面写过示例了,代理配置就不写了*/);
var docList = doc.DocumentNode.SelectNodes("//div[@class='sjs_top_tv1']//div[@class='sjs_top_cent_erv']//ul//li//table");
foreach (var tb in docList)
{
var tdList = tb.SelectNodes("tr//td");
var market = tdList[0].InnerText;
var city = tdList[1].InnerText;
var product = tdList[2].InnerText.Replace(" ", "").Replace("\t", "").Replace("\r", "").Replace("\n", "");
var create_time = tdList[3].InnerText;
Console.WriteLine($"市场:{market}");
Console.WriteLine($"所在地:{city}");
Console.WriteLine($"产品:{product}");
Console.WriteLine($"报价日期:{create_time}");
break;
}
Console.ReadLine();
}
}
最后,随机生成UA类库也能够在Nuget上找到,名字叫FakeUserAgent,安装代码如下
Install-Package FakeUserAgent -Version 1.0.2
分类:
C#编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!