C#实战爬虫开发:从接口抓取到MySQL安全入库,零点博主复盘全流程

在零点博客的后台开发中,我们经常需要采集第三方数据(比如小说书页、新闻资讯)来丰富站内内容。很多刚入行的小伙伴觉得爬虫开发神秘,其实核心逻辑就那么几步。今天我以最近做的电商价格监控为例,结合C#、JSON解析以及SQL注入防护,手把手带大家拆解一套可落地的爬虫方案。

一、 接口抓取:不是随便用HttpWebRequest就行

以前用老版本的 HttpWebRequest,各种重定向、编码问题搞人心态。现在大家首选 HttpClient。关键点在于模拟浏览器请求,否则对方服务器直接返回403拒绝访问。

// 模拟Header,加入 Referer 和 User-Agent
var handler = new HttpClientHandler() { CookieContainer = new CookieContainer() };
var client = new HttpClient(handler);
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 ...");
client.DefaultRequestHeaders.Add("Referer", "https://www.example.com");

// 发送GET请求获取HTML或JSON
string url = "https://api.example.com/data?id=10086";
HttpResponseMessage response = await client.GetAsync(url);
string result = await response.Content.ReadAsStringAsync();

二、 数据清洗:正则与JSON/XML的平衡

拿到数据后,可能是HTML源码,也可能是JSON/XML格式。如果是JSON,直接用反序列化工具(如Newtonsoft.Json)转对象最爽;如果是HTML,这就不得不提正则表达式了。

比如我们要从HTML里抓取小说标题和作者:

// 简单的正则示例,抓取 <h1> 标签内容
Regex regex = new Regex(@"<h1[^>]*>(?<title>[^<]+)</h1>", RegexOptions.IgnoreCase);
Match match = regex.Match(htmlContent);
if (match.Success) {
    string title = match.Groups["title"].Value;
    Console.WriteLine($"标题: {title}");
}

三、 后端落地:从爬虫到数据库的桥梁

爬到的数据不能一直留在内存里,得入库。这里我们假设用 MySQL 数据库存储。很多新手写代码时图省事,直接拼接SQL字符串,这在大项目中是大忌。

在零点博客的源码案例中,我使用了 预处理语句 来防止 SQL注入防护。即使爬取的数据来源不可控,也能确保数据库绝对安全。

using (MySqlConnection conn = new MySqlConnection(connectionString)) {
    conn.Open();
    // 使用预处理语句,防止注入
    string sql = "INSERT INTO articles (title, content, create_time) VALUES (@title, @content, @time)";

    using (MySqlCommand cmd = new MySqlCommand(sql, conn)) {
        cmd.Parameters.AddWithValue("@title", title);
        cmd.Parameters.AddWithValue("@content", content);
        cmd.Parameters.AddWithValue("@time", DateTime.Now);

        cmd.ExecuteNonQuery();
    }
}

四、 避坑指南与底层拆解

在开发C#爬虫过程中,遇到过几个典型的坑:

  • 乱码问题: 一定要检查API返回的字符集,往往Head里声明是UTF-8,但内容是GBK,导致正则匹配全是乱码。
  • 反爬机制: 对方JS加密了时间戳,这时候光看接口URL没用,得用浏览器F12断点调试JS,在C#里复刻这段加密逻辑。
  • 接口变更: 很多接口更新时不会发通知,如果你的数据解析逻辑是硬编码的,爬虫会突然报错。所以代码里要有异常捕获,抓不到数据自动降级或报警。

五、 总结

爬虫开发本质上是后端开发的一部分,它涉及HTTP协议、数据解析(正则/JSON/XML)、数据库操作以及安全防护。不要为了爬虫而爬虫,要根据实际业务场景(比如在EMLOG博客系统中展示爬来的数据)来设计架构。

这套方案我在零点博客的实战项目中跑通了,希望对大家的开发有帮助。如果你在接口开发或爬虫开发中遇到其他问题,欢迎在评论区留言。