从踩坑到落地:用阿里云服务器实现博客内容自动同步
一、背景:为什么放弃 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 -
依赖包:
requests、pyyaml、beautifulsoup4、lxml(需提前安装)
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 |
五、优化建议(长期稳定运行)
-
日志监控:每周查看一次日志,确认无执行失败记录;
-
通知兜底:开启 GitHub 提交通知(Settings→Notifications),收到推送成功邮件即安心;
-
延迟调整:若后续 CSDN 反爬加强,可在爬虫脚本中增加
time.sleep(3-5); -
避免空提交:脚本已内置 “无变更则跳过提交” 逻辑,无需额外处理;
-
服务器保活:阿里云轻量服务器默认不会关机,确保实例状态正常即可。
六、总结
从 GitHub Actions 被反爬到服务器部署成功,整个方案的核心优势:
-
稳定性:服务器 IP 不会被 CSDN 拉黑,抓取成功率 100%;
-
自动化:一次配置,终身受益,每 6 小时自动同步,无需手动干预;
-
低成本:阿里云轻量服务器最低配即可满足需求,年付成本低;
-
可复用:这套流程不仅适用于 CSDN 博客,还能同步其他平台内容(如知乎、掘金)。
如果你也遇到类似的 “平台反爬 + 自动同步” 需求,不妨试试服务器 + 定时任务的方案,简单高效且稳定可靠!

1808

被折叠的 条评论
为什么被折叠?



