当前位置: 首页 > java >正文

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

http://www.xdnf.cn/news/20093.html

相关文章:

  • Dubbo消费者无法找到提供者问题分析和处理
  • 记录SSL部署,链路不完整问题
  • Eclipse 常用搜索功能汇总
  • 连接MCP,Lighthouse MCP Server和CNB MCP Server应用
  • 解密注意力计算的并行机制:从多头并张量操作到CUDA内核优化
  • 25年Docker镜像无法下载的四种对策
  • 【Spring Cloud Alibaba】Sentinel(一)
  • 【LeetCode数据结构】设计循环队列
  • Java 并发编程解析:死锁成因、可重入锁与解决方案
  • 人工智能机器学习——逻辑回归
  • go 初始化组件最佳实践
  • ai生成ppt工具有哪些?10款主流AI生成PPT工具盘点
  • 中州养老:角色管理的角色分页查询
  • 渗透测试与网络安全审计的关系
  • (论文速读)Navigation World Models: 让机器人像人类一样想象和规划导航路径
  • MySQL主从复制之进阶延时同步、GTID复制、半同步复制完整实验流程
  • aippt自动生成工具有哪些?一文看懂,总有一款适合你!
  • Java数据结构——栈(Stack)和队列(Queue)
  • Qt---状态机框架QState
  • 【Sharding-JDBC】​Spring/Spring Boot 集成 Sharding-JDBC,分表策略与 API、YAML 配置实践​
  • 达梦数据库-共享内存池
  • 3.3.3 钢结构工程施工
  • Kubernetes知识点(三)
  • 探究Linux系统的SSL/TLS证书机制
  • 河南萌新联赛2025第(七)场:郑州轻工业大学
  • 直接让前端请求代理到自己的本地服务器,告别CV报文到自己的API工具,解放双手
  • android View详解—自定义ViewGroup,流式布局
  • 亚洲数字能源独角兽的 “安全密码”:Parasoft为星星充电筑牢软件防线
  • MongoDB 高可用部署:Replica Set 搭建与故障转移测试
  • SpringCloud微服务基于nacos注册中心的服务发现模式及OpenFeign的使用