无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell作为自动化脚本的利器,在爬虫领域展现独特价值。它虽不擅长复杂页面解析,却是卓越的流程调度器。通过巧妙组合curl、jq、pup等工具,Shell能构建高效数据采集流水线。其优势在于轻量级调度、系统无缝集成和简洁的文本处理,特别适合API数据抓取和定时爬取任务。
下面是一个完整的 Shell 自动化爬虫脚本示例,它定期抓取新闻网站的标题和链接,并保存到 CSV 文件中,同时包含日志记录和错误处理功能。
#!/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 curlcheck_dependency pup # HTML解析工具check_dependency jq # JSON处理工具(备用)# 记录启动日志log "INFO" "新闻爬虫初始化完成"
}# 检查依赖工具
check_dependency() {if ! command -v "$1" &> /dev/null; thenlog "ERROR" "未找到所需工具: $1,请先安装"exit 1fi
}# -------------------------------
# 日志记录函数
# -------------------------------
log() {local level=$1local message=$2local timestamp=$(date '+%Y-%m-%d %H:%M:%S')echo "[${timestamp}] [${level}] ${message}" >> "$LOG_FILE"# 同时输出到控制台(如果非静默模式)if [ "$SILENT" != "true" ]; thenecho "[${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 ]; thenlog "ERROR" "网页下载失败"return 1fi# 使用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"; thenlog "INFO" "定时任务已存在"return 0fi# 添加定时任务(crontab -l 2>/dev/null; echo "${CRON_SCHEDULE} ${script_path} --run") | crontab -if [ $? -eq 0 ]; thenlog "INFO" "已安装定时任务,计划: ${CRON_SCHEDULE}"elselog "ERROR" "定时任务安装失败"return 1fi
}# -------------------------------
# 主程序
# -------------------------------
main() {# 解析命令行参数case "$1" in"--install")initinstall_cron;;"--run")initfetch_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. 安装依赖工具
在运行脚本前,需要安装必要的工具:
# 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. 脚本使用方法
# 给予执行权限
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成为自动化爬虫体系中不可或缺的基石。