大家好,我是零点。在零点博客长期的开发实践中,我发现很多刚入行的朋友对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#实战复盘能帮大家少走弯路,代码直接拿去跑就行!