零点博客复盘:手撸一个带SQL注入防护的C#爬虫工具

这几天为了完善零点博客的“在线RSS聚合器”,我得自己写个后端程序去抓取几个老旧站点的内容。这不,正儿八经的**实操教程**来了,很多初学者问“正则表达式到底怎么用才不慢?”或者“SQL注入到底怎么防?”,别再死记硬背了,直接看代码。

本次实战我们使用 C# 后端配合 MySQL 数据库,核心任务是从指定网页抓取 HTML 数据,利用正则表达式提取标题和链接,将其转化为 JSON 格式,最后安全地存入数据库。

一、后端搭建与HTTP请求

首先,我们需要新建一个控制台项目。在 Program.cs 中引入 HttpClient 类。这里有个坑,官方文档没说透,直接 new HttpClient 默认是不走代理的,但在抓取某些反爬虫网站时,建议手动添加 HttpClientHandler 来模拟浏览器 User-Agent。

var handler = new HttpClientHandler();
handler.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...";
var client = new HttpClient(handler);

string url = "https://www.example.com/feed";
string htmlContent = await client.GetStringAsync(url);

二、正则表达式解析HTML/XML

拿到 HTML 后,别傻乎乎地去遍历 DOM 树,那是 CSSSelector 的事。咱们玩底层开发,正则才是王道。针对这种结构化的 XML 数据,正则提取速度极快。

// 提取标题的正则
string titlePattern = @<title>(.*?)</title>;
// 提取链接的正则
string linkPattern = @<link>(.*?)</link>;

MatchCollection titleMatches = Regex.Matches(htmlContent, titlePattern, RegexOptions.IgnoreCase);

注意:正则虽然快,但不灵活,大家开发在线工具时,如果涉及到复杂的自定义页面,建议还是用 HtmlAgilityPack。

三、致命问题:SQL注入与预处理语句

把数据存进去是重头戏。很多新人在拿到 JSON 字符串后,直接拼 SQL 语句,这简直是“手撕 SQL 注入”。必须使用参数化查询(预处理语句)。

string insertSql = "INSERT INTO crawler_data (title, link, create_time) VALUES (@Title, @Link, @Time)";

using (MySqlConnection conn = new MySqlConnection(connectionString))
using (MySqlCommand cmd = new MySqlCommand(insertSql, conn))
{
    // 注意看这里,用 @参数名 而不是拼接字符串,数据库驱动会自动处理转义
    cmd.Parameters.AddWithValue("@Title", "我的网页标题");
    cmd.Parameters.AddWithValue("@Link", "https://.../link");
    cmd.Parameters.AddWithValue("@Time", DateTime.Now);

    await conn.OpenAsync();
    await cmd.ExecuteNonQueryAsync();
}

四、JSON数据解析与交互

有时候我们需要把抓取的数据直接返回给前端。C# 自带的 System.Text.Json 是目前的最佳选择(性能优于 Newtonsoft.Json)。

var dataList = new List<dynamic>();
// 这里演示如何手动构建一个简单的 JSON 对象
var result = new { status = "success", data = dataList };

string jsonOutput = JsonSerializer.Serialize(result);

五、避坑指南与性能优化

1. **网络并发**:抓取多个 URL 时,不要用 Task.WaitAll 搞死线程池。使用 Task.WhenAll 或者信号量控制并发数。 2. **连接池**:MySQL 的连接一定要用 using 包裹,或者手动 Close,否则连接数跑满了数据库会拒接连接。 3. **异常捕获**:爬虫最容易挂,一定要捕获 HttpRequestException,把错误信息存进日志表,别让它直接弹窗崩溃。

好了,这篇关于 C#爬虫开发、正则表达式 以及 SQL注入防护 的底层实操教程就到这里。源码我会直接上传到零点博客,想玩源码的兄弟点个关注,下期讲讲怎么把这个爬虫封装成接口供前端调用。