零点博客实战:手写 C# 爬虫清理脏数据,如何用预处理语句彻底防 SQL 注入(含代码案例)

大家好,我是零点。最近在调试一套 EMLOG 的数据迁移工具时,发现很多新手在处理网络请求和数据入库时,容易踩“拼接 SQL”这个大坑。今天咱们不聊虚的,直接结合 C# 后端开发正则表达式MySQL,通过一个真实的数据采集场景,手把手教你如何实现安全的数据清洗与入库。

一、 为什么爬虫的数据很脏?

我们在做接口开发爬虫开发时,抓取下来的 HTML 片段往往包含大量无关标签和多余空格。如果是直接拼接到 SQL 语句里,一旦数据中包含单引号或特殊字符,轻则报错,重则引发 SQL 注入攻击。所以,第一步必须是清洗数据。

二、 C# 代码实战:正则提取与安全入库

下面这段代码是我在零点博客实战中用到的核心逻辑。它展示了如何用 HttpClient 获取网页,用 Regex 提取目标内容,最后用预处理语句写入 MySQL。

1. 发起请求并获取原始数据

// 使用 HttpClient 模拟浏览器请求
using (var client = new HttpClient())
{
    // 设置请求头,防止被反爬虫拦截
    client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0...");

    // 发起 GET 请求
    var response = await client.GetStringAsync("https://example.com/target-page");

    // 此时 response 是包含 HTML 的字符串
    ProcessAndSaveData(response);
}

2. 利用正则表达式“洗”出干净数据

假设我们要抓取文章标题,但标题周围全是 `<h1>` 和 `</h1>` 标签,正则就是我们的过滤器。

/// <summary>
/// 使用正则清洗 HTML 标签并提取内容
/// </summary>
public string CleanData(string htmlContent)
{
    // 核心正则:匹配 h1 标签内的内容,非贪婪模式
    // 这里只是为了演示,实际项目中正则需根据具体 HTML 结构微调
    var pattern = @"<h1[^>]*>(.*?)</h1>";
    var match = Regex.Match(htmlContent, pattern, RegexOptions.IgnoreCase);

    return match.Groups[1].Value.Trim();
}

3. 关键环节:SQL 预处理语句防注入

拿到清洗后的数据后,怎么存入 MySQL?千万别用字符串拼接!必须用预处理语句。

/// <summary>
/// 使用预处理语句安全入库
/// </summary>
public void SaveToDatabase(string title)
{
    string connString = "Server=localhost;Database=emlog;User=root;Password=123;";

    using (var conn = new MySqlConnection(connString))
    {
        conn.Open();
        // 关键点:SQL 语句中使用问号 (?) 作为占位符
        string sql = "INSERT INTO emlog_article (title, content, inputtime) VALUES (@title, @content, @time)";

        using (var cmd = new MySqlCommand(sql, conn))
        {
            // 添加参数,数据库引擎会自动转义特殊字符
            cmd.Parameters.AddWithValue("@title", title);
            cmd.Parameters.AddWithValue("@content", "随机内容");
            cmd.Parameters.AddWithValue("@time", DateTime.Now);

            int rows = cmd.ExecuteNonQuery();
            Console.WriteLine($"成功写入 {rows} 条数据");
        }
    }
}

三、 避坑指南与复盘

在把这套逻辑部署到服务器前,我踩了几个小坑,给大家提个醒:

  1. 正则回溯风险: 不要在正则中写太复杂的嵌套逻辑,否则处理大页面时性能会飙升,导致程序卡死。
  2. 连接池管理: 真正的高并发接口开发中,不要在循环里频繁 Create MySqlConnection,建议封装成单例或使用依赖注入。
  3. 字符编码: 如果抓取到的是乱码,检查 HttpClient 的 Header 是否设置了 UTF-8。

其实无论是用 PHP 还是 C# 开发后端,核心思想都是相通的:数据清洗 + 安全存储。希望这篇关于 代码案例 的分享,能帮大家解决实际开发中的痛点。

如果你觉得这篇干货有用,欢迎在零点博客留言交流!咱们下期再战。