C# 爬虫简单教程
作者:张缺缺 时间:2022-04-24 14:10:53
1、使用第三方类库 HtmlAgilityPack
官方网址:https://html-agility-pack.net/?z=codeplex、
// From File 从文件获取html信息
var doc = new HtmlDocument();
doc.Load(filePath);
// From String 从字符串获取html信息
var doc = new HtmlDocument();
doc.LoadHtml(html);
// From Web 从网址获取html信息
var url = "http://html-agility-pack.net/";
var web = new HtmlWeb();
var doc = web.Load(url);
1.1、这里介绍一下最后一种用法
var web = new HtmlWeb();
var doc = web.Load(url);
在 web 中我们还可以设置cookie、headers等信息,来处理一些特定的网站需求,比如需要登陆等。
1.2 用法解释
网页在你查看网页源代码之后只是一段字符串,而爬虫所做的就是在这堆字符串中,查询到我们想要的信息,挑选出来。
以往的筛选方法:正则 (太麻烦了,写起来有些头疼)
HtmlAgilityPack 支持通过XPath来解析我们需要的信息。
1.2.1 在哪里找XPath?
网页右键检查
通过XPath就可以准确获取你想要元素的全部信息。
1.2.2 获取选中Html元素的信息?
获取选中元素
var web = new HtmlWeb();
var doc = web.Load(url);
var htmlnode = doc?.DocumentNode?.SelectSingleNode("/html/body/header")
获取元素信息
htmlnode.InnerText;
htmlnode.InnerHtml;
//根据属性取值
htmlnode?.GetAttributeValue("src", "未找到")
2、自己封装的类库
/// <summary>
/// 下载HTML帮助类
/// </summary>
public static class LoadHtmlHelper
{
/// <summary>
/// 从Url地址下载页面
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public async static ValueTask<HtmlDocument> LoadHtmlFromUrlAsync(string url)
{
HtmlWeb web = new HtmlWeb();
return await
web?.LoadFromWebAsync(url);
}
/// <summary>
/// 获取单个节点扩展方法
/// </summary>
/// <param name="htmlDocument">文档对象</param>
/// <param name="xPath">xPath路径</param>
/// <returns></returns>
public static HtmlNode GetSingleNode(this HtmlDocument htmlDocument, string xPath)
{
return htmlDocument?.DocumentNode?.SelectSingleNode(xPath);
}
/// <summary>
/// 获取多个节点扩展方法
/// </summary>
/// <param name="htmlDocument">文档对象</param>
/// <param name="xPath">xPath路径</param>
/// <returns></returns>
public static HtmlNodeCollection GetNodes(this HtmlDocument htmlDocument, string xPath)
{
return htmlDocument?.DocumentNode?.SelectNodes(xPath);
}
/// <summary>
/// 获取多个节点扩展方法
/// </summary>
/// <param name="htmlDocument">文档对象</param>
/// <param name="xPath">xPath路径</param>
/// <returns></returns>
public static HtmlNodeCollection GetNodes(this HtmlNode htmlNode, string xPath)
{
return htmlNode?.SelectNodes(xPath);
}
/// <summary>
/// 获取单个节点扩展方法
/// </summary>
/// <param name="htmlDocument">文档对象</param>
/// <param name="xPath">xPath路径</param>
/// <returns></returns>
public static HtmlNode GetSingleNode(this HtmlNode htmlNode, string xPath)
{
return htmlNode?.SelectSingleNode(xPath);
}
/// <summary>
/// 下载图片
/// </summary>
/// <param name="url">地址</param>
/// <param name="filpath">文件路径</param>
/// <returns></returns>
public async static ValueTask<bool> DownloadImg(string url ,string filpath)
{
HttpClient httpClient = new HttpClient();
try
{
var bytes = await httpClient.GetByteArrayAsync(url);
using (FileStream fs = File.Create(filpath))
{
fs.Write(bytes, 0, bytes.Length);
}
return File.Exists(filpath);
}
catch (Exception ex)
{
throw new Exception("下载图片异常", ex);
}
}
}
3、自己写的爬虫案例,爬取的网站https://www.meitu131.com/
数据存储层没有实现,懒得写了,靠你们喽,我是数据暂时存在了文件中
GitHub地址:https://github.com/ZhangQueque/quewaner.Crawler.git
来源:https://www.cnblogs.com/ZhangQueque/p/14163406.html
标签:c#,爬虫
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java Bean Validation使用示例详解
2023-07-19 07:05:26
Java 生产者/消费者问题实例详解
2023-02-26 01:23:36
![](https://img.aspxhome.com/file/2023/3/62053_0s.gif)
java实现打砖块游戏算法
2023-01-28 20:51:06
SpringBoot拦截 器如何获取http请求参数
2023-11-28 19:40:48
![](https://img.aspxhome.com/file/2023/6/59926_0s.png)
JAVA抛出异常的三种形式详解
2022-06-26 22:44:32
java实现sftp客户端上传文件以及文件夹的功能代码
2023-02-14 22:07:28
![](https://img.aspxhome.com/file/2023/0/61950_0s.png)
基于Java的guava开源库工具类
2022-04-07 05:37:53
Java客户端调用.NET的WebService实例
2023-11-03 17:22:00
![](https://img.aspxhome.com/file/2023/8/58988_0s.png)
使用HandlerMethodArgumentResolver用于统一获取当前登录用户
2023-04-20 12:09:16
Java设计模式之备忘录模式(Memento模式)介绍
2023-08-23 14:26:42
![](https://img.aspxhome.com/file/2023/8/58438_0s.png)
安卓逆向半次元app逆向分析源码
2023-07-28 14:36:05
![](https://img.aspxhome.com/file/2023/5/84725_0s.png)
浅谈java内存管理与内存溢出异常
2022-04-22 15:03:18
![](https://img.aspxhome.com/file/2023/2/66252_0s.png)
Java操作Redis2种方法代码详解
2022-09-10 22:58:56
Java获得当前时间前指定几个小时具体时间的方法示例
2023-11-24 04:56:49
![](https://img.aspxhome.com/file/2023/7/59727_0s.jpg)
Java数据结构学习之二叉树
2023-04-25 12:08:27
![](https://img.aspxhome.com/file/2023/1/68171_0s.png)
Spring JPA find单表查询方法示例详解
2022-11-03 19:43:38
Spring Bean常用依赖注入方式详解
2022-06-05 21:43:33
ActiveMQ结合Spring收发消息的示例代码
2023-11-24 06:01:12
SpringBoot3.0自定stater模块的操作流程(chatGPT提供的49种场景)
2023-06-15 05:21:46
![](https://img.aspxhome.com/file/2023/3/68023_0s.png)
Java8新特性之空指针异常的克星Optional类的实现
2023-08-04 18:59:53