写在前面:从零点博客说起

老规矩,先和大家聊聊背景。最近整理技术文档时,翻到了自己以前用 EMLOG 搭建的零点博客,里面有不少早期的技术复盘。EMLOG 简洁轻量,但自带的备份功能有时候并不方便。于是我想到了用 C#编程 来写一个小工具,自动把零点博客的文章爬下来,存到本地的 MySQL 数据库里,这样既能备份,又能方便二次开发。

这其实涉及到接口开发、爬虫开发、正则表达式以及安全编程等多个环节。废话不多说,直接上干货。

第一步:分析目标页面与抓取逻辑

打开零点博客的任意文章页面,右键查看源代码。你会发现文章标题、正文其实都隐藏在特定的 div 或 h2 标签里。为了模拟真实浏览器行为,我们需要在 C#编程 中构造一个标准的 HttpRequest 请求,带上 User-Agent,否则很容易被服务器拒绝。

第二步:核心代码实现

这里是一个简化版的 Demo,重点展示如何使用 HttpClient 发送请求,并结合 正则表达式 提取数据。

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;

namespace ZeroPointCrawler
{
    class Program
    {
        // 目标博客地址
        static string baseUrl = "https://www.lingdianboke.com/post/";
        static void Main(string[] args)
        {
            // 模拟抓取前5页
            for (int i = 1; i <= 5; i++)
            {
                string html = FetchHtml(baseUrl + i);
                List<Article> articles = ParseHtml(html);
                SaveToDatabase(articles);
            }
            Console.WriteLine("爬取完成!");
        }

        // 发送HTTP请求
        static string FetchHtml(string url)
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...");
                // 这里假设返回的是GB2312编码,避免乱码
                var bytes = client.GetByteArrayAsync(url).Result;
                return System.Text.Encoding.GetEncoding("GB2312").GetString(bytes);
            }
        }

        // 使用正则提取数据
        static List<Article> ParseHtml(string html)
        {
            var list = new List<Article>();
            // 正则表达式:匹配<h2>标签及内容
            string pattern = @"<h2[^>]*>([^<]+)</h2>";
            MatchCollection matches = Regex.Matches(html, pattern, RegexOptions.IgnoreCase);

            foreach (Match match in matches)
            {
                list.Add(new Article { Title = match.Groups[1].Value.Trim() });
            }
            return list;
        }
    }

    class Article { public string Title { get; set; } }
}

第三步:数据库操作与安全防护(重要!)

爬取数据只是为了好玩,存起来才是正事。这里必须强调一下 SQL注入防护。千万不要直接用字符串拼接 SQL,这简直是在给黑客开门。

我们要使用 预处理语句。在 C# 的 MySQL 操作中,通过 MySqlCommand 配合 Parameters 属性来实现。

string connStr = "Server=localhost;Database=crawler_db;Uid=root;Pwd=123456;Charset=utf8mb4;";
using (MySqlConnection conn = new MySqlConnection(connStr))
{
    conn.Open();
    string sql = "INSERT INTO posts (title) VALUES (@title)";
    using (MySqlCommand cmd = new MySqlCommand(sql, conn))
    {
        // 使用参数化查询,杜绝SQL注入
        cmd.Parameters.AddWithValue("@title", article.Title);
        cmd.ExecuteNonQuery();
    }
}

避坑指南与总结

在这次实操中,我踩了两个大坑,分享给大家:

  1. 编码问题:很多老站像零点博客早期用的是 GB2312,如果直接用 UTF-8 解析,出来的中文全是乱码。一定要根据 Header 的 Content-Type 或经验来判断编码。
  2. 反爬虫:如果频繁请求被封 IP,记得在代码里加个 Thread.Sleep(1000) 延迟,或者接入代理 IP 服务。

通过这次 C#编程 的实战,不仅把 EMLOG 的数据备份好了,还顺手复习了正则和数据库安全。这种工具类的小项目,非常适合提升你的底层开发能力。希望大家也能动手试一试,做自己的专属 在线工具。

更多关于 前端开发 和 后端接口 的细节,欢迎在评论区交流。