<!DOCTYPE html>

拒绝SQL注入!手把手教你用C#和MySQL给EMLOG开发专属数据爬虫工具 - 零点博客

拒绝SQL注入!手把手教你用C#和MySQL给EMLOG开发专属数据爬虫工具

哈喽大家好,我是零点博客的博主。昨天有粉丝在后台问我,EMLOG 作为轻量级 CMS,在做爬虫数据聚合时,直接操作数据库很头疼,而且安全风险大。其实咱们用 C# 后端开发来做这件事简直是降维打击,既能利用 C# 强大的生态处理 JSON 数据,又能利用 .NET 原生的预处理机制完美解决 SQL注入防护 问题。

一、 为什么要用 C# 搭建爬虫后端?

很多新手喜欢用 PHP 直接写爬虫,或者用 Python 写脚本导出 CSV 再导入 EMLOG 数据库。但这种方式在处理海量数据或高并发时,性能瓶颈很明显。咱们这次实操的目标是:

  • 使用 C# 调用第三方 API 获取 JSON 数据。
  • 编写正则表达式清洗数据。
  • 通过 MySQL 预处理语句安全入库 EMLOG 数据库。
  • 最后通过简单的 HTML/JS 前端展示执行结果。

二、 底层架构与数据库连接

首先,我们需要明确 EMLOG 默认的数据库结构。这里为了演示方便,我们只关注 `emlog_blog` 表。在 C# 中,我们使用 MySQL.Data 包。

特别注意:SQL注入防护 永远是第一优先级。不要使用字符串拼接 SQL 语句!

1. C# 数据库操作核心代码

using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;

namespace ZeroPointBlogTools
{
    public class EmlogCrawler
    {
        // 配置数据库连接字符串,本地测试可替换为你的 EMLOG 账号密码
        private static string connStr = "Server=localhost;Database=emlog;User=root;Password=your_password;CharSet=utf8mb4;";

        public void InsertData(string title, string content)
        {
            // C# 开发的精髓在于:使用参数化查询!
            // 这一步彻底告别 SQL 注入,也是我强调的避坑指南第一条。
            string sql = "INSERT INTO emlog_blog (title, content, author, date, hits, comnum, excerpt, gid, alias, password, template, allow_remark, sortid, vis, template_file, marked) VALUES (@title, @content, 1, @date, 0, 0, '', 0, '', '', '', 1, 0, 1, '', 0);";

            using (MySqlConnection conn = new MySqlConnection(connStr))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                { 
                    // 添加参数,C# 会自动转义特殊字符
                    cmd.Parameters.AddWithValue("@title", title);
                    cmd.Parameters.AddWithValue("@content", content);
                    cmd.Parameters.AddWithValue("@date", DateTime.Now.ToString("Y-m-d H:i:s"));

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

三、 JSON 数据解析与爬虫实战

拿到 API 返回的数据通常是 JSON 格式。C# 里的 `Newtonsoft.Json` 或者最新的 `System.Text.Json` 处理起来非常顺手。结合正则表达式清洗文本,是我们作为博主日常开发的必修课。

2. 模拟爬虫逻辑与数据清洗

using System.Net.Http;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Linq;

public async Task StartCrawlerAsync()
{
    HttpClient client = new HttpClient();
    string apiUrl = "https://api.example.com/news/list";
    string responseText = await client.GetStringAsync(apiUrl);

    // 使用正则表达式提取正文中的纯文本(去除 HTML 标签)
    string cleanContent = Regex.Replace(responseText, @"<[^>]+>", "").Trim();

    // 解析 JSON 中的标题
    JObject json = JObject.Parse(responseText);
    string title = json["data"][0]["title"].ToString();

    // 实例化数据库操作类
    var crawler = new EmlogCrawler();
    crawler.InsertData(title, cleanContent);

    Console.WriteLine("任务完成,数据已同步至 EMLOG");
}

四、 前端交互:HTML/CSS/JS 的轻量实现

爬虫只是后端,为了让这个功能变成“在线工具”,我们需要一个简单的 Web 界面。别搞太复杂的框架,原生 HTML/CSS/JS 最快。

3. 在线工具界面代码 (index.html 示例)




    


    

零点博客专属数据聚合工具

五、 避坑指南与底层复盘

折腾完上述代码,我再总结一下我踩过的坑,大家开发时尽量避开:

  1. 字符编码问题: EMLOG 数据库默认是 UTF-8,如果 C# 连接串没指定 CharSet=utf8mb4,写入中文会乱码。
  2. 事务处理: 如果一次爬取 100 条数据,建议加上 `TransactionScope`,只要有一条失败,全部回滚,保证数据一致性。
  3. 连接池: 在高并发下,不要在循环中创建连接,一定要 `using` 包裹,让连接池管理资源。
  4. 正则匹配: JSON 里如果有转义字符,记得使用 `RegexOptions.Compiled` 提升解析性能。

这套 C# + MySQL 的组合拳在零点博客的很多实战项目中都验证过,非常稳定。如果你有更好的 EMLOG 优化思路,欢迎在评论区交流!