首页 > 互联网络 > bash搭配php批量下载图片

bash搭配php批量下载图片

看到一个图片网站,很多漂亮图片,所以想要保存下来.
但是图片太多了.一个一个右键保存的话,不知道要保存到什么时候.
批量保存的话,Linx中好像还没有像迅雷那样的保存本网页所有图片的选项,况且,有好多好多的网页都需要保存.一个一个网页打开的话也太慢了.
所以就想找个方便的方法.于是就有了这篇文章.
使用bash和php配合一下
具体分工:
php负责获取目标网页的源代码,然后提取出图片的地址,输出为地址列表文件,然后用bash写成sh脚本,在脚本中使用wget工具批量下载,在下载的过程中重命名文件.
为什么要写成sh脚本呢?因为直接使用wget下载文件的过程中,虽然可以使用-O参数重命名文件,但是那是对下载单个文件而言的.
当使用-i参数从一个下载地址列表中依次读取下载地址来下载的时候无法重命名.也即-i 和-O参数无法同时使用.
解决办法
首先是php部分获取源代码,然后提取图片地址

<?php
$str =file_get_contents('http://127.0.0.1/?p=20');
$list = array();	//这里存放结果map
$c1 = preg_match_all('/<img\s.*?>/', $str, $m1);	//先取出所有img标签文本
for($i=0; $i<$c1; $i++)
{	//对所有的img标签进行取属性
	$c2 = preg_match_all('/(\w+)\s*=\s*(?:(?:(["\'])(.*?)(?=\2))|([^\/\s]*))/', $m1[0][$i], $m2);	//匹配出所有的属性
	for($j=0; $j<$c2; $j++)
	{	//将匹配完的结果进行结构重组
		$list[$i][$m2[1][$j]] = !empty($m2[4][$j]) ? $m2[4][$j] : $m2[3][$j];
	}
}
$fp=fopen("url.txt","a");//打开文件,指针指向文件尾部进行追加
foreach($list as $list=>$sum)
{
	if(preg_match('/http:\/\/127\.0\.0\.1.*?/i',$sum['src']))//对结果进行筛选,筛选条件不唯一
	{	$out= $sum['src']."\n";
		echo $out."<br />";
		fwrite($fp,$out);//将结果追加到文件尾部
	}
}
fclose($fp);//关闭写入文件
echo "write OK";
?>

此处的img标签匹配条件不唯一.看个人的需求了.也不一定要把所有的img都匹配出来.可以在匹配img标签之前就进行筛选.
我这样做是为了方便吧,省事.呵呵
我是先把 img标签全部匹配,然后再用preg_match函数把想要的地址留下来. 再说一遍,方法不唯一
这样得到一个url.txt文件,里面是下载地址列表,每行一个.
然后是bash登场

#!/bin/bash
count=0
while read line
do
wget -O $count.jpg $line
((count+=1))
#使用let count=$count+1 也正确
#使用((count++)) 也正确
done<$1

将以上代码保存为img.sh
增加可执行权限
chmod +x img.sh
然后就可以执行了
./img.sh url.txt
这样 就间接的完成了-i 和-O参数同时使用,重命名是按照下载顺序,保存为 1.jpg 2.jpg 3.jpg ....

上面是在一个网页中进行保存,想要保存所有的图片话,就先获取归档页面中的地址列表,然后顺序访问地址数组,每访问一个地址,用上面说到的方法,提取此网页中的图片地址,最后将所有的图片地址写入到一个文本文件,用sh脚本一次性批量下载
我就是这么干的,一次下载了1000+张图片

<?php //获取归档目录中的所有href
$str =file_get_contents('http://127.0.0.1/?page_id=29'); //此处地址是我本地wp环境的归档目录页面
$list = array();	//这里存放结果map
$c1 = preg_match_all('/<a\s.*?>/', $str, $m1);	//先取出所有a标签文本
for($i=0; $i<$c1; $i++)
{	//对所有的a标签进行取属性
	$c2 = preg_match_all('/(\w+)\s*=\s*(?:(?:(["\'])(.*?)(?=\2))|([^\/\s]*))/', $m1[0][$i], $m2);	//匹配出所有的属性
	for($j=0; $j<$c2; $j++)
	{	//将匹配完的结果进行结构重组
		$list[$i][$m2[1][$j]] = !empty($m2[4][$j]) ? $m2[4][$j] : $m2[3][$j];
	}
}
foreach($list as $list=>$sum)
{
	if(preg_match('/http:\/\/127\.0\.0\.1\/\?p=\d+$/i',$sum['href']))//对结果进行筛选,筛选条件不唯一
	{	$out= $sum['href']."<br />";
		echo $out;
	}
}
/*
输出结果为满足

http://127.0.0.1/?p=*

http://127.0.0.1/?p=*

的地址列表*/
?>
  1. phoetry 八 15th, 2011 @ 17:20 | #11

    用js把所有符合条件的图片的url提出来并新窗口打开, 然后下载工具下载全部链接 :shut:

  2.  Admin
    Lwent 八 15th, 2011 @ 17:53 | #12

    @phoetry
    就是一时没找到能够下载全部链接的下载工具才想的这个法....
    我对下载工具了解很少...

  3. 阿文 八 15th, 2011 @ 22:24 | #13

    这个不太懂了··支持

  4. Sucy 八 16th, 2011 @ 11:36 | #14

    看不懂,顶一顶

  5. 淘靓吧 八 16th, 2011 @ 17:34 | #15

    会编程就是好啊。。。

  6. 代码回音 八 16th, 2011 @ 18:39 | #16

    firefox里面媒体就能批量保存啊

  7. 郎中中 八 21st, 2011 @ 13:21 | #17

    @代码回音
    又学了一招~

  8. 郎中中 八 21st, 2011 @ 13:21 | #18

    方法收了!

评论提交中, 请稍候...
评论分页 1 2

留言

0
NOTICE: You should type some Chinese word (like “你好”) in your comment to pass the spam-check, thanks for your patience!
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks

无觅相关文章插件,快速提升流量