.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-AgenthttpClient.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-Agentprivate 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解析HTMLvar 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.95if (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();// 构建URLstring url = $"http://www.xxx.cn/xx.js?t={timestamp}";// 创建HttpClient实例using (var httpClient = new HttpClient()){// 设置 User-AgenthttpClient.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");
//cookiehttpClient.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){//去除Vuehtmlstring 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.15报错记录

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

[Qt网络编程]之UDP通讯的简单编程实现

hello&#xff01;欢迎大家来到我的Qt学习系列之网络编程之UDP通讯的简单编程实现。希望这篇文章能对你有所帮助&#xff01;&#xff01;&#xff01; 本篇文章的相关知识请看我的上篇文章: http://t.csdnimg.cn/UKyeM 目录 UDP通讯 基于主窗口的实现 基于线程的实现 UDP通讯…

【YOLO系列PR、F1绘图】更改v5、v7、v8(附v8训练、验证方式),实现调用val.py或者test.py后生成pr.csv,然后再整合绘制到一张图上(使用matplotlib绘制)

目录 1. 前提 效果图2. 更改步骤2.1 得到PR_curve.csv和F1_curve.csv2.1.1 YOLOv7的更改2.1.1.1 得到PR_curve.csv2.2.1.2 得到F1_curve.csv 2.1.2 YOLOv5的更改&#xff08;v6.1版本&#xff09;2.1.3 YOLOv8的更改&#xff08;附训练、验证方式&#xff09; 2.2 绘制PR曲线 …

【创建型模式】抽象工厂模式

一、抽象工厂模式概述 抽象工厂模式定义&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。 模式动机&#xff1a; 1.当系统提供的工厂生产的具体产品并不是一个简单的对象&#xff0c;而是多个位于不同产品等级结构、属于不同类型的…

41、二叉树-二叉树的层序遍历

思路&#xff1a; 层序遍历就是从左到右依次遍历。这个时候就可以使用队列的方式。例如先把头节点入队&#xff0c;然后遍历开始&#xff0c;首先计算队列长度&#xff0c;第一层&#xff0c;长度为了&#xff0c;遍历一次&#xff0c;依次出队&#xff0c;头结点出队&#xff…

Tomcat和Spring Boot配置https

生成测试证书 生成证书前&#xff0c;先验证本地是否正确配置jdk环境变量&#xff0c;如果jdk环境变量配置正确&#xff0c;在命令行程序输入生成证书的命令。 keytool -genkey -alias tomcat -keyalg RSA -keystore "F:\job\apache-tomcat-8.5.29\key\freeHttps.keysto…

微信小程序之图片上传并保存在服务器

先将图片上传到服务器&#xff0c;后端接口将保存好的图片地址返回给小程序&#xff0c;再将小程序中添加图像的图片的url替换为服务器中照片的存储地址&#xff08;使微信小程序中显示出上传的图片&#xff09;。 1、效果如下&#xff1a; 点击图像后选择图像&#xff1a; 结…

搜维尔科技:【工业仿真】煤矿机械安全事故VR警示教育系统

产品概述 搜维尔科技 煤矿机械安全事故VR警示教育系统 系统内容&#xff1a; 系统采用虚拟现实技术模拟矿井井下机械安全技术及事故&#xff0c;展现井下常见机械伤害事故&#xff0c;表现伤害事故的隐患点&#xff0c;能够模拟事故发生和发展过程&#xff1b;营造井下灾害发…

如何使用 Node.js 发送电子邮件全解和相关工具推荐

大多数Web应用程序都需要发送电子邮件。它可能用于注册、密码重置、状态报告&#xff0c;甚至是完整的市场营销活动&#xff0c;如新闻和促销。本教程解释了如何在Node.js中发送电子邮件&#xff0c;但其概念和挑战适用于您正在使用的任何系统。 你会在 npm 上找到大量与电子邮…

详细UI色彩搭配方案分享

UI 配色是设计一个成功的用户界面的关键之一。UI 配色需要考虑品牌标志、用户感受、应用程序的使用场景&#xff0c;这样可以帮助你创建一个有吸引力、易于使用的应用程序。本文将分享 UI 配色的相关知识&#xff0c;帮助设计师快速构建 UI 配色方案&#xff0c;以满足企业的需…

windows10小皮安装不同版本composer,实现自由切换使用

1、使用phpstudy小皮面板安装composer1.8.5和composer2.5.8两个版本&#xff1b; 2、打开刚才安装的composer安装目录&#xff1a;D:\phpstudy_pro\Extensions 3、打开composer1.8.5版本&#xff0c;修改composer.bat名称为composer1.8.5.bat&#xff1a; 4、打开composer2.5.8…

【机器学习300问】75、如何理解深度学习中Dropout正则化技术?

一、Dropout正则化的原理是什么&#xff1f; Dropout&#xff08;随机失活&#xff09;正则化是一种用于减少神经网络中过拟合现象的技术。Dropout正则化的做法是&#xff1a; 在训练过程中的每次迭代中&#xff0c;随机将网络中的一部分权重临时"丢弃"&#xff08;即…

前端三大件速成 01 HTML

文章目录 一、前端基础知识二、标签1、什么是标签2、标签的属性3、常用标签&#xff08;1&#xff09;声明&#xff08;2&#xff09;注释&#xff08;3&#xff09;html 根标签&#xff08;3&#xff09;head标签&#xff08;4&#xff09;body标签 三、特殊字符四、其他标签1…

web安全学习笔记(11)

记一下第十五节课的内容。 一、创建MySQL执行函数 我们在function.php中&#xff0c;自定义一个函数&#xff1a; #SQL查询函数 function Qurey($sql) {#连接数据库$db new mysqli(172.20.10.3, liuyan, 123456, liuyan, 3306);#判断是否连接成功if (mysqli_connect_errno(…

redis的数据结构报错

文章目录 redis的数据结构报错Redis使用LocalDateTime报错问题 redis的数据结构报错 Redis使用LocalDateTime报错问题 SpringBoot整合Redis时&#xff0c;使用LocalDate以下报错 org.springframework.data.redis.serializer.SerializationException: Could not read JSON: C…

(八)Pandas窗口数据与数据读写 学习简要笔记 #Python #CDA学习打卡

一. 窗口数据(Window Functions) Pandas提供了窗口函数(Window Functions)用于在数据上执行滑动窗口操作&#xff0c;可以对数据进行滚动计算、滑动统计等操作。需要注意的是&#xff0c;在使用窗口函数时&#xff0c;需要根据实际需求选择合适的窗口大小和窗口函数&#xff0…

大数据------额外插件及技术------Git(完整知识点汇总)

Git 定义 它是分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;如&#xff1a;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛应用 作用 代码回溯&#xff1a;快速回到某一代码历史版本版本切换&#xff1a;同一个…

【嵌入式开发】SecureCRTPortable工具进行串口信息监听打印

SecureCRTPortable工具进行串口信息监听打印 一、什么是SecureCRT二、如何使用SecureCRT进行串口监听1、硬件连接2、驱动安装3、软件连接4、串口连接5、日志设置 近期发现许多小伙伴欠缺SSH工具使用基础&#xff0c;工欲善其事&#xff0c;必先利其器&#xff0c;这里奉上使用教…

股票战法课程之主力的痕迹

文章目录 1. 主力的操作痕迹2. 主力的建仓2.1 建仓的三种方式2.2 建仓的五个特点2.3 建仓的迹象2.4 建仓的成交量特征 1. 主力的操作痕迹 序号痕迹原因1不跟随大盘节奏筹码都在主力手中2突发利空消息&#xff0c;股价不跌反涨主力被套&#xff0c;不希望散户抛盘3很小的成交量…

【Spring】Spring MVC入门

Spring MVC入门 一、什么是Spring Web MVC&#xff1f; 1.1 MVC定义 MVC是Model View Controller的缩写&#xff0c;是一种软件架构的设计模式&#xff0c;将软件系统分为模型、视图、控制器三个部分。 示意图如下: 可以看到&#xff0c;Controller作为一个“粘合剂”处于M…