方法一:
<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 \ssrc=(http:\/\/.*?)(\s(.*?) 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></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"</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></code>http://blog.csdn.net/china_skag/article/details/18452883 http://www.jb51.net/article/21738.htm
版权声明:转载请保留文章署名和链接
以上就介绍了PHP抓取网站图片脚本,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号