本文目录导读:

- 方法1:使用wget(最简单)
- 方法2:使用curl和grep(更灵活)
- 方法3:处理相对路径和完整URL
- 方法4:使用curl处理CSS背景图片
- 方法5:完整版脚本(带进度显示)
- 使用示例
- 高级用法:并行下载(更快)
我来介绍几种使用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:功能完整,适合生产环境
- 并行版本:大量图片时速度更快