Shell脚本如何下载网页中所有图片

wen 实用脚本 6

本文目录导读:

Shell脚本如何下载网页中所有图片

  1. 方法1:使用wget(最简单)
  2. 方法2:使用curl和grep(更灵活)
  3. 方法3:处理相对路径和完整URL
  4. 方法4:使用curl处理CSS背景图片
  5. 方法5:完整版脚本(带进度显示)
  6. 使用示例
  7. 高级用法:并行下载(更快)

我来介绍几种使用Shell脚本下载网页中所有图片的方法:

方法1:使用wget(最简单)

#!/bin/bash
# 下载页面中所有图片
URL="https://example.com"
wget -nd -r -l 1 -H -A jpg,jpeg,png,gif,webp -e robots=off "$URL"
# 参数说明:
# -nd: 不创建目录结构
# -r: 递归下载
# -l 1: 只递归1层(仅当前页面)
# -H: 允许跨主机下载
# -A: 指定文件类型
# -e robots=off: 忽略robots.txt

方法2:使用curl和grep(更灵活)

#!/bin/bash
URL="https://example.com"
# 下载HTML并提取图片链接
curl -s "$URL" | \
    grep -oP '(https?://[^"\'\''<>]+\.(jpg|jpeg|png|gif|webp))' | \
    sort -u | \
    while read img_url; do
        echo "Downloading: $img_url"
        wget -c "$img_url"
    done

方法3:处理相对路径和完整URL

#!/bin/bash
download_images() {
    local url="$1"
    local domain=$(echo "$url" | sed -e 's|^[^/]*//||' -e 's|/.*$||')
    # 获取页面内容
    html=$(curl -s "$url")
    # 提取所有图片标签
    echo "$html" | \
        grep -oP '<img[^>]+src=["'\'' ]\K[^"'\'' ]+' | \
        while read img_src; do
            # 处理相对路径
            case "$img_src" in
                http*)
                    img_url="$img_src"
                    ;;
                /*)
                    img_url="https://$domain$img_src"
                    ;;
                *)
                    base_url=$(dirname "$url")
                    img_url="$base_url/$img_src"
                    ;;
            esac
            # 下载图片
            filename=$(basename "$img_url")
            echo "Downloading: $filename"
            wget -q -O "$filename" "$img_url"
        done
}
# 使用示例
download_images "https://example.com/gallery"

方法4:使用curl处理CSS背景图片

#!/bin/bash
# 下载所有图片(包括CSS背景图)
download_all_images() {
    local url="$1"
    # 下载HTML
    curl -s "$url" > page.html
    # 提取常规img标签
    grep -oP '(?<=src=")[^"]+(png|jpg|jpeg|gif|webp)' page.html | \
        while read img; do
            if [[ $img == http* ]]; then
                wget -c "$img"
            else
                echo "需要处理相对路径: $img"
            fi
        done
    # 提取CSS中的背景图片
    grep -oP 'url\(['"\''"]?\K[^)"'\'']+(png|jpg|jpeg|gif|webp)' page.html | \
        while read bg_img; do
            wget -c "$bg_img"
        done
    rm page.html
}

方法5:完整版脚本(带进度显示)

#!/bin/bash
# 下载网页所有图片的完整脚本
clear
echo "========================================="
echo "         网页图片批量下载工具"
echo "========================================="
# 输入URL
read -p "请输入网页URL: " URL
if [[ -z "$URL" ]]; then
    echo "错误:URL不能为空"
    exit 1
fi
# 创建下载目录
DOMAIN=$(echo "$URL" | sed -e 's|^[^/]*//||' -e 's|/.*$||')
DOWNLOAD_DIR="images_${DOMAIN}_$(date +%Y%m%d)"
mkdir -p "$DOWNLOAD_DIR"
cd "$DOWNLOAD_DIR"
echo "创建下载目录: $DOWNLOAD_DIR"
echo "正在获取页面内容..."
# 下载HTML
HTML=$(curl -s "$URL")
if [[ -z "$HTML" ]]; then
    echo "错误:无法访问网页"
    exit 1
fi
# 提取所有图片URL
IMAGE_URLS=$(echo "$HTML" | \
    grep -oP '(https?://)?[^"'\''<>]+\.(jpg|jpeg|png|gif|webp|bmp|svg)' | \
    sort -u)
if [[ -z "$IMAGE_URLS" ]]; then
    echo "未找到图片"
    exit 1
fi
# 统计图片数量
TOTAL=$(echo "$IMAGE_URLS" | wc -l)
echo "找到 $TOTAL 张图片"
echo "开始下载..."
echo "----------------------------------------"
# 下载图片
COUNT=0
echo "$IMAGE_URLS" | while read img_url; do
    COUNT=$((COUNT + 1))
    # 处理相对路径
    if [[ ! "$img_url" =~ ^http ]]; then
        if [[ "$img_url" =~ ^// ]]; then
            img_url="https:$img_url"
        elif [[ "$img_url" =~ ^/ ]]; then
            img_url="https://$DOMAIN$img_url"
        else
            base_url=$(dirname "$URL")
            img_url="$base_url/$img_url"
        fi
    fi
    # 获取文件名
    filename=$(basename "$img_url" | cut -d'?' -f1)
    # 自动处理文件名冲突
    if [[ -f "$filename" ]]; then
        filename="${COUNT}_${filename}"
    fi
    echo "[$COUNT/$TOTAL] 下载: $filename"
    # 下载图片(带重试)
    wget -q --timeout=30 --tries=3 -O "$filename" "$img_url" 2>/dev/null || \
        echo "  下载失败: $img_url"
done
echo "----------------------------------------"
echo "下载完成!"
echo "图片保存在: $DOWNLOAD_DIR"

使用示例

# 保存为脚本文件
cat > download_images.sh << 'EOF'
[上面任选一个脚本内容]
EOF
# 添加执行权限
chmod +x download_images.sh
# 运行脚本
./download_images.sh

高级用法:并行下载(更快)

#!/bin/bash
# 并行下载函数
download() {
    local url="$1"
    local filename=$(basename "$url" | cut -d'?' -f1)
    if [[ -f "$filename" ]]; then
        echo "跳过已存在: $filename"
        return 0
    fi
    echo "下载: $filename"
    wget -q --timeout=10 -O "$filename" "$url"
}
# 主程序
URL="https://example.com"
# 提取图片URL并创建数组
mapfile -t IMAGES < <(curl -s "$URL" | \
    grep -oP 'https?://[^"'\''<>]+\.(jpg|jpeg|png|gif|webp)' | \
    sort -u)
# 并行下载(最多5个同时下载)
for img in "${IMAGES[@]}"; do
    download "$img" &
    # 控制并发数
    while (( $(jobs -r | wc -l) >= 5 )); do
        sleep 0.1
    done
done
# 等待所有下载完成
wait
echo "全部下载完成"

这些脚本各有特点,建议根据实际需求选择:

  • 方法1:简单快速,适合大多数场景
  • 方法2-3:更灵活,支持自定义处理
  • 方法4-5:功能完整,适合生产环境
  • 并行版本:大量图片时速度更快

抱歉,评论功能暂时关闭!