零点博客C#实战:手写爬虫抓取数据,详解MySQL预处理与JSON解析

大家好,我是零点博客的博主。最近在研究零点博客的二次开发功能,为了解决文章采集的痛点,我尝试用 C# 写了一个简易的网页数据爬虫工具。虽然网上教程很多,但关于SQL注入防护和JSON解析在实际业务中的坑,很多人一笔带过。今天我就把这次实战的底层逻辑和代码拆解出来,希望能帮到正在做后端开发的小伙伴。

一、 爬虫开发:从HTTP请求开始

做爬虫开发,第一步永远是拿到数据。C# 在处理网络请求方面非常有优势,我们使用 HttpClient 来发送 GET 请求。这里有个小细节:为了避免被目标网站封禁,我加了简单的 User-Agent 模拟浏览器请求。

using System;
using System.Net.Http;
using System.Threading.Tasks;

public async Task<string> FetchDataAsync(string url)
{
    using (var httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...");
        var response = await httpClient.GetAsync(url);
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
    }
}

二、 数据解析:JSON与正则的博弈

拿到 HTML 源码后,我们要提取其中的价值。现在的网站大多返回 JSON 数据。对于结构化的 JSON,推荐使用 Newtonsoft.Json 或 System.Text.Json。

如果遇到非标准的 HTML 片段,则用正则表达式提取。在零点博客的开发过程中,我发现直接用字符串拼接正则容易报错,建议大家封装成泛型方法,提高代码复用率。

三、 核心安全:SQL注入防护与预处理语句

这是本文的重点。很多时候我们把数据爬下来后,想直接存到 MySQL 数据库。如果直接拼接 SQL 语句,比如 Insert into blog values ('' + input + ''),一旦输入包含恶意的 ;DROP TABLE,后果不堪设想。

正确的做法是使用预处理语句。这就像填空题,SQL 语句的框架已经定好了,我们只把数据作为参数传进去。无论数据中包含什么特殊字符,数据库都把它当做普通文本处理,彻底杜绝 SQL 注入。

string sql = "INSERT INTO emlog_articles (title, content, uid) VALUES (@Title, @Content, @Uid)";
using (var cmd = new MySqlCommand(sql, connection))
{
    // 关键点:使用参数化查询,而不是字符串拼接
    cmd.Parameters.AddWithValue("@Title", jsonTitle);
    cmd.Parameters.AddWithValue("@Content", jsonContent);
    cmd.Parameters.AddWithValue("@Uid", 1); 

    await cmd.ExecuteNonQueryAsync();
}

四、 避坑指南与总结

在这次接口开发调试中,我踩了不少坑:

  • 字符编码问题:爬下来的中文如果是乱码,通常是 UTF-8 和 GBK 混合导致的,务必在 Header 中指定字符集。
  • 频率控制:爬虫请求太频繁会拖慢服务器,记得加上 Thread.Sleep 或使用队列机制。
  • JSON空值处理:解析 JSON 时,字段可能为空,代码中要做 if (obj != null) 的判空处理,否则插入数据库会报错。

希望通过这篇基于零点博客视角的实战复盘,大家能对 C# 结合 MySQL 的开发有更深的理解。如果你在开发中遇到其他问题,欢迎在评论区交流!