shell编写图片爬虫

    本例子来源于Linux shell Scripting Cookbook,自己简单注释下;

#!/bin/bash
#Description: Images downloader
#Filename: img_downloader.sh
# 校验参数个数 $# 代表参数个数, $0代表当前文件名称
if [ $# -ne 3 ]
then
    echo "Usage: $0 URL -d DIRECTORY"
    exit -1
fi
#循环解析参数
#也可以写成while格式的
#使用shift操作,直至参数不为空为止
#while [ -n "$0"]
#do
#case $1 in
# -d) shift;directory=$1;shift;;
#  *) url=$1;shift;;
#esac
#done
for i in { 1..4}
do
    case $1 in 
    -d) shift; directory=$1; shift ;;
     *) url=${url:-$1}; shift;;

esac
done

mkdir -p $directory;
#通过正则表达式,把传入的含有url的String,截取未标准的Url
baseurl=$(echo $url | egrep -o "https?://[a-z.]+")
#curl -s 获取url内容,并且不打印提示信息
curl -s $url | egrep -o "<img src=[^>]*>" |
sed 's/<img src=\"\([^"]*\).*/\1/g' > /tmp/$$.list
sed -i "s|^/|$baseurl/|" /tmp/$$.list
cd $directory;
while read filename;
do
  curl -s -O "$filename" --silent
done </tmp/$$.list

   这里具体讲解下

egrep -o "<img src=[^>]*>"

   egrep 相当与 grep -e 后面可以用正则表达式来索引内容。[^>]* 表示一直到不为 '>'的前面的所有的内容。这一步主要是把<img src="xxx"  ..  >这中内容提取出来。

sed 's/<img src=\"\([^"]*\).*/\1/g' > /tmp/$$.list

   sed 后面跟的正则表达式格式 一般是 's/ \( \) /\1/g' ,其中 \1代表是前面第一个匹配上的正则表达式的引用,如果有多个就可以写成 's/\( \)  \(  \)/\1 \2/g' ,比如我们想把两个字母翻转 可以写成 echo 'ab' | sed 's/\(.\)\(.\)/\2\1/' 。

$$代表当前进程的id。把得到的结果放到$$.list中。

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

   这句话的作用是把那些图片中以相对路径 '/'开头 替换成当前的上下文。

while read filename;
do
  curl -s -O "$filename" --silent
done </tmp/$$.list

   把$$.list中的url按行读到filename中,curl 后面跟的是-O 不是0。

    转发标注来源  http://my.oschina.net/robinyao/blog/402068

   END----------------------------------


你可能感兴趣的:(shell编写图片爬虫)