.NET 爬虫从入门到入狱

目录

前言

1.💡使用HttpClient爬取数据

2.🚀模拟User-Agent

3.🤵使用HTML解析库

3.👌前端Price显示

4.🌱运行实例 获取金价Au

5.🧾使用正则表达式解析

6.💫获取BTC价格

 7.✨获取CSDN热点

8.🎃 获取编程语言排行榜

9.🖥️获取小破站热门

10.⭐获取某音热门 


前言

爬虫可以用于外汇,期货,基金,货币,比分,电商,文章等信息的采集。通过数据分析,竞品分析,为商业决策提供数据支持。

金价暴涨,抓取下今日的金价。

1.💡使用HttpClient爬取数据

try
{
    // 创建HttpClient实例
    using (var httpClient = new HttpClient())
    {
        //模拟User-Agent
        httpClient.DefaultRequestHeaders.Add("User-Agent", GetUserAgent());
        // 发送GET请求并获取响应 xxx.com是某网站的页面~(保护)
        var response = await httpClient.GetAsync("https://xxx.com");
        response.EnsureSuccessStatusCode();
        var htmlContent = await response.Content.ReadAsStringAsync();

      
    }
}
catch (HttpRequestException ex)
{
    // 处理请求异常
    ViewBag.Error = "Failed to retrieve price data: " + ex.Message;
}

2.🚀模拟User-Agent

  // 生成随机 User-Agent
  private string GetUserAgent()
  {
      string[] userAgents = new string[]
      {
          "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36",
          "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36",
          // 
      };

      Random random = new Random();
      int index = random.Next(userAgents.Length);
      return userAgents[index];
  }

3.🤵使用HTML解析库

(HtmlAgilityPack)提取价格

  // 使用HtmlAgilityPack解析HTML
        var htmlDocument = new HtmlDocument();
        htmlDocument.LoadHtml(htmlContent);

        // 使用XPath表达式选择指定的<tr>元素
        var trElement = htmlDocument.DocumentNode.SelectSingleNode("//tr[contains(@class, 'border_ea') and contains(@class, 'noTop_border')]");

        if (trElement != null)
        {
            // 获取包含价格的<td>元素
            var priceCell = trElement.SelectSingleNode(".//td[@align='center'][2]");

            if (priceCell != null)
            {
                // 提取价格
                string price = priceCell.InnerText.Trim();

                // 将价格传递给视图
                ViewBag.Price = price;
            }
            else
            {
                ViewBag.Error = "Price cell not found in table row.";
            }
        }
        else
        {
            ViewBag.Error = "Table row not found.";
        }

也可以用正则表达式提取

3.👌前端Price显示

    <h1>Au99.99 Price: @ViewBag.Price</h1>
    <h2>@ViewBag.Error</h2>

4.🌱运行实例 获取金价Au

也可以通过修改规则取实时Pt的价格

      // 使用XPath表达式选择指定的<tr>元素
      var trElements = htmlDocument.DocumentNode.SelectNodes("//tr[contains(@class, 'border_ea') and contains(@class, 'noTop_border ')]");

      if (trElements != null)
      {
          foreach (var trElement in trElements)
          {
              // 获取包含产品名称和价格的<td>元素
              var tdElements = trElement.SelectNodes("./td");
              if (tdElements != null && tdElements.Count >= 5)
              {
                  // 获取产品名称、最新价、最高价、最低价和今开盘价格
                  string productName = tdElements[0].InnerText.Trim();
                  string latestPrice = tdElements[1].InnerText.Trim();
                  string highestPrice = tdElements[2].InnerText.Trim();
                  string lowestPrice = tdElements[3].InnerText.Trim();
                  string openingPrice = tdElements[4].InnerText.Trim();

                  // 检查产品名称是否为Au99.99或Pt99.95
                  if (productName == "Au99.99")
                  {
                      // 将Au99.99价格信息传递给视图
                      ViewBag.AuLatestPrice = latestPrice;
                      ViewBag.AuHighestPrice = highestPrice;
                      ViewBag.AuLowestPrice = lowestPrice;
                      ViewBag.AuOpeningPrice = openingPrice;
                  }
                  else if (productName == "Pt99.95")
                  {
                      // 将Pt99.95价格信息传递给视图
                      ViewBag.PtLatestPrice = latestPrice;
                      ViewBag.PtHighestPrice = highestPrice;
                      ViewBag.PtLowestPrice = lowestPrice;
                      ViewBag.PtOpeningPrice = openingPrice;
                  }
              }
          }
      }

结果如下:

5.🧾使用正则表达式解析

通过httpClient请求

     public async Task<ActionResult> Index()
     {
         // 获取当前时间的时间戳
         long timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();

         // 构建URL
         string url = $"http://www.xxx.cn/xx.js?t={timestamp}";

         // 创建HttpClient实例
         using (var httpClient = new HttpClient())
         {
             // 设置 User-Agent
             httpClient.DefaultRequestHeaders.Add("User-Agent", GetUserAgent());

             try
             {
                 // 发送GET请求
                 var response = await httpClient.GetAsync(url);
                 response.EnsureSuccessStatusCode();

                 // 读取返回的数据
                 var responseData = await response.Content.ReadAsStringAsync();

                 // 解析返回的数据
                 var price = ParseGoldPrice(responseData);

                 // 将价格传递给视图
                 ViewBag.Price = price;
             }
             catch (HttpRequestException ex)
             {
                 // 处理请求异常
                 ViewBag.Error = "Failed to retrieve gold price data.";
             }
         }

         // 返回视图
         return View();
     }

处理返回价格 

通过正则表达式匹配数据

  private decimal ParseGoldPrice(string responseData)
  {


      string price = "";
      decimal price2 = 0;
  
      string data = responseData;// 

      // 匹配价格的正则表达式
      string pattern = @"var hq_str_gds_AUTD=""([^""]+)"";";

      // 使用正则表达式匹配数据
      Match match = Regex.Match(data, pattern);

      if (match.Success)
      {
          // 获取匹配到的价格数据
          string priceData = match.Groups[1].Value;

          // 使用逗号分割数据,取第一个元素作为价格
          string[] priceParts = priceData.Split(',');
          price = priceParts[0];

          // 将字符串价格转换为decimal类型
          price2 = decimal.Parse(price);

          // 输出提取到的价格
          Console.WriteLine("Gold Price: " + price2);
      }
      else
      {
          Console.WriteLine("Price not found in data.");
      }

      // decimal price = decimal.Parse(priceString);
     
      return price2;
  }

6.💫获取BTC价格

Headers模拟cookie获取BTC价格

 
 httpClient.DefaultRequestHeaders.Add("User-Agent", GetUserAgent());

 httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7");
 httpClient.DefaultRequestHeaders.Add("Accept-Language", "zh-CN,zh;q=0.9");
 httpClient.DefaultRequestHeaders.Add("Cache-Control", "max-age=0");
//cookie
 httpClient.DefaultRequestHeaders.Add("Cookie", "__51uvsct__3ExGyQaAoNSqsSUY=1; __51vcke__3ExGyQaAoNSqsSUY=c91184d5-8826-5ea8-8ddc-a0f3b85c9470; __51vuft__3ExGyQaAoNSqsSUY=1713248151570; PHPSESSID=a6ff05p79bbf3ot4ohphein0e1; Hm_lvt_1605442054faab140873b7c14e40c707=1713248152; Hm_lvt_4820535acfded9186d46b7ae0c829918=1713248152; __vtins__3ExGyQaAoNSqsSUY=%7B%22sid%22%3A%20%22757fcc49-fe4e-5985-bc10-5a0f6ef6d6ba%22%2C%20%22vd%22%3A%206%2C%20%22stt%22%3A%201175754%2C%20%22dr%22%3A%20271898%2C%20%22expires%22%3A%201713251127320%2C%20%22ct%22%3A%201713249327320%7D; Hm_lpvt_1605442054faab140873b7c14e40c707=1713249327; Hm_lpvt_4820535acfded9186d46b7ae0c829918=1713249328");
 httpClient.DefaultRequestHeaders.Add("Sec-Ch-Ua", "\"Google Chrome\";v=\"123\", \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"123\"");
 httpClient.DefaultRequestHeaders.Add("Sec-Ch-Ua-Mobile", "?0");
 httpClient.DefaultRequestHeaders.Add("Sec-Ch-Ua-Platform", "\"Windows\"");
 httpClient.DefaultRequestHeaders.Add("Sec-Fetch-Dest", "document");
 httpClient.DefaultRequestHeaders.Add("Sec-Fetch-Mode", "navigate");
 httpClient.DefaultRequestHeaders.Add("Sec-Fetch-Site", "none");
 httpClient.DefaultRequestHeaders.Add("Sec-Fetch-User", "?1");
 httpClient.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");

 //匹配
 var currencyElement = 
 htmlDocument.DocumentNode.SelectSingleNode("//div[@id='hr_app_cid_1']");
 if (currencyElement != null)
 {
     // 查找包含人民币价格的元素
     var priceElement = currencyElement.SelectSingleNode(".//div[@class='virtual overflow']");
     if (priceElement != null)
     {
      // 提取人民币价格
      var chinesePrice = priceElement.InnerText.Trim();
     }

 }

美元价格也是类似的规则,运行结果

 7.✨获取CSDN热点

模拟请求,修改规则

  var httpClient = new HttpClient();
  var referer = "xxx";
  httpClient.DefaultRequestHeaders.Add("referer", referer);
  httpClient.DefaultRequestHeaders.Add("User-Agent", GetUserAgent());
  var response = await httpClient.GetAsync("xxx/");
  response.EnsureSuccessStatusCode();
  var responseBody = await response.Content.ReadAsStringAsync();

  var contentList = new List<Tuple<string, string, string>>();

  var htmlDocument = new HtmlDocument();
  htmlDocument.LoadHtml(responseBody);

  //  var itemNodes = htmlDocument.DocumentNode.SelectNodes("//div[contains(@class, 'headswiper-item')]");
  var items = htmlDocument.DocumentNode.SelectNodes("//div[@class='headswiper-item']");

  if (items != null)
  {
       foreach (var item in items)
       {
           var titleNode = item.SelectSingleNode(".//a[@class='title']");
           var nameNode = item.SelectSingleNode(".//p[@class='name']");
           var linkNode = item.SelectSingleNode(".//a[@class='title']");


           if (titleNode != null && nameNode != null && linkNode != null)
           {
               var title = titleNode.InnerText.Trim();
               var name = nameNode.InnerText.Trim();
               var link = linkNode.GetAttributeValue("href", "");
               contentList.Add(new Tuple<string, string, string>(title, name, link));
           }
       }
  }
  return View(contentList);

or 使用正则


  // 使用正则表达式匹配所有符合条件的 div 元素内容
  var regex = new Regex(@"<div class=""headswiper-item""(.*?)</div>", RegexOptions.Singleline);
  var matches = regex.Matches(responseBody);
  foreach (Match match in matches)
  {
      //去除Vuehtml
      string s1temp = match.Groups[1].Value.Trim();
      int i1 = s1temp.IndexOf(">")+1;
      int i2  = s1temp.Length - i1 - 1;
      string  hotstr = s1temp.Substring(i1, i2);
      
      contentList.Add(hotstr);
  }

运行结果

8.🎃 获取编程语言排行榜

            var response = await httpClient.GetAsync("xxx");
            response.EnsureSuccessStatusCode();
            var htmlContent = await response.Content.ReadAsStringAsync();

            var htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(htmlContent);

            // 获取表格内容
            var table = htmlDocument.DocumentNode.SelectSingleNode("//table[@class='w-min min-w-full table-fixed divide-y-2 divide-gray-200 text-sm dark:divide-gray-700']");

            ViewBag.TableContent = table?.OuterHtml; 

9.🖥️获取小破站热门

 var httpClient = new HttpClient();
 var referer = "https://xxx";
 httpClient.DefaultRequestHeaders.Add("Referer", referer);
 httpClient.DefaultRequestHeaders.Add("User-Agent", GetUserAgent());
 var response = await httpClient.GetAsync("https://xxx");
 response.EnsureSuccessStatusCode();
 var responseBody = await response.Content.ReadAsStringAsync();
 var jsonRes = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(responseBody);
 var tempArr = new List<MItem>();

 int itid = 1;
 foreach (var itemj in jsonRes.data.list)
 {
     string tt = itemj.keyword.ToString();
   //  string hot = itemj.hot_value.ToString();
     tempArr.Add(new MItem
     {
         Index = itid++,
         Title = tt,
         Hot = "",
         Url = "https://search.bilibili.com/all?keyword=" + tt+ "&order=click",
         MobileUrl = "https://search.bilibili.com/all?keyword=" + tt+ "&order=click"
     });
 }

 var md = new MData
 {
     Success = true,
     Title = "小破站",
     Subtitle = "热搜榜",
     UpdateTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
     Data = tempArr
 };
  public class MData
  {
      public bool Success { get; set; }
      public string Title { get; set; }
      public string Subtitle { get; set; }
      public string UpdateTime { get; set; }
      public List<MItem> Data { get; set; }
  }
 public class MItem
    {
        public int Index { get; set; }
        public string Title { get; set; }
        public string Hot { get; set; }
        public string Url { get; set; }
        public string MobileUrl { get; set; }
    }

10.⭐获取某音热门 

  var httpClient = new HttpClient();
  var referer = "xxx";
  httpClient.DefaultRequestHeaders.Add("referer", referer);
  httpClient.DefaultRequestHeaders.Add("User-Agent", GetUserAgent());
  var response = await httpClient.GetAsync("xxx");
  response.EnsureSuccessStatusCode();
  var responseBody = await response.Content.ReadAsStringAsync();
  var jsonRes = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(responseBody);
  var tempArr = new List<MItem>();

  int itid = 1;
  foreach (var itemj in jsonRes.word_list)
  {
      string tt = itemj.word.ToString();
      string hot  =itemj.hot_value.ToString();


      tempArr.Add(new MItem
      {
          Index = itid++,
          Title = tt,
          Hot = hot,
          Url = "https://www.douyin.com/search/" + tt,
          MobileUrl = "https://www.douyin.com/search/" + tt
      }); 
  }

  var douyinData = new MData
  {
      Success = true,
      Title = "某音",
      Subtitle = "热搜榜",
      UpdateTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
      Data = tempArr
  };

注意:如果目标有IP限制、Cookie、签名等,则需编写相应的对策 。

此外,还可以通过WinFrom WebBowser控件实现加载完DOM再匹配信息实现爬取效果。

这里只做抛砖引玉,后续是否入狱自行探索,请勿使用此技术做违法的事情!!!💀 

在使用爬虫技术时,必须遵守相关法律法规,尊重网站经营者的权益,避免对网站或系统造成干扰或破坏。同时,对于涉及公民个人信息的爬虫行为,应格外谨慎,确保不侵犯他人的隐私权。

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/556238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

界面组件Telerik UI for WPF 2024 Q1新版亮点 - 全新DateRangePicker组件

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

解决 vue install 引发的 failed Error: not found: python2 问题

发生 install 异常时&#xff0c;提示信息如下所示&#xff1a; npm ERR! code 1 npm ERR! path U:\cnblogs\fanfengping-dtops\fanfengping-dtops-front\node_modules\node-sass npm ERR! command failed npm ERR! command U:\Windows\system32\cmd.exe /d /s /c node scripts…

公网IP多少钱可以购买?

公网IP是指可以在全球范围内访问和识别的唯一IP地址。对于许多企业和个人用户来说&#xff0c;公网IP是实现远程访问、搭建服务器、建立安全连接等重要需求的基础。公网IP的获取并不是免费的&#xff0c;并且价格因供应商和地区而异。 现有公网IP市场 当前&#xff0c;市场上有…

STM32之不使用MicroLIB

一、microlib介绍 microlib 是缺省 C 库的备选库,功能上不具备某些 ISO C 特性。 microlib 进行了高度优化以使代码变得很小,功能比缺省 C 库少,用于必须在极少量内存环境下运行的深层嵌入式应用程序。 二、不使用microlib的原因 由于microlib不支持C++开发,因此在使用C…

PLC怎么接入互联网

几十年来&#xff0c;PLC都是用于现场设备的自动化控制。随着移动互联网技术的发展&#xff0c;移动办公的便捷性使PLC联网进行远程监控操作的需求越来越多。那PLC怎么接入互联网呢&#xff1f; PLC的通讯基本都是基于现场的通讯&#xff0c;无论是RS485,RS232还是 TCP协议&am…

传统外呼吃力不讨好?AI智能外呼降低85%人力成本!

前几天有电商的客户来咨询&#xff0c;他们每逢大促客服压力就激增&#xff0c;主要原因就是客服人员少&#xff0c;遇到这种高峰期根本来不及打电话&#xff0c;招新人的话培训时间长&#xff0c;算下来人力成本相当高。因此他们想借助智能外呼看能否解决这个难题。这种时候就…

【3GPP】【核心网】【LTE】史上最全 闲时被叫CSFB 深度分析

3.2 闲时被叫CSFB 3.2.1 闲时被叫CSFB基本流程 被叫CSFB消息附近通常有一条Paging寻呼&#xff0c;然后进行CSFB流程&#xff1a; &#xff08;1&#xff09;UE向MME发起拓展服务请求&#xff0c;同时上报TMSI和承载状态&#xff0c;该条消息的服务类型字段中会区分主/被叫&a…

风险解码:数字技术如何重塑风控游戏规则?

“IT有得聊”是机械工业出版社旗下IT专业资讯和服务平台&#xff0c;致力于帮助读者在广义的IT领域里&#xff0c;掌握更专业、更实用的知识与技能&#xff0c;快速提升职场竞争力。 点击蓝色微信名可快速关注我们&#xff01; 数字风控概述 从2007年开始到2014年左右&#xf…

【GoWeb框架初探————Gin篇】

1. Gin 1.1 下载相应依赖 创建go项目&#xff0c;在项目下建立go.mod文件&#xff08;若有则跳过&#xff09; 命令行运行 go get github.com/gin-gonic/gin1.2 启动一个简单Web服务 package mainimport ("github.com/gin-gonic/gin""github.com/thinkerou/…

️️️Vue3+Element-Plus二次封装一个可定制化的table组件

前言 为什么需要二次封装 开发后台管理系统,会接触到很多表格和表单,一但表格表单多起来,仅仅只需要一小部分改变&#xff0c;都需要在中重写一大堆代码,许多重复逻辑,我们可以把重复逻辑抽离出来二次封装一个组件 使用,减少在开发中需要编写的代码。 为什么需要定制化 每个…

Springboot Gateway 报错Failed to resolve “bogon”的原因及解决办法

一、问题出现原因及初步分析 今天遇到一个奇怪的错误&#xff0c;一个一直正确运行的微服务后台&#xff0c;突然无法访问&#xff0c;如何重启都会报错。 想到近期有人在服务器上安装过其它服务&#xff0c;因此&#xff0c;考虑可能是配置问题&#xff0c;可配置问题修复后…

Ubuntu 传输文件

scp [选项] 源文件 目标路径 以下是一些常用的 scp 命令选项&#xff1a; -r&#xff1a;递归复制目录和子目录。 -P&#xff1a;指定远程 SSH 服务器的端口号。 -i&#xff1a;指定用于身份验证的私钥文件。 -p&#xff1a;保留源文件的时间戳、权限和所有者。 -v&#x…

从D盘调整空间增加到C盘而不丢失数据的3 种方法

越来越多的Windows 10笔记本电脑和台式机使用SSD作为系统盘&#xff0c;这对于提高计算机性能很有用&#xff0c;因为SSD的读写速度要快得多。但另一方面&#xff0c;SSD价格更高&#xff0c;因此比传统机械硬盘体积更小。当然C盘空间不足的可能性更大。在这种情况下&#xff0…

Java学习笔记零基础入门1

目录 第一章 Java概述 1.1 什么是程序 1.2 Java 技术体系平台 1.3 Java 重要特点 1.4 Java 的开发工具 4.1 工具选择 1.5 Java 运行机制及运行过程 5.1 Java 语言的特点&#xff1a;跨平台性 5.2 Java 核心机制-Java 虚拟机 [JVMjavavirtual machine] 1.6 什么是JDK&…

K8s 部署 elasticsearch-7.14.0 集群 及 kibana 客户端

一、K8s 部署 elasticsearch-7.14.0 集群 安装规划 组件replicas类型es3StatefulSetkibana1Deployment 使用 k8s 版本为&#xff1a;v1.18.0 。 本次使用 OpenEBS 来作为存储引擎&#xff0c;OpenEBS 是一个开源的、可扩展的存储平台&#xff0c;它提供了一种简单的方式来创…

HQL,SQL刷题,尚硅谷(中级)

目录 相关表结构&#xff1a; 1、order_info表 2、order_detail表 题目及思路解析&#xff1a; 第一题&#xff0c;查询各品类销售商品的种类数及销量最高的商品 第二题 查询用户的累计消费金额及VIP等级 第三题 查询首次下单后第二天连续下单的用户比率 总结归纳&#xff1a…

2024.4.18

学生管理部分 #include<myhead.h> int main(int argc, char *argv[]) {sqlite3* ppDbNULL;if(sqlite3_open("./mydb.db",&ppDb)!SQLITE_OK){printf("sqlite3_open error:%s\n",sqlite3_errmsg(ppDb));return -1;}//创建数据表char arg[128]&quo…

SQL Serve---嵌套查询

定义 嵌套查询&#xff1a;主要用于复杂的查询中。在SQL语言中&#xff0c;一个Select From Where语句称为一个查询块&#xff0c;将一个查询块嵌套在另一个查询的Where子句或Having短语中的查询称为嵌套查询。 子查询的类型 使用别名的子查询 使用IN和NOT IN的子查询 使用比较…

4.15报错记录

打开文件时出错a bytes-like object is required,notNoneType 确保E:/data/stdata/st- images-1208-json|ST-WT-1.json是一个有效的标签文件。 今天用X-anylabling更改标签目录时出现这个报错 解决方案&#xff1a;图片文件夹中创建同名的一个文件夹把json文件放进去就可以打…

Ubuntu 微调训练ChatGLM3大语言模型

Ubuntu 微调训练ChatGLM3大语言模型 LLaMA Factory 的 LoRA 微调提供了 3.7 倍的加速比&#xff0c;同时在广告文案生成任务上取得了更高的 Rouge 分数。结合 4 比特量化技术&#xff0c;LLaMA Factory 的 QLoRA 微调进一步降低了 GPU 显存消耗。 https://github.com/hiyouga…