<!DOCTYPE html>
C#爬虫实战:手把手封装EMLOG博客抓取器并做SQL注入防护(附完整代码案例)
哈喽,大家好,我是零点博客的小编。最近在帮一个站长朋友搭建数据中台,需要将几站点的EMLOG博客内容统一同步到我们的中心数据库。既然用到了C#后端开发,又涉及到大量的数据清洗和入库,今天我就来分享一段代码案例,不仅教大家怎么写爬虫,更关键的是要教大家怎么写安全代码。
一、 需求背景:为什么选C#写爬虫?
EMLOG是一款非常轻量级的PHP博客程序,很多个人站都在用。我们要抓取它的文章列表页(通常是index.php),解析出标题、链接和发布时间。相比于PHP或Python,C#在处理并发请求和XML/JSON解析上有天然优势,且.NET的生态对Web请求封装得很好。我们要完成的任务非常明确:请求网页 -> 正则解析 -> 数据清洗 -> MySQL入库。
二、 环境准备与核心逻辑
首先,我们得用 HttpClient 来模拟浏览器请求。注意,爬虫抓取时要带上伪装User-Agent,否则服务器可能直接给你个403拦截了。拿到HTML源码后,怎么提取数据?正则表达式是绕不开的利器。
1. 发起请求并获取源码
这里用到了后端开发的基础知识。为了防止程序卡死,我们建议使用异步操作。
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class SpiderService
{
private static readonly HttpClient client = new HttpClient();
static SpiderService()
{
// 设置User-Agent伪装,避免被EMLOG的反爬拦截
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
}
// 获取网页HTML源码
public static async Task<string> GetHtmlAsync(string url)
{
try
{
return await client.GetStringAsync(url);
}
catch (Exception ex)
{
Console.WriteLine($"请求失败: {ex.Message}");
return string.Empty;
}
}
}
2. 正则表达式解析EMLOG列表页
EMLOG列表页的格式通常很固定,我们只需要匹配特定的HTML标签。这里我写了一个简单的正则匹配逻辑。
using System.Text.RegularExpressions;
public class ContentParser
{
// 匹配文章标题和链接的正则
private static readonly string Pattern = @"<h3><a href=\"(.+?)\" title=\"(.+?)\">.+?</a></h3>";
public static void Parse(string html)
{
MatchCollection matches = Regex.Matches(html, Pattern, RegexOptions.IgnoreCase);
foreach (Match match in matches)
{
string link = match.Groups[1].Value;
string title = match.Groups[2].Value;
Console.WriteLine($"抓取到文章: {title} - {link}");
// TODO: 这里可以将解析出的数据存入List等待后续处理
}
}
}
三、 底层避坑指南:SQL注入防护与预处理语句
很多新手在写后端时,喜欢直接拼接SQL语句,比如 insert into ... values('" + title + "')。这在EMLOG这样的动态站点里是致命的。攻击者可以在标题里注入 ); DROP TABLE users; --,瞬间搞挂你的数据库。所以,必须使用预处理语句。
下面这段代码展示了如何安全地插入数据。我们使用 MySqlCommand 配合 AddWithValue,这样数据库引擎会自动识别参数,杜绝注入风险。
using System.Data.SqlClient;
public class DataHelper
{
private static string connStr = "Server=.;Database=EMLOG_DB;Uid=root;Pwd=123456;";
public static void SafeInsert(string title, string link)
{
string sql = "INSERT INTO blog_articles (title, link, create_time) VALUES (@Title, @Link, GETDATE())";
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
// 核心安全点:使用参数化查询,严禁手动拼接SQL字符串
cmd.Parameters.AddWithValue("@Title", title);
cmd.Parameters.AddWithValue("@Link", link);
conn.Open();
int rows = cmd.ExecuteNonQuery();
Console.WriteLine($"成功插入 {rows} 条数据");
}
}
}
}
四、 完整流程整合与实战总结
以上就是我们代码案例的核心部分。将前文的爬取、解析和安全入库结合起来,就能跑通整个流程。作为零点博客的作者,我在实操中发现两个坑点:
- 编码问题:有些CMS编码是UTF-8,有些是GBK,解析前最好统一转码,否则正则会失效。
- 并发限流:如果你的EMLOG站配置不高,千万别多线程同时狂刷,会被服务器直接封IP。建议加个
Thread.Sleep(1000)延时。
这套方案不仅适用于EMLOG,稍微改改正则,同样适用于ZBlog或者Wordpress的接口开发。希望这个干货能帮到正在做C#后端或者爬虫开发的兄弟们,如有疑问欢迎在评论区交流!



评论一下吧
取消回复