Shell作为自动化脚本的利器,在爬虫领域展现独特价值。它虽不擅长复杂页面解析,却是卓越的流程调度器。通过巧妙组合curl、jq、pup等工具,Shell能构建高效数据采集流水线。其优势在于轻量级调度、系统无缝集成和简洁的文本处理,特别适合API数据抓取和定时爬取任务。

下面是一个完整的 Shell 自动化爬虫脚本示例,它定期抓取新闻网站的标题和链接,并保存到 CSV 文件中,同时包含日志记录和错误处理功能。
bash
#!/bin/bash
# ==============================================
# 新闻标题自动化采集脚本
# 功能:定期抓取新闻标题和链接,保存为CSV格式
# ==============================================
# -------------------------------
# 配置区域(可根据需要修改)
# -------------------------------
TARGET_URL="https://news.ycombinator.com" # 目标网站
OUTPUT_DIR="./news_data" # 输出目录
LOG_FILE="${OUTPUT_DIR}/news_crawler.log" # 日志文件
CRON_SCHEDULE="0 9,18 * * *" # 每天上午9点和下午6点执行
# -------------------------------
# 初始化函数
# -------------------------------
init() {
# 创建输出目录
mkdir -p "$OUTPUT_DIR"
# 检查必要工具是否安装
check_dependency curl
check_dependency pup # HTML解析工具
check_dependency jq # JSON处理工具(备用)
# 记录启动日志
log "INFO" "新闻爬虫初始化完成"
}
# 检查依赖工具
check_dependency() {
if ! command -v "$1" &> /dev/null; then
log "ERROR" "未找到所需工具: $1,请先安装"
exit 1
fi
}
# -------------------------------
# 日志记录函数
# -------------------------------
log() {
local level=$1
local message=$2
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[${timestamp}] [${level}] ${message}" >> "$LOG_FILE"
# 同时输出到控制台(如果非静默模式)
if [ "$SILENT" != "true" ]; then
echo "[${level}] ${message}"
fi
}
# -------------------------------
# 网页抓取与解析函数
# -------------------------------
fetch_news() {
local output_file="${OUTPUT_DIR}/news_$(date +%Y%m%d_%H%M%S).csv"
local temp_html="${OUTPUT_DIR}/temp_page.html"
log "INFO" "开始抓取新闻数据: ${TARGET_URL}"
# 使用curl下载网页
curl -s -L -A "Mozilla/5.0 (compatible; NewsBot/1.0)" --connect-timeout 30 --max-time 60 "$TARGET_URL" -o "$temp_html" 2>> "$LOG_FILE"
if [ $? -ne 0 ]; then
log "ERROR" "网页下载失败"
return 1
fi
# 使用pup解析HTML,提取新闻标题和链接
# 注意:这里的选择器需要根据实际目标网站结构调整
local titles=$(pup 'td.title > a text{}' < "$temp_html")
local links=$(pup 'td.title > a attr{href}' < "$temp_html")
# 创建CSV文件头
echo "title,link,timestamp" > "$output_file"
# 将标题和链接合并为CSV格式
paste -d ',' <(echo "$titles" | sed 's/,/;/g') <(echo "$links") <(date +%Y-%m-%d\ %H:%M:%S) | sed 's/,,*/,/g' >> "$output_file"
# 清理临时文件
rm -f "$temp_html"
local count=$(($(wc -l < "$output_file") - 1)) # 减去标题行
log "INFO" "成功抓取 ${count} 条新闻,已保存至: ${output_file}"
# 这里可以添加更多的处理逻辑,如:
# - 发送邮件通知
# - 数据去重处理
# - 上传到数据库或云存储
}
# -------------------------------
# 安装为定时任务
# -------------------------------
install_cron() {
local script_path=$(realpath "$0")
# 检查是否已存在定时任务
if crontab -l 2>/dev/null | grep -q "$script_path"; then
log "INFO" "定时任务已存在"
return 0
fi
# 添加定时任务
(crontab -l 2>/dev/null; echo "${CRON_SCHEDULE} ${script_path} --run") | crontab -
if [ $? -eq 0 ]; then
log "INFO" "已安装定时任务,计划: ${CRON_SCHEDULE}"
else
log "ERROR" "定时任务安装失败"
return 1
fi
}
# -------------------------------
# 主程序
# -------------------------------
main() {
# 解析命令行参数
case "$1" in
"--install")
init
install_cron
;;
"--run")
init
fetch_news
;;
"--log")
# 查看最新日志
tail -f "$LOG_FILE"
;;
*)
echo "使用方法: $0 [选项]"
echo "选项:"
echo " --install 安装为定时任务"
echo " --run 立即运行爬虫"
echo " --log 查看实时日志"
echo ""
echo "示例:"
echo " $0 --install # 安装定时任务"
echo " $0 --run # 立即运行一次"
exit 1
;;
esac
}
# 启动主程序
main "$@"
使用说明
1. 安装依赖工具
在运行脚本前,需要安装必要的工具:
csharp
# Ubuntu/Debian
sudo apt-get install curl jq
sudo apt-get install pup # 如果仓库中没有pup,可以从源码安装
# CentOS/RHEL
sudo yum install curl jq
# macOS
brew install curl jq pup
2. 脚本使用方法
bash
# 给予执行权限
chmod +x news_crawler.sh
# 安装为定时任务
./news_crawler.sh --install
# 立即运行一次爬虫
./news_crawler.sh --run
# 查看实时日志
./news_crawler.sh --log
3. 自定义配置
您可以根据需要修改脚本顶部的配置区域:
TARGET_URL
: 改为您想要爬取的目标网站OUTPUT_DIR
: 更改数据输出目录CRON_SCHEDULE
: 调整定时任务执行频率- 修改
pup
选择器以适应目标网站的HTML结构
扩展建议
1、错误重试机制:可以添加失败重试逻辑,提高爬虫稳定性
2、代理支持:添加代理服务器支持,防止IP被封锁
3、数据去重 :使用 sort | uniq
或数据库避免重复数据
4、邮件通知 :集成 mail
命令,在抓取完成或出错时发送通知
5、数据备份:添加定期备份和清理旧数据的逻辑
这个脚本展示了如何使用 Shell 实现一个完整的自动化爬虫工作流,包括调度、抓取、解析、存储和日志记录等关键功能。对于更复杂的爬虫需求,可以考虑将核心抓取逻辑用 Python 等语言实现,然后使用 Shell 脚本进行调度和管理。
总而言之,Shell在爬虫自动化中扮演着"指挥官"角色。它将专业工具串联成高效工作流,实现从抓取到存储的全链路管理。对于简单任务可独立完成,复杂场景则调度专业脚本协作。这种灵活性与系统级集成能力,使Shell成为自动化爬虫体系中不可或缺的基石。