C# 爬虫开发实战:从 HTML 抓取到 MySQL 存储,彻底搞懂 SQL 注入防护
上周在零点博客搞个定时任务,想把某些垂直领域的资讯自动同步过来,这就用到了爬虫开发。这里不是那种简单的 Hello World,而是结合了C#、HTML/CSS/JS 分析、MySQL 数据库操作以及安全防护的综合实战。很多新手觉得爬虫就是用正则字符串匹配,其实不然,底层逻辑没搞懂,后面维护起来全是坑。
一、环境准备与 HTML 元素解析
首先,咱们得确定目标。这次抓取的网页数据结构比较清晰。为了提高效率,我直接引入了 HtmlAgilityPack 这个神器,它比用正则表达式去扒 DOM 节点要稳健得多。
底层拆解: 我们先用浏览器 F12 看看源码,确认数据所在的 div 的 class 是什么。比如目标网站的标题在 class="news-title" 下。
// 示例:使用 HtmlAgilityPack 加载页面并提取数据
var web = new HtmlWeb();
var doc = web.Load("https://example.com/news");
var nodes = doc.DocumentNode.SelectNodes("//div[@class='news-title']");
foreach (var node in nodes)
{
Console.WriteLine(node.InnerText);
}
别小看这一步,很多坑出在接口开发时,对方改了个 ID 或者 class,没做容错处理,程序就崩了。这里我们就用到了前端的基础知识,懂得如何通过JSON/XML 或者 HTML 结构去定位数据。
二、接口开发与 JSON 数据处理
有些网站不支持直接抓取 HTML,或者数据是渲染在 JS 里的。这时候就需要用 **HttpWebRequest** 模拟浏览器请求,拿到的是一段 JSON 数据。拿到 JSON 后,通常使用 Newtonsoft.Json 库进行反序列化。
var response = client.GetStringAsync(url).Result;
var data = JsonConvert.DeserializeObject<RootObject>(response);
这种场景下,处理正则表达式的机会就变少了,更多是做 JSON 的 Schema 校验。如果你在做在线工具开发,经常需要将抓取的数据格式化输出,这个能力是必须的。
三、MySQL 数据库操作与 SQL 注入防护
抓到数据不能光看着啊,得存起来。这时候就涉及到了PHP 后端(或者是 C# 直接连库)与 MySQL 的交互。
很多博主(包括我以前)喜欢写这种 SQL:
string sql = "INSERT INTO article (title, content) VALUES ('" + title + "', '" + content + "')";
【避坑指南】:千万别这么写! 这是典型的SQL注入防护漏洞。如果黑客把 `title` 设为 `' OR '1'='1`,你的整个库就没了。
正确的姿势是使用预处理语句:
string sql = "INSERT INTO article (title, content) VALUES (@Title, @Content)";
using (MySqlCommand cmd = new MySqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@Title", title);
cmd.Parameters.AddWithValue("@Content", content);
cmd.ExecuteNonQuery();
}
无论你是用 C# 还是 PHP,参数化查询是必须的。这不仅是安全问题,对于大量数据写入的稳定性也有帮助。
四、总结与复盘
这次在零点博客梳理这套流程,最大的收获是:爬虫开发不仅仅是会写代码,更是一场对前端结构、网络协议和数据库安全的综合测试。
- 做抓虫时,多去分析HTML/CSS 结构,少用正则去猜;
- 涉及到数据库,务必上预处理语句;
- 如果是复杂的逻辑,拆解成微服务形式的接口开发会更清晰。
希望这份结合了源码案例和底层逻辑的复盘,能帮大家少走弯路。代码已放在附件,欢迎在评论区指正!



评论一下吧
取消回复