本文目录导读:

- 方法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:功能完整,适合生产环境
- 并行版本:大量图片时速度更快
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播