<!DOCTYPE html>
技术笔记|从零点博客爬虫实战:C# 结合正则与SQL预处理语句的避坑全解
最近在折腾自己的技术栈,想用 C# 做一个针对特定博客源码(类似 EMLOG 架构)的数据监控系统。中间踩了不少坑,尤其是涉及到 MySQL 数据库安全和 正则表达式 解析的时候。今天就把这个 技术笔记 整理出来,希望能帮到同样在开发 在线工具 或做接口开发的朋友。
一、项目背景与架构思路
我们的目标是构建一个轻量级的数据采集器,能够解析目标网站的 HTML/CSS/JS 结构,提取出核心内容,并安全地存入 MySQL 数据库。很多人做爬虫喜欢用 PHP,但我也尝试用 C# 重写了一遍,感觉在处理并发和接口开发上,C# 的优势更明显。
二、前端解析与正则提取实战
拿到目标页面的源码后,第一件事就是分析 DOM 结构。在 零点博客 这种系统里,文章标题和内容通常会被 div 标签包裹,class 名字具有规律性。
这里必须提到 正则表达式 的威力,但一定要注意性能。不要在循环里频繁构建正则对象:
// 错误示范:在循环里编译正则,效率极低
for (int i = 0; i < list.Count; i++) {
Regex rx = new Regex(@"<h1>(.+?)</h1>"); // 每次循环都编译
}
// 正确示范:实例化一次,复用
var titlePattern = new Regex(@"<h1[^>]*>(?<title>[^<]+)</h1>");
var match = titlePattern.Match(htmlContent);
string title = match.Groups["title"].Value;
三、后端逻辑与 SQL 注入防护
数据提取只是第一步,如何存入 MySQL 才是重头戏。之前的旧代码经常看到拼接 SQL 的写法,这是大忌。为了防止 SQL注入,必须使用预处理语句。
在 C# 中,我们通常使用 SqlCommand 配合 Parameters:
string sql = "INSERT INTO blog_posts (title, content, create_time) VALUES (@Title, @Content, @Time)";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
// 核心:使用参数化查询,杜绝注入
cmd.Parameters.AddWithValue("@Title", title);
cmd.Parameters.AddWithValue("@Content", content);
cmd.Parameters.AddWithValue("@Time", DateTime.Now);
cmd.ExecuteNonQuery();
}
}
这一步不仅是安全,也是为了方便 JSON/XML 数据解析。我们将数据处理好后,以 JSON 格式返回给前端,方便后续做数据迁移或展示。
四、总结与复盘
通过这次实战,我深刻体会到:
- HTML/CSS/JS 是前端解析的基础,理解其结构是写爬虫的前提。
- C# 结合 正则表达式 在处理非结构化数据时依然强大,但要优化性能。
- SQL注入防护 必须写入基因,预处理语句是最后的一道防线。
- 不管是做 EMLOG 插件还是独立接口,数据安全永远是第一位。
这套流程我已经封装成一个通用的 在线工具 模板,后续如果还有新的 底层拆解 会继续更新在技术笔记里。代码已开源在 Github,感兴趣的朋友可以拿来参考复用。



评论一下吧
取消回复