我们需要下载某个网站上的所有图片,我们需要使用crawler.可以使用Shell脚本

我们抓取的方式如下

#! /bin/bash

if [ $# -ne 3 ];

then

echo “Usage: $0 URL -d directory”

exit -1

fi

for i in {1..4}

do

case $1 in

-d) shift;directory=$1; shift ;;

*) url=${url:-$1}; shift;;

esac

done

mkdir -p $directory

baseurl=$(echo $url | egrep -o “https?://[a-z.]+”)

curl -s $url | egrep -o “<img src=[^>]*” | sed ‘s/<img src=\”\([^”]*\).*/\1/g’ > /tmp/$$.txt

sed -i “s|^/|$baseurl/|” /tmp/$$.list

cd $directory;

while read filename;

do

curl -s -O “$filename” –slient

done < /tmp/$$.list

上述图片下载器脚本首先解析HTML的页面,除去<img>之外的所有标记,然后从<img> 标记下解析出src=”URL” 并将图片下载到指定的目录中,这个脚本接受一个网页URL和用于存放图片的目录路径作为命令行参数,脚本会再开始去解析命令行参数

[ $# -ne 3 ]检查脚本参数数量是否为3个,如果不是,会退出运行

如果是3个,就需要解析URL和目标目录,解析过程中需要一些技巧

for i in {1..4}

do

case $1 in

-d) shift; directory=$1;shift ;;

*) url=$(url:-$1); shift;;

esac

done

使用for循环来执行4次迭代

并且在循环中,不断的进行参数判断,匹配-d,我们如果将-d置于命令行的任意位置

./img_downloader.sh -d DIR URL

./img_downloader.sh URL -d DIR

shift用来移动参数,当使用shift后,$2的参数赋给了$1,再次使用shift,$3的值赋给了$1.依次类推,我们通过$1来给所有的参数求值

然后case中匹配了-d,接下来我们会查看下一个值是不是目标目录,然后 * 能对应任何内容,当$1 = “” 或者 $1=URL的时候,需要避免 “” 覆盖掉,所以是一个判断表达式 url=${url:-$1}如果url不为空,会返回URL的值

然后egrep -o “<img src=[^>]*>”只打印包括属性在内的<img>标记,[^>]*用来匹配除了>之外的所有字符

sed ‘s/<img src=\”\([^”]*\).*/\1/g’对 src=”url”进行解析,得到了所有的URL

然后为避免以/开头的相对路径

我们需要将其转为绝对路径,需要使用基址URL

这时候,我们就需要一开头存入的baseurl了,方便路径转换

然后 使用sed -i “s|^/|$baseurl/|” /tmp/$$.list,进行了/的替换

while加上curl进行循环下载,并且加上了–silent选项保证静谧

发表评论

邮箱地址不会被公开。 必填项已用*标注