您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> php编程 >> 正文

PHP+Ajax远程图片抓取器下载的例子

作者:佚名    责任编辑:admin    更新时间:2022-06-22

   先看效果

PHP+Ajax远程图片抓取器下载的例子 三联

  实现原理

  发送请求 :将输入的目标网址及保存路径名称采用AJAX异步的方式发送到image.info.php文件,该文件中包含有一个ImageCatch类,注意:因为有一个是指定目标图片抓取,一个是只要指定一个网址,如http://www.111cn.net形式,所以还要有一个参数用来判断是指定目标抓取还是指定网站抓取。

  接收请求 :接收发送过来的两个参数,目标网址及保存路径,实例化ImageCatch类,将地址及保存路径传进去,用file_get_contents函数将目标地址的内容读取赋值给一个变量$content。

  先说指定图片抓取的实现 :指定图片抓取的方法实现比较简单,直接用file_get_contents函数将图片读取到,再用file_put_contents写入到一个文件保存起来就可以了。

  指定网址抓取图片的实现

  方法跟指定图片地址抓取就有点不一样了,因为采用的是jquery+ajax无刷新模式抓取,所以,请求要一次一次发,先说第一次发什么请求,很显然,第一次发的请求内容是获取目标网址的所有图片地址及图片总数,那要怎样获取目标网址的所有图片地址呢?思路跟上面的一样,但方法不同;

  第一步:用file_get_contents函数读取目标网址赋值给一个content变量。

  第二步:用正则匹配所有img标签里的src属性,并保存在一个数组,这样网页的图片地址就已经拿到了

  第三步:用正则匹配所有样式表文件link标签的href属性,并保存在一个数组$arr1

  第四步:还是用file_get_contents函数读取获取的样式表文件,再用正则去匹配到css样式里的url背景图片地址,并保存在一个数组$arr2,这样css样式的图片又拿到了

  第五步:将$arr1和$arr2用array_merge函数进行合并成$arr,再用一个数组$arr3(‘total’=>count($arr))得出图片总数并追加到数组$arr里面去,这样图片地址和总数都拿到了

  第六步:用json_encode编译一个返回json数据 第七步:接收返回回来的json数据,将数据都存入一个数组,判断是否数组为空,不为空,则用函数递归的方法调用一个函数,每调用一次,在返回结果后就将该数组的第一个元素去掉,再判断数组是否为空,不为空,则继续发送抓取请求,直到数组为空,全部图片就已经都抓取完毕。

  好了现在看例子

  index.php

 代码如下   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP远程图片抓取</title>
<style>
body { margin:0; padding:0; }
#content { width:90%; height:auto; margin:0 auto; margin-top:20px; font-size:12px; color:#333; }
#content .h1 { width:100%; line-height:30px; text-align:left; }
#content .h2 { width:100%; line-height:30px; text-align:left; }
#content .Schedule { width:auto; height:12px; margin:15px 0px; display:none; background:url() }
#content ul { width:100%; height:auto; margin-top:10px; }
#content ul li { height:24px; line-height:24px;}
#content font { color:#f00; }
</style>
<script type="text/javascript" src="js/jquery.js"></script>
<script>
$(document).ready(function() {
    var TargetUrl;
 var Save;
 function error(info) {
  $('#content .h2 font').text(info);
 }
 function statusInfo(info) {
  $('#content ul').append('<li>'+info+'</li>');
 }
 //禁用按钮
 function start_d() {
  $('#Single,#more').attr('disabled','disabled');
 }
 //解放按钮
 function start_s() {
  $('#Single,#more').removeProp('disabled');
 }
 //进度跳转
 function href() {
  location.href='#bottom';
 }
 //单个图片抓取
 $('#content .h1 #Single').click(function() {
  TargetUrl=$('#content .h2 .TargetUrl').val();
  Save=$('#content .h2 .Save').val();
  if (TargetUrl=='') {
   error(' * 请填写目标网址');
   return;
  }
  if (Save=='') {
   error(' * 请填写保存目录');
   return;
  }
  var zurl=new Array(TargetUrl);
  start_d();
  Crawl(zurl,Save);
 });
 function Crawl(zurl,Save) {
  start_d();
  $('#content .Schedule').show();
  if (zurl.length>0) {
   var curl=zurl[0];
  $.ajax({
   url:'image.info.php?Single=Single',
   dataType:'json',
   type:'POST',
   data:'TargetUrl='+curl+'&Save='+Save,
   success: function(data) {
    if (data.status=='ok') {
     statusInfo('远程图片 <font>'+curl+'</font> 抓取成功 已保存在 <font>'+data.FileSave+'</font> 文件大小:<font>'+data.FileSize+'</font>');
     zurl.shift();  //删除第一个数组元素并返回
     Crawl(zurl,Save); //使用函数递归
     href();
    }else {
     zurl.shift();    //删除第一个数组元素并返回
     Crawl(zurl,Save); //使用函数递归
     statusInfo(data.status);  //显示失败信息
     $('#content .Schedule').hide(); //隐藏LOADING图片
     start_s();   //按钮启用
     href();
    }
   }
  });
  }else {
   $('#content .Schedule').hide();
   statusInfo('图片抓取完毕');
   start_s();
   href();
  }
 }
 //多个图片抓取
 $('#content .h1 #more').click(function() {
  TargetUrl=$('#content .h2 .TargetUrl').val();
  Save=$('#content .h2 .Save').val();
  if (TargetUrl=='') {
   error(' * 请填写目标网址');
   return;
  }