大家好,我是零点。在零点博客长期的开发实践中,我发现很多刚入行的朋友对C#在后端开发中的爬虫应用和数据处理比较迷茫。今天我们不整虚的,直接上干货,复盘一段我去年自己写的C# 爬虫实战代码。我们会把MySQL、SQL注入防护、JSON解析以及接口开发这四大块内容串起来,让你明白一个完整的后端数据处理流是怎么跑通的。
一、 环境准备与技术选型
做爬虫,核心是HtmlAgilityPack这个库,它比传统的正则表达式更适合处理复杂的网页结构。为了保证数据安全,存入数据库时必须使用预处理语句,严禁字符串拼接。
二、 核心代码:C# 爬虫与 SQL 防注入实战
下面这段代码实现了获取网页内容、解析数据并安全存库的功能。大家注意看红框部分,那是防注入的关键。
using System;
using System.Net;
using HtmlAgilityPack;
using MySql.Data.MySqlClient;
namespace ZeroPointSpider
{
class Program
{
// 数据库连接字符串 (强烈建议连接池管理)
private static string connString = "Server=localhost;Database=test_db;User=root;Password=123456;Charset=utf8mb4;";
static void Main(string[] args)
{
// 1. 获取目标网页
string url = "http://example.com/news";
WebClient webClient = new WebClient();
webClient.Encoding = System.Text.Encoding.UTF8;
string html = webClient.DownloadString(url);
// 2. 使用 HtmlAgilityPack 解析 HTML
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
// 3. 提取数据 (XPath)
var nodes = doc.DocumentNode.SelectNodes("//div[@class='item']");
using (MySqlConnection conn = new MySqlConnection(connString))
{
conn.Open();
foreach (var node in nodes)
{
string title = node.SelectSingleNode(".//h3/text()").InnerText.Trim();
string link = node.SelectSingleNode(".//a/@href").GetAttributeValue("href", "");
// 4. 关键点:使用预处理语句 防止 SQL 注入
string sql = "INSERT INTO articles (title, link, created_at) VALUES (@title, @link, @time)";
using (MySqlCommand cmd = new MySqlCommand(sql, conn))
{
// 参数化查询,自动转义特殊字符
cmd.Parameters.AddWithValue("@title", title);
cmd.Parameters.AddWithValue("@link", link);
cmd.Parameters.AddWithValue("@time", DateTime.Now);
cmd.ExecuteNonQuery();
}
}
}
Console.WriteLine("数据抓取并入库完成!");
}
}
}
三、 数据输出:JSON 接口开发
爬取并存储数据只是第一步。如果你在开发前端页面,或者像我们零点博客这种需要对接移动端,就需要将数据以 JSON 格式吐出来。
很多人用 C# 原生处理 JSON 很头疼,其实用 Newtonsoft.Json 或者 .NET Core 自带的 System.Text.Json 会快很多。我们编写一个简单的 HTTP 接口方法:
[HttpGet]
[Route("api/get-data")]
public IActionResult GetLatestNews()
{
string sql = "SELECT title, link FROM articles ORDER BY id DESC LIMIT 10";
using (MySqlConnection conn = new MySqlConnection(connString))
using (MySqlCommand cmd = new MySqlCommand(sql, conn))
using (MySqlDataReader reader = cmd.ExecuteReader())
{
var list = new List();
while (reader.Read())
{
list.Add(new NewsItem
{
Title = reader.GetString("title"),
Link = reader.GetString("link")
});
}
// 直接序列化为 JSON 返回给前端
return Ok(list);
}
}
public class NewsItem
{
public string Title { get; set; }
public string Link { get; set; }
}
四、 零点博客底层拆解与避坑指南
很多兄弟在实操时容易遇到两个坑:
- 乱码问题: 一定要确保 MySQL 连接字符串里加了
Charset=utf8mb4,不然存进去的中文字符在前端或接口里会变成乱码。 - 反爬机制: 频率太高会被封 IP。建议加个简单的随机延时,或者使用代理 IP 池。C# 里使用 HttpClient 的时候,记得复用实例,不要在循环里 new。
这套流程不仅适用于爬虫,在开发复杂的 EMLOG 插件或者自己写后端 API 时也同样适用。希望这篇C#实战复盘能帮大家少走弯路,代码直接拿去跑就行!



评论一下吧
取消回复