zoukankan      html  css  js  c++  java
  • (Bug修复)C#爬虫,让你不再觉得神秘

    Bug修复

    https://github.com/ZhangQueque/quewaner.Crawler/issues/1
    修复加载Https网址中午乱码,导致Node解析失败的问题

    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

    我自是年少,韶华倾负。
  • 相关阅读:
    TCP中的三次握手与四次挥手
    C++中的访问控制与封装
    C++中的类定义
    Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则
    Verilog学习笔记简单功能实现(三)...............同步有限状态机
    Verilog学习笔记设计和验证篇(二)...............同步有限状态机
    Verilog学习笔记设计和验证篇(一)...............总线和流水线
    Verilog学习笔记简单功能实现(二)...............全加器
    Verilog HDL模型的不同抽象级别
    Verilog学习笔记简单功能实现(一)...............D触发器
  • 原文地址:https://www.cnblogs.com/ZhangQueque/p/14163406.html
Copyright © 2011-2022 走看看