C#爬虫开发实战:手把手解析JSON/XML数据并安全存入MySQL(附避坑指南)

大家好,我是零点博客的主理人。今天不聊虚的,直接上干货。在做C#后端开发以及EMLOG主题二次开发时,我们经常需要从第三方接口获取数据。这时爬虫开发就成了刚需。很多新手只关注怎么抓取数据,却忽略了SQL注入防护,这是绝对不能容忍的低级错误。

本文将通过一个真实的案例,手把手教你如何用C#封装一个轻量级爬虫,处理JSON/XML数据解析,并利用MySQL数据库存储。代码在文末,直接复制就能跑。

一、 环境准备与HttpClient封装

首先,我们需要发送HTTP请求。不要自己造轮子,使用.NET Core自带的HttpClient即可。为了保证接口的稳定性,我们需要处理异步请求和超时重试机制。

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

public class HttpHelper
{
    private static readonly HttpClient client = new HttpClient();

    public static async Task<string> GetStringAsync(string url)
    {
        return await client.GetStringAsync(url);
    }
}

这段代码是爬虫的基石。对于API返回的数据,我们通常处理JSON格式,但如果接口不规范,偶尔也会遇到XML格式。

二、 JSON/XML数据解析技巧

拿到字符串数据后,我们需要解析。推荐使用Newtonsoft.Json库,解析速度非常快。以抓取某网站文章列表为例:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public List<Article> ParseJsonData(string jsonStr)
{
    var obj = JObject.Parse(jsonStr);
    var list = new List<Article>();

    // 循环遍历数组节点
    foreach (var item in obj["data"]) 
    {
        list.Add(new Article
        {
            Title = item["title"].ToString(),
            Url = item["link"].ToString(),
            PubTime = DateTime.Parse(item["date"].ToString())
        });
    }
    return list;
}

解析完成数据后,下一步就是如何把这些数据存入我们的MySQL数据库。这里要特别强调一点:绝对不要使用字符串拼接SQL!

三、 SQL注入防护与预处理语句(核心避坑指南)

这是我经常在群里强调的。很多小白直接写 INSERT INTO table VALUES(''+input+'),一旦输入恶意脚本,数据库就挂了。我们必须要用预处理语句

使用C#连接MySQL,推荐MySql.Data或Dapper。这里演示使用原生参数化查询:

using MySql.Data.MySqlClient;
using System.Data;

public void SaveData(List<Article> articles)
{
    string sql = "INSERT INTO articles (title, url, pub_time) VALUES (@title, @url, @pubTime)";

    using (var conn = new MySqlConnection("Server=localhost;Database=test;User=root;Password=123;"))
    {
        conn.Open();
        using (var cmd = new MySqlCommand(sql, conn))
        {
            // 明确指定参数类型,防止注入
            cmd.Parameters.Add("@title", MySqlDbType.VarChar).Value = article.Title;
            cmd.Parameters.Add("@url", MySqlDbType.VarChar).Value = article.Url;
            cmd.Parameters.Add("@pubTime", MySqlDbType.DateTime).Value = article.PubTime;

            cmd.ExecuteNonQuery();
        }
    }
}

看,参数加上了 @ 符号,这就是预处理语句的魔法,能彻底隔绝SQL注入风险。

四、 爬虫开发的进阶与常见问题

爬虫开发过程中,你可能还会遇到以下坑:

  • IP被封: 容易触发目标站点的反爬虫机制。解决方案是封装一个简单的代理池,或者在请求头中伪装成浏览器(User-Agent)。
  • 编码乱码: 确保在请求后正确设置编码,通常默认UTF-8。

这套逻辑不仅能用于简单的工具开发,也能复用到我们的零点博客功能扩展中,比如自动同步第三方RSS数据到本地。希望这个实战案例能帮到大家。

更多关于HTML/CSS/JS前端与后端交互的案例,欢迎持续关注零点博客的更新!