#!/bin/bash #脚本功能:抓取网页上的图片并下载 URL=/root/data/day03/$$.txt #定义一个变量,$$以脚本进程命名,这里即脚本执行则生成一个txt文件 curl -s https://www.tmooc.cn/ > $URL #获取网页源代码,并保存到变量URL中,-s静默获取屏幕无输出 #开始获取图片地址 echo -e "\033[32m getting url \033[0m" sed -i '/<img/!d' $URL sed -i 's/.*src="//' $URL sed -i 's/".*//' $URL echo #判断若未安装wget则安装 if ! rpm -q wget &>/dev/null then yum -y install wget fi #开始下载图片 echo -e "\033[32m start install \033[0m" for i in $(cat $URL) #使用for循环对变量URL中图片的网址进行循环 do wget -P /root/data/day03/image/ -q $i #使用wget下载图片并保存到指定路径,-P指定路径,-q静默下载 done 以上代码是否有误
时间: 2023-12-08 14:06:47 浏览: 139
你的脚本代码存在一些问题:
1. 变量URL应该是指定存储网页源代码的文件路径,而不是存储图片地址的文件路径,应该修改为:
```
URL=/root/data/day03/source.html
```
2. 使用sed命令提取图片地址时,应该把把提取到的地址写入到一个新的文件中,而不是在原始文件中进行修改,应该修改为:
```
sed -n '/<img/s/.*src="\([^"]*\)".*/\1/p' $URL > /root/data/day03/image_urls.txt
```
这样可以将提取到的图片地址写入到一个新的文件`/root/data/day03/image_urls.txt`中,方便后续处理。
3. 在循环中使用`cat $URL`读取图片地址时,会把整个文件读入内存,如果图片地址较多会导致内存占用过高,应该改为逐行读取文件中的地址,可以使用以下方式:
```
while read url
do
wget -P /root/data/day03/image/ -q $url
done < /root/data/day03/image_urls.txt
```
这样可以逐行读取文件中的地址,并且不会占用过多内存。
4. 在下载图片时,应该判断是否下载成功,如果下载失败需要给出提示,可以改为以下方式:
```
while read url
do
if wget -P /root/data/day03/image/ -q $url ; then
echo "Download $url success!"
else
echo "Download $url failed!"
fi
done < /root/data/day03/image_urls.txt
```
这样可以判断下载是否成功,并给出相应提示。
综上所述,修改后的脚本代码如下:
```
#!/bin/bash
#脚本功能:抓取网页上的图片并下载
URL=/root/data/day03/source.html #定义一个变量,$$以脚本进程命名,这里即脚本执行则生成一个txt文件
#获取网页源代码,并保存到变量URL中,-s静默获取屏幕无输出
curl -s https://www.tmooc.cn/ > $URL
#开始获取图片地址
echo -e "\033[32m getting url \033[0m"
sed -n '/<img/s/.*src="\([^"]*\)".*/\1/p' $URL > /root/data/day03/image_urls.txt
#判断若未安装wget则安装
if ! rpm -q wget &>/dev/null
then
yum -y install wget
fi
#开始下载图片
echo -e "\033[32m start install \033[0m"
while read url
do
if wget -P /root/data/day03/image/ -q $url ; then
echo "Download $url success!"
else
echo "Download $url failed!"
fi
done < /root/data/day03/image_urls.txt
```
阅读全文