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?

网页右键检查

C# 爬虫简单教程

通过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

C# 爬虫简单教程

来源:https://www.cnblogs.com/ZhangQueque/p/14163406.html

标签:c#,爬虫
0
投稿

猜你喜欢

  • Java Bean Validation使用示例详解

    2023-07-19 07:05:26
  • Java 生产者/消费者问题实例详解

    2023-02-26 01:23:36
  • java实现打砖块游戏算法

    2023-01-28 20:51:06
  • SpringBoot拦截 器如何获取http请求参数

    2023-11-28 19:40:48
  • JAVA抛出异常的三种形式详解

    2022-06-26 22:44:32
  • java实现sftp客户端上传文件以及文件夹的功能代码

    2023-02-14 22:07:28
  • 基于Java的guava开源库工具类

    2022-04-07 05:37:53
  • Java客户端调用.NET的WebService实例

    2023-11-03 17:22:00
  • 使用HandlerMethodArgumentResolver用于统一获取当前登录用户

    2023-04-20 12:09:16
  • Java设计模式之备忘录模式(Memento模式)介绍

    2023-08-23 14:26:42
  • 安卓逆向半次元app逆向分析源码

    2023-07-28 14:36:05
  • 浅谈java内存管理与内存溢出异常

    2022-04-22 15:03:18
  • Java操作Redis2种方法代码详解

    2022-09-10 22:58:56
  • Java获得当前时间前指定几个小时具体时间的方法示例

    2023-11-24 04:56:49
  • Java数据结构学习之二叉树

    2023-04-25 12:08:27
  • 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
  • Java8新特性之空指针异常的克星Optional类的实现

    2023-08-04 18:59:53
  • asp之家 软件编程 m.aspxhome.com