前言:写在零点博客的深夜复盘
在折腾 C# 后端开发时,处理网络爬虫数据是一个绕不开的坎。尤其是结合 HTML/CSS/JS 前端分析逻辑与 MySQL 数据库的交互时,新手最容易踩的坑往往不在爬虫本身,而在数据存储的安全环节。
这次整理的技术笔记,源于昨天调试一套自动抓取竞品价格的程序。整个过程涉及 C# HttpClient 发起请求、正则表达式 提取关键数据,以及最重要的一步——防止 SQL注入 的预处理语句操作。这里把踩过的坑和最终的落地代码分享给大家。
一、 爬虫逻辑拆解:如何优雅地提取 JSON/XML
首先,对于现代网站,数据多半以 JSON 或 XML 格式返回。我们直接使用 C# 的 HttpClient 模拟浏览器请求。
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0...");
var response = await client.GetStringAsync("https://api.example.com/data");
// 使用正则或序列化库解析
var json = JsonParse(response);
}
这里要注意,很多接口做了反爬,我们在请求头里必须带上 User-Agent。如果是复杂的 HTML 页面,则需要结合前端 DOM 分析,或者使用 HtmlAgilityPack 库。我的实战经验是:尽量调用对方提供的 API接口,比直接扒网页源码要稳定得多,且不容易因为 JS 渲染问题导致数据丢失。
二、 数据入库:预处理语句是最后一道防线
数据抓取下来了,怎么存入数据库?很多初学者为了图省事,会直接把数据拼接到 SQL 语句里,这是绝对禁止的!一旦请求包里混入了恶意脚本,你的整个 MySQL 数据库都会沦陷。
在 C# 中,我们必须使用 MySql.Data.MySqlClient 库,并强制开启参数化查询(预处理语句):
string sql = "INSERT INTO crawler_data (title, price, create_time) VALUES (@title, @price, @time)";
using (MySqlCommand cmd = new MySqlCommand(sql, connection))
{
// 绝对不要直接拼字符串:cmd.CommandText = "INSERT... VALUES ('" + title + "')";
cmd.Parameters.AddWithValue("@title", data.Title);
cmd.Parameters.AddWithValue("@price", data.Price);
cmd.Parameters.AddWithValue("@time", DateTime.Now);
cmd.ExecuteNonQuery();
}
上面的代码展示了最标准的接口开发思路:解耦业务逻辑与数据库逻辑。无论前端传来的数据多么复杂,在进入数据库前,统统被当成字符串参数处理,彻底杜绝 SQL注入 风险。
三、 避坑指南与底层原理
在开发在线工具或爬虫时,我总结了三个必须注意的底层细节:
- 字符编码:爬虫抓取时,务必指定
Encoding.UTF8,否则中文字符会乱码变成乱码,导致正则匹配失败。 - 连接池:频繁创建和销毁
MySqlConnection会极度消耗性能,建议使用连接池或单例模式管理数据库连接。 - 防封策略:不要让爬虫无间隔狂轰滥炸。在代码中加入 Random 延时(比如随机等待 1-3 秒),模拟人类浏览行为。
如果你是做 EMLOG 博客系统或类似的 PHP 后端,逻辑也是相通的,只是把 MySqlCommand 换成 PDO 或 mysqli 即可。
总结
这套从 HTML/CSS/JS 分析到 C# 爬取,再到 MySQL 存储的完整闭环,是做开发者工具开发的核心基础。把基础打牢,后续开发在线工具、自动化脚本才会得心应手。希望这份技术笔记能帮大家少走弯路。
关注零点博客,持续更新更多实战干货。



评论一下吧
取消回复