【个人网站搭建】—— 用阿里云服务器实现博客内容自动同步

从踩坑到落地:用阿里云服务器实现博客内容自动同步

一、背景:为什么放弃 GitHub Actions?

作为一名经常在 CSDN 写技术博客的开发者,我一直想让个人 GitHub Pages 博客自动同步 CSDN 文章 —— 既不用手动复制粘贴,又能保持两个平台内容一致。

最初尝试用 GitHub Actions 实现定时爬虫 + 自动提交,但很快遇到了致命问题:CSDN 的反爬机制直接拉黑了 GitHub 的 IP 网段,爬虫请求全被拦截,无论怎么优化请求头、添加延迟都无效。

既然 GitHub Actions 的运行环境被限制,不如换个思路:用云服务器部署爬虫脚本,通过 Linux 定时任务实现自动化,彻底避开 IP 拉黑问题。最终选择阿里云轻量应用服务器,全程零成本实现需求,稳定运行至今。

二、核心技术栈

  • 服务器:阿里云轻量应用服务器(CentOS 7)

  • 自动化工具:Shell 脚本 + Linux crontab 定时任务

  • 核心功能:Python 爬虫(同步 CSDN 文章)+ Git 自动提交推送

  • 辅助配置:SSH 免密登录、日志记录、字符编码优化

三、完整实现步骤(从零到一)

1. 服务器环境准备
1.1 基础软件安装

确保服务器安装必备工具:

# 安装Python3和pip(若未安装)
yum install -y python3 python3-pip git

# 验证安装
python3 --version  # 输出Python 3.x.x
git --version      # 输出Git版本
1.2 配置 GitHub SSH 免密(关键!)

自动提交代码到 GitHub 需要免密权限,配置步骤:

# 1. 生成SSH密钥(一路回车,无需设置密码)
ssh-keygen -t ed25519 -C "你的GitHub注册邮箱"

# 2. 复制公钥
cat ~/.ssh/id_ed25519.pub

# 3. 粘贴到GitHub
# GitHub → Settings → SSH and GPG keys → New SSH key → 粘贴公钥 → 保存

# 4. 验证配置(无报错则成功)
ssh -T git@github.com
1.3 克隆博客项目
# 用SSH地址克隆(避免HTTPS输密码)
git clone git@github.com:Lvyizhuo/Lvyizhuo.github.io.git

# 进入项目目录
cd /root/Project/Lvyizhuo.github.io
2. 编写 Python 爬虫脚本

核心功能:抓取 CSDN 博客文章,保存为 YAML 文件(已在你的项目中实现,关键优化点):

  • 双抓取方案:优先调用 CSDN API,失败则降级为 HTML 解析

  • 反爬优化:添加请求头、随机延迟、重试机制

  • 数据持久化:保存文章标题、链接、日期、阅读量到_data/csdn_posts.yml

  • 依赖包:requestspyyamlbeautifulsoup4lxml(需提前安装)

3. 编写 Shell 脚本:整合全流程

单独的 Python 脚本无法完成 Git 提交和推送,用 Shell 脚本将「执行爬虫→Git 操作」串起来,还能添加日志和错误处理:

创建脚本auto_update_blog.sh

#!/bin/bash
# 日志文件路径
LOG_FILE="/root/Project/Lvyizhuo.github.io/auto_update_blog.log"
# 项目目录(绝对路径!)
PROJECT_DIR="/root/Project/Lvyizhuo.github.io"
# Python脚本路径
PYTHON_SCRIPT="${PROJECT_DIR}/scripts/fetch_csdn_articles.py"
# Python解释器路径
PYTHON_PATH=$(which python3)

# 日志格式化输出
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> ${LOG_FILE}
}

# 开始执行
log "========================================"
log "开始执行自动更新博客流程"

# 切换到项目目录(避免路径错误)
cd ${PROJECT_DIR} || { log "ERROR: 切换目录失败"; exit 1; }

# 执行爬虫脚本
log "执行爬虫脚本:${PYTHON_SCRIPT}"
${PYTHON_PATH} ${PYTHON_SCRIPT} >> ${LOG_FILE} 2>&1
if [ $? -eq 0 ]; then
    log "爬虫执行成功"
else
    log "ERROR: 爬虫执行失败"; exit 1;
fi

# Git添加缓存
git add . >> ${LOG_FILE} 2>&1
log "Git添加缓存成功"

# Git提交(有变更才提交)
COMMIT_MSG="自动更新博客 $(date +'%Y-%m-%d %H:%M:%S')"
git diff --quiet && git diff --staged --quiet
if [ $? -eq 1 ]; then
    git commit -m "${COMMIT_MSG}" >> ${LOG_FILE} 2>&1
    log "提交成功:${COMMIT_MSG}"
else
    log "无文件变更,跳过提交"
fi

# Git推送
git push origin main >> ${LOG_FILE} 2>&1
if [ $? -eq 0 ]; then
    log "推送远程仓库成功"
else
    log "ERROR: 推送失败"; exit 1;
fi

log "流程执行完毕"
log "========================================\n"
exit 0

给脚本添加执行权限:

chmod +x /root/Project/Lvyizhuo.github.io/auto_update_blog.sh
4. 配置 crontab 定时任务

让服务器按指定时间自动执行 Shell 脚本,实现无人值守:

4.1 编辑定时任务
# 用root用户编辑(避免权限问题)
crontab -e
4.2 添加配置(关键!)
# 字符编码配置(避免中文乱码)
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8

# 定时规则:每6小时执行一次(0点、6点、12点、18点)
# 日志重定向:捕获所有执行错误
0 */6 * * * /root/Project/Lvyizhuo.github.io/auto_update_blog.sh >> /root/Project/Lvyizhuo.github.io/crontab_blog.log 2>&1
4.3 生效配置
# 重启crond服务
systemctl restart crond

# 查看服务状态(确保运行中)
systemctl status crond

四、验证与问题排查

1. 手动测试脚本

先手动执行一次,确保全流程无报错:

/root/Project/Lvyizhuo.github.io/auto_update_blog.sh

# 查看日志
cat /root/Project/Lvyizhuo.github.io/auto_update_blog.log

成功日志示例:

[2026-02-03 13:56:11] 切换到项目目录:/root/Project/Lvyizhuo.github.io
[2026-02-03 13:56:11] 开始执行爬虫脚本
[2026-02-03 13:56:15] 爬虫执行成功
[2026-02-03 13:56:15] Git添加缓存成功
[2026-02-03 13:56:15] 提交成功:自动更新博客 2026-02-03 13:56:15
[2026-02-03 13:56:18] 推送远程仓库成功
2. 常见问题解决
问题现象排查方向
Git 推送失败1. 检查 SSH 公钥是否添加到 GitHub;2. 手动执行git push验证
爬虫执行失败1. 查看日志中的错误信息;2. 检查依赖包是否安装;3. 确认服务器网络能访问 CSDN
定时任务不执行1. 检查 crond 服务是否运行;2. 查看crontab_blog.log捕获系统级错误;3. 确保脚本路径是绝对路径
中文乱码确认 crontab 中配置了LANG=en_US.UTF-8

五、优化建议(长期稳定运行)

  1. 日志监控:每周查看一次日志,确认无执行失败记录;

  2. 通知兜底:开启 GitHub 提交通知(Settings→Notifications),收到推送成功邮件即安心;

  3. 延迟调整:若后续 CSDN 反爬加强,可在爬虫脚本中增加time.sleep(3-5)

  4. 避免空提交:脚本已内置 “无变更则跳过提交” 逻辑,无需额外处理;

  5. 服务器保活:阿里云轻量服务器默认不会关机,确保实例状态正常即可。

六、总结

从 GitHub Actions 被反爬到服务器部署成功,整个方案的核心优势:

  • 稳定性:服务器 IP 不会被 CSDN 拉黑,抓取成功率 100%;

  • 自动化:一次配置,终身受益,每 6 小时自动同步,无需手动干预;

  • 低成本:阿里云轻量服务器最低配即可满足需求,年付成本低;

  • 可复用:这套流程不仅适用于 CSDN 博客,还能同步其他平台内容(如知乎、掘金)。

如果你也遇到类似的 “平台反爬 + 自动同步” 需求,不妨试试服务器 + 定时任务的方案,简单高效且稳定可靠!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花间相见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值