无需Python:Shell脚本如何成为你的自动化爬虫引擎?

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成为自动化爬虫体系中不可或缺的基石。

相关推荐
moonsheeper11 小时前
用爬虫技术及各种技术使用场景
爬虫
是有头发的程序猿11 小时前
电商开发日志:淘宝图片搜索商品列表(二)
数据库·爬虫·python
fyakm13 小时前
python和java爬虫优劣对比
java·爬虫·python
华科云商xiao徐14 小时前
手把手教你用Go打造带可视化的网络爬虫
前端·爬虫
华科云商xiao徐14 小时前
Python爬虫数据清洗实战:从杂乱无章到整洁可用
爬虫·数据挖掘·数据分析
q567315231 天前
从开发到部署深度解析Go与Python爬虫利弊
爬虫·python·golang
qq7798233401 天前
爬虫实战练习
爬虫
华科云商xiao徐1 天前
极简Dart代码搞定App内实时数据抓取
爬虫·python·数据分析
小白学大数据1 天前
分布式爬虫的全局请求间隔协调与IP轮换策略
分布式·爬虫·tcp/ip