<!DOCTYPE html>

C#爬虫实战:手把手封装EMLOG博客抓取器并做SQL注入防护(附完整代码案例)

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} 条数据");
            }
        }
    }
}

四、 完整流程整合与实战总结

以上就是我们代码案例的核心部分。将前文的爬取、解析和安全入库结合起来,就能跑通整个流程。作为零点博客的作者,我在实操中发现两个坑点:

  1. 编码问题:有些CMS编码是UTF-8,有些是GBK,解析前最好统一转码,否则正则会失效。
  2. 并发限流:如果你的EMLOG站配置不高,千万别多线程同时狂刷,会被服务器直接封IP。建议加个 Thread.Sleep(1000) 延时。

这套方案不仅适用于EMLOG,稍微改改正则,同样适用于ZBlog或者Wordpress的接口开发。希望这个干货能帮到正在做C#后端或者爬虫开发的兄弟们,如有疑问欢迎在评论区交流!