首页  >  文章  >  后端开发  >  PHP抓取网站图片脚本

PHP抓取网站图片脚本

WBOY
WBOY原创
2016-07-29 09:14:501227浏览

方法一:

<code><span><?php </span>
header(<span>"Content-type:image/jpeg"</span>); 
<span><span>class</span><span>download_image</span>{</span><span><span>function</span><span>read_url</span><span>(<span>$str</span>)</span>    {</span><span>$file</span>=fopen(<span>$str</span>,<span>"r"</span>);
        <span>$result</span> = <span>''</span>; 
        <span>while</span>(!feof(<span>$file</span>)) 
        { 
            <span>$result</span>.=fgets(<span>$file</span>,<span>9999</span>); 
        } 
        fclose(<span>$file</span>); 
        <span>return</span><span>$result</span>; 

    } 
    <span><span>function</span><span>save_img</span><span>(<span>$str</span>)</span>    {</span><span>$result</span>=<span>$this</span>->read_url(<span>$str</span>); 
        <span>$result</span>=str_replace(<span>"\""</span>,<span>""</span>,<span>$result</span>); 
        <span>$result</span>=str_replace(<span>"\'"</span>,<span>""</span>,<span>$result</span>); 

        preg_match_all(<span>'/<img  alt="PHP抓取网站图片脚本" >|>)/i'</span>,<span>$result</span>,<span>$matches</span>); 

        <span>foreach</span>(<span>$matches</span>[<span>1</span>] <span>as</span><span>$value</span>) 
        { 
            <span>echo</span><span>$value</span>.<span>"\n"</span>; 
            <span>$this</span>->GrabImage(<span>$value</span>,<span>$filename</span>=<span>""</span>); 
        } 
    } 
    <span>// $url 是远程图片的完整URL地址,不能为空。 </span><span>// $filename 是可选变量: 如果为空,本地文件名将基于时间和日期 </span><span>// 自动生成. </span><span><span>function</span><span>GrabImage</span><span>(<span>$url</span>,<span>$filename</span>=<span>""</span>)</span> {</span><span>if</span>(<span>$url</span>==<span>""</span>):<span>return</span><span>false</span>;<span>endif</span>; 
        <span>$path</span>=<span>"download/"</span>; <span>//指定存储文件夹 </span><span>//若文件不存在,则创建; </span><span>if</span>(!file_exists(<span>$path</span>)){ 
            mkdir(<span>$path</span>); 
        } 

        <span>if</span>(<span>$filename</span>==<span>""</span>) { 
            <span>$ext</span>=strrchr(<span>$url</span>,<span>"."</span>); 
            <span>if</span>(<span>$ext</span>!=<span>".gif"</span> && <span>$ext</span>!=<span>".jpg"</span>):<span>return</span><span>false</span>;<span>endif</span>; 
            @<span>$filename</span>=<span>$path</span>.date(<span>"YHis"</span>).<span>$ext</span>; 
        } 

        ob_start(); 
        readfile(<span>$url</span>); 
        <span>$img</span> = ob_get_contents(); 
        ob_end_clean(); 
        <span>$size</span> = strlen(<span>$img</span>); 

        <span>$fp2</span>=@fopen(<span>$filename</span>, <span>"a"</span>); 
        fwrite(<span>$fp2</span>,<span>$img</span>); 
        fclose(<span>$fp2</span>); 

        <span>return</span><span>$filename</span>; 
    }
}
<span>$download_img</span>=<span>new</span> download_image();
<span>$download_img</span>->save_img(<span>"http://www.jb51.net"</span>); 
<span>?></span></span></code>

方法一思路比较简单清晰,不过有个BUG,图片没有完全抓取,有时间再检查看!

方法二:

<code><span><span><?php </span><span><span>class</span><span>download_image</span>{</span><span>//抓取图片的保存地址</span><span>public</span><span>$save_path</span>;   
    <span>//抓取图片的大小限制(单位:字节) 只抓比size比这个限制大的图片</span><span>public</span><span>$img_size</span>=<span>0</span>; 
    <span>//定义一个静态数组,用于记录曾经抓取过的的超链接地址,避免重复抓取       </span><span>public</span><span>static</span><span>$a_url_arr</span>=<span>array</span>();

    <span>/**
     *<span> @param</span> String $save_path    抓取图片的保存地址
     *<span> @param</span> Int    $img_size     
     */</span><span>public</span><span><span>function</span><span>__construct</span><span>(<span>$save_path</span>,<span>$img_size</span>)</span>{</span><span>$this</span>->save_path=<span>$save_path</span>;
        <span>$this</span>->img_size=<span>$img_size</span>;
        <span>if</span>(!file_exists(<span>$save_path</span>)){
            mkdir(<span>$save_path</span>,<span>0775</span>);
        }
    }
    <span>/**
     * 递归下载抓取首页及其子页面图片的方法  ( recursive 递归)
     *<span> @param</span>   String  $capture_url  用于抓取图片的网址
     */</span><span>public</span><span><span>function</span><span>recursive_download_images</span><span>(<span>$capture_url</span>)</span>{</span><span>if</span> (!in_array(<span>$capture_url</span>,<span>self</span>::<span>$a_url_arr</span>)){   <span>//没抓取过</span><span>self</span>::<span>$a_url_arr</span>[]=<span>$capture_url</span>;   <span>//计入静态数组</span>
        } <span>else</span> {   <span>//抓取过,直接退出函数</span><span>return</span>;
        }
        <span>$this</span>->download_current_page_images(<span>$capture_url</span>);  <span>//下载当前页面的所有图片</span><span>//用@屏蔽掉因为抓取地址无法读取导致的warning错误</span><span>$content</span>=@file_get_contents(<span>$capture_url</span>); 
        <span>//匹配<strong>a标签</strong>href属性中?之前部分的正则</span><span>$a_pattern</span> = <span>"|<a>]+href=['\" ]?([^ '\"?]+)['\" >]|U"</a></span>;   
        preg_match_all(<span>$a_pattern</span>, <span>$content</span>, <span>$a_out</span>, PREG_SET_ORDER);
        <span>$tmp_arr</span>=<span>array</span>();  <span>//定义一个数组,用于存放当前<strong>循环</strong>下抓取图片的超链接地址</span><span>foreach</span> (<span>$a_out</span><span>as</span><span>$k</span> => <span>$v</span>) {
            <span>/**
             * 去除超链接中的 空'','#','/'和重复值  
             * 1: 超链接地址的值 不能等于当前抓取页面的url, 否则会陷入死<strong>循环</strong>
             * 2: 超链接为''或'#','/'也是本页面,这样也会陷入死<strong>循环</strong>,  
             * 3: 有时一个超连接地址在一个网页中会重复出现多次,如果不去除,会对一个子页面进行重复下载)
             */</span><span>if</span> ( <span>$v</span>[<span>1</span>] && !in_array(<span>$v</span>[<span>1</span>],<span>self</span>::<span>$a_url_arr</span>) &&!in_array(<span>$v</span>[<span>1</span>],<span>array</span>(<span>'#'</span>,<span>'/'</span>,<span>$capture_url</span>) ) ) { 
                <span>$tmp_arr</span>[]=<span>$v</span>[<span>1</span>];
            }
        }
        <span>foreach</span> (<span>$tmp_arr</span><span>as</span><span>$k</span> => <span>$v</span>){ 
            <span>//超链接路径地址</span><span>if</span> ( strpos(<span>$v</span>, <span>'http://'</span>)!==<span>false</span> ){ <span>//如果url包含http://,可以直接访问</span><span>$a_url</span> = <span>$v</span>;
            }<span>else</span>{   <span>//否则证明是相对地址, 需要重新拼凑超链接的访问地址</span><span>$domain_url</span> = substr(<span>$capture_url</span>, <span>0</span>,strpos(<span>$capture_url</span>, <span>'/'</span>,<span>8</span>)+<span>1</span>);
                <span>$a_url</span>=<span>$domain_url</span>.<span>$v</span>;
            }
            <span>$this</span>->recursive_download_images(<span>$a_url</span>);
        }
    }
    <span>/**
     * 下载当前网页下的所有图片 
     *<span> @param</span>   String  $capture_url  用于抓取图片的网页地址
     *<span> @return</span>  Array   当前网页上所有图片img标签url地址的一个数组
     */</span><span>public</span><span><span>function</span><span>download_current_page_images</span><span>(<span>$capture_url</span>)</span>{</span><span>$content</span>=@file_get_contents(<span>$capture_url</span>);   <span>//屏蔽warning错误</span><span>//匹配img标签src属性中?之前部分的正则</span><span>$img_pattern</span> = <span>"|<img  alt="PHP抓取网站图片脚本" >]+src=['\" ]?([^ '\"?]+)['\" >]|U"</span>;   
        preg_match_all(<span>$img_pattern</span>, <span>$content</span>, <span>$img_out</span>, PREG_SET_ORDER);
        <span>$photo_num</span> = count(<span>$img_out</span>);
        <span>//匹配到的图片数量</span><span>echo</span><span>$capture_url</span> . <span>"共找到 "</span> . <span>$photo_num</span> . <span>" 张图片\n"</span>;
        <span>foreach</span> (<span>$img_out</span><span>as</span><span>$k</span> => <span>$v</span>){
            <span>$this</span>->save_one_img(<span>$capture_url</span>,<span>$v</span>[<span>1</span>]);
        }
    }

    <span>/**
     * 保存单个图片的方法 
     *<span> @param</span> String $capture_url   用于抓取图片的网页地址
     *<span> @param</span> String $img_url       需要保存的图片的url
     */</span><span>public</span><span><span>function</span><span>save_one_img</span><span>(<span>$capture_url</span>,<span>$img_url</span>)</span>{</span><span>//图片路径地址</span><span>if</span> ( strpos(<span>$img_url</span>, <span>'http://'</span>)!==<span>false</span> ){ 
            <span>// $img_url = $img_url;</span>
        }<span>else</span>{   
            <span>$domain_url</span> = substr(<span>$capture_url</span>, <span>0</span>,strpos(<span>$capture_url</span>, <span>'/'</span>,<span>8</span>)+<span>1</span>);
            <span>$img_url</span>=<span>$domain_url</span>.<span>$img_url</span>;
        }           
        <span>$pathinfo</span> = pathinfo(<span>$img_url</span>);    <span>//获取图片路径信息        </span><span>$pic_name</span>=<span>$pathinfo</span>[<span>'basename'</span>];   <span>//获取图片的名字</span><span>if</span> (file_exists(<span>$this</span>->save_path.<span>$pic_name</span>)){  <span>//如果图片存在,证明已经被抓取过,退出函数</span><span>echo</span><span>$img_url</span>.<span>'该图片已经抓取过!'</span>.<span>"\n"</span>; 
            <span>return</span>;
        }                
        <span>//将图片内容读入一个字符串</span><span>$img_data</span> = @file_get_contents(<span>$img_url</span>);   <span>//屏蔽掉因为图片地址无法读取导致的warning错误</span><span>if</span> ( strlen(<span>$img_data</span>) > <span>$this</span>->img_size ){   <span>//下载size比限制大的图片</span><span>$img_size</span> = file_put_contents(<span>$this</span>->save_path . <span>$pic_name</span>, <span>$img_data</span>);
            <span>if</span> (<span>$img_size</span>){
                <span>echo</span><span>$img_url</span>.<span>'图片保存成功!'</span>.<span>"\n"</span>;
            } <span>else</span> {
                <span>echo</span><span>$img_url</span>.<span>'图片保存失败!'</span>.<span>"\n"</span>;
            }
        } <span>else</span> {
            <span>echo</span><span>$img_url</span>.<span>'图片读取失败!'</span>.<span>"\n"</span>;
        } 
    } 
}
set_time_limit(<span>120</span>);     <span>//设置脚本的最大执行时间  根据情况设置 </span><span>$download_img</span>=<span>new</span> download_image(<span>'imgages/'</span>,<span>0</span>);   <span>//实例化下载图片<strong>对象</strong></span><span>//$download_img->recursive_download_images('http://www.oschina.net/');      //递归抓取图片方法</span><span>//$download_img->download_current_page_images($_POST['capture_url']);     //只抓取当前页面图片方法</span><span>$download_img</span>->download_current_page_images(<span>'http://www.jb51.net'</span>);     <span>//只抓取当前页面图片方法</span><span>?></span></span></span></code>

http://blog.csdn.net/china_skag/article/details/18452883
http://www.jb51.net/article/21738.htm

版权声明:转载请保留文章署名和链接

以上就介绍了PHP抓取网站图片脚本,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn