我们需要下载某个网站上的所有图片,我们需要使用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选项保证静谧