嗨,我是零点。最近有不少小伙伴在群里问关于爬虫开发的问题,觉得这块技术挺深奥。其实只要你掌握好了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格式输出

后端解析完成后,前端需要接收数据。为了让前端好处理,我们通常将结果封装成 JSONXML 格式返回。在 C# 中,可以利用 Newtonsoft.Json 库快速转换。

前端 JS 可以通过 fetch$.ajax 获取这个 JSON 对象,然后动态渲染到页面上。这种前后端分离的模式,配合 EMLOG 这种轻量级 CMS 的二次开发,非常灵活。

六、 避坑指南与总结

  • 乱码问题:抓取内容时,一定要确认对方的编码格式,通常检查 Content-Type: charset=utf-8
  • 频率限制:如果对方服务器有反爬机制(如 Cloudflare),直接狂发请求会被封 IP,记得设置适当的请求间隔。
  • 正则维护:对方改个 CSS 类名,你的正则可能就失效了,做长期工具要做好正则的容错性。

总的来说,开发一个在线爬虫工具,本质就是熟练运用 C#HTML解析正则表达式 以及 数据库 操作。希望这篇基于零点博客实战的复盘,能帮大家打通任督二脉。如果你有具体的业务需求,欢迎在评论区留言讨论!