shell 爬取图片下载到本地

时间:2022-11-12 10:31:11

#!/bin/bash #ddmm 2018/07/18 #if [ -z $string ] 如果string 为空 #-z STRING the length of STRING is zero read -p "请输入要爬取的页面数(直接回车,默认为10):" page_num if [ -z $page_num ];then page_num=10 fi read -p "请输入要保存的文件夹名称(直接回车,默认为img):" save_path_name if [ -z $save_path_name ];then save_path_name="img" fi for i in `seq 1 $page_num` do #循环N次,将需要下载的img的url保存到imgurl.txt echo "当前处理第$i个url" #curl https://www.dbmeinv.com/?pager_offset=${i} , curl抓取网页内容 #grep -Eo '<img[^>]*src="[^"]*[^"]*"[^>]*>' #grep -E表示用扩展正则表达式 -O表示只输出匹配到的部分 #正则解释 linux 的正则不像js,php,java等,个人用的不是很习惯,所以写的也很烂 #<img[^>]*src="[^"]*[^"]*"[^>]*> 匹配一个 img标签; #[^>]表示匹配除了>以外的字符,*表示0个或多个,so,[^"]*也是同理 #grep -Eo 'src="[^"]*"' 将img标签的src="xxx"部分提取了出来 #sed 's/src="//g' ,s代表替换指定字符,第一个/后面是被替换的字符src=",第二个/后面是替换为的字符(这里替换为空),/g代表全局 #sed 's/"//g' ,与上面同理,将最后一个"去掉 #>> imgurl.txt 将内容拼接到imgurl.txt文件中 curl https://www.dbmeinv.com/?pager_offset=${i} | grep -Eo '<img[^>]*src="[^"]*[^"]*"[^>]*>' | grep -Eo 'src="[^"]*"' | sed 's/src="//g' | sed 's/"//g' >> imgurl.txt done #当前目录下的img文件夹不存在,则新建文件夹 if [ ! -d "./$save_path_name" ]; then mkdir "./$save_path_name" fi #计数 file_count=0; #一行一行遍历刚刚保存url的imgurl.txt文件 #sort imgurl.txt | uniq 代表去除重复行 for line in `sort imgurl.txt | uniq` do #%s 从1970年1月1日00:00:00到目前经历的秒数 ,%N当前时间的纳秒数据 , $(date +%s%N)即秒数 + 纳秒,保证文件名唯一 #curl -o 表示把输出写到该文件中,即指定文件名并写到文件 file_name=$(date +%s%N)".jpg" file_count=`expr $file_count + 1` echo "当前下载第$file_count个图片" curl -o ./$save_path_name/$file_name $line done

 

原理就是:用curl先将图片的img url保存到.txt中,然后再逐个下载,注释写的很详细了,就不累赘讲了