写在前面:从零点博客说起
老规矩,先和大家聊聊背景。最近整理技术文档时,翻到了自己以前用 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();
}
}
避坑指南与总结
在这次实操中,我踩了两个大坑,分享给大家:
- 编码问题:很多老站像零点博客早期用的是 GB2312,如果直接用 UTF-8 解析,出来的中文全是乱码。一定要根据 Header 的
Content-Type或经验来判断编码。 - 反爬虫:如果频繁请求被封 IP,记得在代码里加个
Thread.Sleep(1000)延迟,或者接入代理 IP 服务。
通过这次 C#编程 的实战,不仅把 EMLOG 的数据备份好了,还顺手复习了正则和数据库安全。这种工具类的小项目,非常适合提升你的底层开发能力。希望大家也能动手试一试,做自己的专属 在线工具。
更多关于 前端开发 和 后端接口 的细节,欢迎在评论区交流。



评论一下吧
取消回复