bash 脚本 -- 爬取图片

代码传送
欢迎大家转载,转载请注明出处,谢谢!

  • 原理:
    主要就是采用curl命令采集网页html源码,然后利用正则表达式和grep、`sed`等工具对网页源码进行剪切和筛选,最终找到图片下载链接,最后用wget进行下载。

  • 知识准备:

    这里简单介绍一些基本知识,本人也只是现用现查,更多用法请查询man手册man xxx

    1. bash 基础语法:

      • 美元符号($):用来取值,取变量的值:num=$i(取变量i的值赋值给num变量)、取数组的值:nums=${a[${i}]}(取a[i]的值赋值给nums变量)、取命令的值:total=$(last | awk NF | grep -v 'system' | grep -v 'wtmp' | cut -d ' ' -f 1 | uniq -c) (取小括号里面命令的最终执行结果的输出数据赋值给total变量)。

      • 数学运算:本人比较喜欢小括号的方式:

        num=0
        ((num++))
        num=$((num + 1))
        for ((i = 0; i < num; i++));
        do
        	echo "i = ${i}"
        done	
        
        
      • 双引号和单引号:

        二者都是将字符串引起来,但是双引号里面可以使用bash的关键字、特殊字符、转义字符等,而单引号就是将所有的字符都视为字符本身,没有其他意义,变成了单纯的字符串。

      • 取值符**`**:

        这个符号在Tab键上面,上面说过美元符号后面用小括号可以取一个命令的执行结果,除了这种方式还可以用取值符号:

        total=`last | awk NF | grep -v 'system' | grep -v 'wtmp' | cut -d ' ' -f 1 | uniq -c`
        
      • 字符串操作:

        str="123456"
        echo ${str:0:3} # 取str的从0开始到3的子串
        echo ${str:(-3)} # 取str的从末尾开始往前长度为3的子串
        
      • 为脚本增加参数:

        当我们使用linux命令的时候会经常在命令后面加上各种各样的参数,C语言接收参数是在主函数后面的括号里,而我们bash脚本接收命令行参数的方式是$0$1$@$#等等:

        1. $0变量存储着脚本名称加上路径
        2. $1变量存储着第一个变量以此类推
        3. $@变量存储着所有的变量以回车分隔
        4. $#变量也是存储所有变量,但是确是所有变量已空格分隔转换成的字符串,是一个完整的字符串。
        a=$1
        b=$2
        c=$3
        ...
        for arg in `$@`
        do
        	echo "${arg}"
        done
        echo "all arg : $#"
        
      • echo

        该命令是回显,可以把后面的内容输出到标准输出,有两个常用的参数:-n-e

        # 加上-e参数后,后面的字符串中可以使用转义字符
        # echo 默认自动换行,加上-n参数后不默认结尾换行
        echo -en "\033[1;31m\tERROR\n\033[0m"
        
      • 管道:

      管道是unix哲学的体现之一,unix哲学强调小而美,小的东西更加灵活,每个程序只需要专注的做好一件事并给出统一接口。我们经常会看到两个命令中间有一个|符号,管道可以把管道前面的程序的标准输出作为后一个程序的标准输入。这样我们就可以灵活的运用几个简单的命令完成复杂的工作。

      last | awk NF | grep -v 'system' | grep -v 'wtmp' | cut -d ' ' -f 1 | 	uniq -c
      
      • 分之语句-if

        用法举例:

        # if Command;then
        # 	Command;
        # fi
        # eg.
        # 判断部分我们常用test表达式。
        # 数值判断:
        num = 0
        if [[ ${num} -eq 0 ]]; then
        	echo "num = 0"
        elif [[ ${num} -en -1 ]];then
        	echo "num != -1"
        elif [[ ${num} -gt 0 && ${num} -le 5 ]];then
        	echo "num > 0 && num <= 5"
        elif [[ ${num} -ge 6 && ${num} -lt 10 ]];then
        	echo "num >= 6 && num < 10"
        else 
        	echo "num = ${num}"
        fi
        
        # 字符串判断:
        name="sunowsir"
        if [[ "x${num}" == "x" ]];then
        	echo "name is NULL"
        elif [[ ${num} != "sunowsir" ]];then
        	echo "name : ${name}"
        else 
        	echo "name : sunowsir"
        fi
        
      • 分之语句-case

        用法举例:

        # case 用美元符号取值的变量/数组/命令 in
        # 	判断值)
        # 		command
        # 	;;
        # 	...
        # esac
        eg. 
            case ${para[${i}]} in
                "-u" | "--url" | "--URL" | "--Url")
                    ((i++))
                    source_url=${para[${i}]}
                ;;
                "-p"| "--path" | "--Path" | "--PATH")
                    ((i++))
                    save_path=${para[${i}]}
                ;;
                "-s" | "--suffix" | "--Suffix" | "--SUFFIX")
                    ((i++))
                    suffix=${para[${i}]}
                ;;
                "-n" | "--name" | "--Name" | "--NAME")
                    ((i++))
                    search_name=${para[${i}]}
                ;;
                "-w" | "--word" | "--Word" | "--WORD")
                    ((i++))
                    add_word=${para[${i}]}
                ;;
                *)
                    echo "please use --help to get help information."
                ;;
            esac
        
        
      • 循环语句-for

        用法举例:

        # for Variable in 用美元符号取值的变量/数组/命令,以回车分隔;
        # do
        # 	Command;
        # done
        # for ((i = 0; i < max; i++));
        # do
        # 	Command;
        # done
        for arg in $@
        do
        	echo ${arg}
        done
        for ((int i = 0; i < 10; i++));
        do
        	echo ${i}
        done
        # break和continue 和C语言一样使用
        
      • wait:等待上一个命令执行结束。

    2. 常用工具:

      • date:输出格式化时间

        date +"%Y-%m-%d %H:%M:%S"
        # 输出
        -------------------
        2018-10-18 11:53:08
        
      • touch:常用来创建一个新的空白文件

      • grep:数据筛选工具:

        1. -E使用扩展正则表达式。
        2. -o只显示匹配到的内容
        3. -I忽略二进制文件
        4. -v输出不匹配的内容
        5. -a将二进制文件当做普通文件读取
        6. -H显示匹配到的字符串在该字符串所在文件中的行号
        7. -h不显示上述的行号。
      • sort:排序工具,常用参数如下:

        1. -t 定义分隔符
        2. -k 以上述分隔符分隔的第几部分为标准排序
        3. -n根据字符串数值进行比较。
        4. -c检查输入是否已排序,若已有序则不进行操作
        5. -u配合-c,严格校验排序;不配合-c,则只输出一次排序结果
      • dirname

        返回以/为分隔的字符串的除了最后一部分的剩下的部分,在脚本中通常用来使用$0求脚本所在位置。

      • basename

        返回以/为分隔的字符串的最后一部分,通常用来求当前目录的名称。

      • tr:字符批量替换工具

        # tr [选项]... SET1 [SET2]
        # eg.
        echo "192/168/1//108" | tr -s '/' '.'
        
      • cut:字符串切割工具

        # cut [选项]... [文件]...
        # eg.
        echo "192/168/1//108" | tr -s '/' '.' | cut -d '.'  -f 1
        
      • sed:流式文本编辑器

        # sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...
        # eg.
        ls -a | nl | sed 's/^\s*//g'
        
      • curlwget:用来获取网页HTML源码和下载文件,用法请自行查询man手册:man curlman wget

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值