嗨,我是零点。最近有不少小伙伴在群里问关于爬虫开发的问题,觉得这块技术挺深奥。其实只要你掌握好了C#的后端逻辑,配合好前端的展示,这就是一个标准的接口开发流程。今天我就把自己在零点博客开发在线工具时的实战经验复盘一下,给大家展示一个从0到1的爬虫工具开发全过程。
这个工具的目的是为了抓取目标网站的标题和摘要,并存入我们的数据库。涉及的栈主要有:C#后端、Html解析、正则表达式、MySQL数据库。
一、 技术选型与架构思路
做爬虫,选对工具很重要。我们使用C#作为后端语言,配合 HttpClient 进行请求,使用 HtmlAgilityPack 库来解析HTML,最后用 MySql.Data 连接数据库。前端部分则是简单的 HTML/CSS/JS,负责发送请求和展示 JSON 格式的数据。
二、 核心逻辑:发送请求与HTML解析
很多新手最容易踩的坑就是直接用 WebClient 或简单的 StreamReader 读取,这种对乱码、乱序支持不好。这里我推荐 HttpClient 并配合正确设置 User-Agent。
拿到 HTML 源码后,我们要利用正则表达式提取我们需要的信息,比如文章标题。写正则时最怕写死,比如限制标题长度或特殊字符,这就需要灵活调整。
三、 源码实战:C# 后端逻辑
下面这段代码是我封装好的爬虫核心逻辑,大家可以直接拿去跑。
using System;
using System.Net.Http;
using System.Text.RegularExpressions;
using HtmlAgilityPack;
using MySql.Data.MySqlClient;
using System.Collections.Generic;
namespace ZidianSpider
{
public class SpiderService
{
// 配置你的数据库连接串,注意要包含Server,Uid,Pwd
private static string connStr = "Server=localhost;Database=zidian_blog;Uid=root;Pwd=123456;";
public async Task<Dictionary<string, string>> StartCrawlAsync(string url)
{
var result = new Dictionary<string, string>();
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...");
try
{
// 1. 发起请求,获取网页内容
var html = await client.GetStringAsync(url);
// 2. 使用HtmlAgilityPack加载DOM
var doc = new HtmlDocument();
doc.LoadHtml(html);
// 3. 使用正则表达式提取标题(以实战为例)
// 注意:这里只是一个简单的例子,实际项目中建议根据class或id来抓取
var titleNode = doc.DocumentNode.SelectSingleNode("//title");
string title = titleNode?.InnerText;
// 进一步用正则清洗掉可能的编码字符
string cleanTitle = Regex.Replace(title, @"[\s\x00-\x7F]+", "");
result["status"] = "success";
result["title"] = cleanTitle;
result["content"] = "抓取成功!";
// 实际场景中,你可以在这里进行分页循环,或者继续解析Body里的文本
}
catch (Exception ex)
{
result["status"] = "error";
result["message"] = ex.Message;
}
}
return result;
}
}
}
四、 数据安全:SQL注入防护
拿到数据后存入数据库是关键一步。千万别用字符串拼接 SQL!很多人在写PHP或者C#时习惯写成 INSERT INTO ... VALUES ('' + title + ''),这是极大的安全隐患,极易受到SQL注入攻击。
正确的做法是使用参数化查询(预处理语句)。C# 的 MySqlCommand 提供了 Parameters.AddWithValue,这能自动过滤掉恶意 SQL 代码。
// 避坑指南:预处理语句防注入
string sql = "INSERT INTO articles (title, create_time) VALUES (@Title, @Time)";
using (MySqlCommand cmd = new MySqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@Title", title); // 自动转义
cmd.Parameters.AddWithValue("@Time", DateTime.Now);
cmd.ExecuteNonQuery();
}
五、 数据交互:JSON格式输出
后端解析完成后,前端需要接收数据。为了让前端好处理,我们通常将结果封装成 JSON 或 XML 格式返回。在 C# 中,可以利用 Newtonsoft.Json 库快速转换。
前端 JS 可以通过 fetch 或 $.ajax 获取这个 JSON 对象,然后动态渲染到页面上。这种前后端分离的模式,配合 EMLOG 这种轻量级 CMS 的二次开发,非常灵活。
六、 避坑指南与总结
- 乱码问题:抓取内容时,一定要确认对方的编码格式,通常检查
Content-Type: charset=utf-8。 - 频率限制:如果对方服务器有反爬机制(如 Cloudflare),直接狂发请求会被封 IP,记得设置适当的请求间隔。
- 正则维护:对方改个 CSS 类名,你的正则可能就失效了,做长期工具要做好正则的容错性。
总的来说,开发一个在线爬虫工具,本质就是熟练运用 C#、HTML解析、正则表达式 以及 数据库 操作。希望这篇基于零点博客实战的复盘,能帮大家打通任督二脉。如果你有具体的业务需求,欢迎在评论区留言讨论!



评论一下吧
取消回复