怎樣使用PHP服務端代理抓取網頁內容_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:揭秘用jquery建立類Twitter站點的方法
      Twitter是世界上最流行的互聯網服務,它為用戶提供微博客服務,界面簡潔美觀。本文中,我們將使用jqueyr建立一個類twitter站點。你將學習jquery一些的技巧,以及如何一起使用PHP和mysql。你會喜歡的。 作者:jigoufei Guofei Ji是中國青島的一位軟件工程師,

      最近公司暫時斷開外網,只開放公司自己所有的站點允許訪問,說實在的,做WEB開發的斷網,真是讓人哭笑不得......

      由于需要查找資料,只好簡單寫了一個PHP的服務端代理頁面來用一下!

      簡單框架頁面:

      以下為引用的內容:

      <style type="text/css">
      *{margin:0;padding:0;}
      html,body{overflow:hidden;}
      td{padding:0;vertical-align:top;}
      </style>
      <table width="100%" height="100%" cellspacing="0" cellpadding="0" border="0">
      <tr>
      <td style="height:25px;background:#d4d0c8;padding:5px 10px;">
      <form method="post" action="action_get.php" target="actioncontent" style="margin:0;padding:0;">
      <input type="text" id="targeturl" name="targeturl" style="width:100%;border:1px inset;margin:0;" />
      </form>
      </td>
      </tr>
      <tr>
      <td>
      <iframe name="actioncontent" style="width:100%;height:100%;"></iframe>
      </td>
      </tr>
      </table>
      <script type="text/javascript">
      window.onload = function(){
       document.getElementById('targeturl').focus();
      };
      </script>

      PHP代理頁面:

      以下為引用的內容:

      <?php
      //使用Snoopy的抓頁功能
      include "Snoopy.class.php";
      //目標URL
      $url = $_REQUEST['targeturl'];
      //將所有傳遞過來的參數列出來
      $par = array();
      $GetPost = array_merge($_POST,$_GET);
      foreach($GetPost As $Key=>$Value){
       if($Key!='targeturl'){
        $Value = str_replace("%25","%",$Value);
        array_push($par,($Key . "=" . $Value));
       }
      }
      //判斷目標URL是否帶有?(即是否帶有參數)
      $cc = strpos($url,"?") ? "&" : "?";
      //重組URL
      $geturl = !$par ? $url : $url.$cc.implode("&",$par);
      //抓取重組后的URL頁面內容
      $snoopy = new Snoopy;
      $snoopy->fetch($geturl);
      //替換目標內容中腳本里有可能替換父窗口地址的代碼
      $org = str_replace("top.location","top.title",$snoopy->results);
      //嘗試轉換目標內容編碼到UTF-8
      $opt = iconv("gbk","utf-8",$org);
      //判斷目標內容編碼為GBK或UTF-8
      $ec = strlen($opt)?"gbk":"utf-8";

      ?>
      <script type="text/javascript">
      //封閉運行,避免與后面內容中腳本混亂
      (function(){
      var easyUTF8 = function(gbk){if(!gbk){return '';}var utf8 = [];for(var i=0;i<gbk.length;i++){var s_str = gbk.charAt(i);if(!(/^%u/i.test(escape(s_str)))){utf8.push(s_str);continue;}var s_char = gbk.charCodeAt(i);var b_char = s_char.toString(2).split('');var c_char = (b_char.length==15)?[0].concat(b_char):b_char;var a_b =[];a_b[0] = '1110'+c_char.splice(0,4).join('');a_b[1] = '10'+c_char.splice(0,6).join('');a_b[2] = '10'+c_char.splice(0,6).join('');for(var n=0;n<a_b.length;n++){utf8.push('%'+parseInt(a_b[n],2).toString(16).toUpperCase());}}return utf8.join('');};
      var getArgs = function(surl){var sarg = surl.split('?'),rv={};rv.filename=sarg[0];if(!sarg[1]){return rv;}var aarg=sarg[1].split('&'),atmp=[];for(var i=0;i<aarg.length;i++){atmp=aarg[i].split('=');rv[atmp[0]]=atmp[1];}return rv;};
      var createIPH = function(name,value){if(!name){return;}if(/msie/i.test(navigator.appVersion)){return document.createElement('<input type="hidden" name="'+name+'" value="'+value+'"/>');}else{var dfi = document.createElement('input');dfi.type = 'hidden';dfi.name = name;dfi.value = value;return dfi;}};
      //回顯目標URL到父窗口文本框
      var dtu = top.document.getElementById('targeturl');
      if(dtu){dtu.value = '<?php echo $geturl;?>';}
      //目標URL及domain
      var sref = '<?php echo $url;?>';
      var sdomain = sref.match(/^http:\/\/[^\/]*/i)[0];
      //頁面加載后執行下面的過程
      var process = function(){
       //抓取頁面中所有鏈接
       var dlink = document.getElementsByTagName('a'),la = dlink.length;
       //抓取頁面中所有表單
       var dform = document.getElementsByTagName('form'),lf = dform.length;
       //遍歷所有鏈接,替換它們的href地址
       for(var i=0;i<la;i++){
       var src = dlink[i].href.toString().replace(/^http:\/\/www\.w3cgroup\.com(?:\/geturl)?/i,sdomain);
       var oargs = getArgs(src),ahref = [];
       //UTF-8編碼參數值
       for(var d in oargs){
        if(!d||d=='filename'||!oargs[d]){continue;}
        ahref.push(d+'='+encodeURIComponent(easyUTF8(oargs[d])));
       }
       var ghref = ahref.length?oargs.filename+'?'+ahref.join('&'):oargs.filename;
       //重設鏈接地址
       dlink[i].+ghref;
       }
       //遍歷所有表單,替換它們的action地址
       for(i=0;i<lf;i++){
       //抓取表單action并處理
       var src = dform[i].action.toString().replace(/^http:\/\/www\.w3cgroup\.com(?:\/geturl)?/i,sdomain);
       if(!(/^http/.test(src))){src = (/^\/.*$/.test(src))?(sdomain+src):(sdomain+'/'+src);}
       //創建一個隱藏域targeturl,值為上面處理的src地址
       var dfi = createIPH('targeturl',src);
       dform[i].appendChild(dfi);
       //創建一個隱藏域ie,值為utf-8,純屬為搜索引擎使用
       var dfi2 = createIPH('ie','utf-8');
       dform[i].appendChild(dfi2);
       //重設表單提交目標窗口
       dform[i].target = 'actioncontent';
       //重設表單action地址
       dform[i].action = 'http://www.w3cgroup.com/geturl/action_get.php';
       //重設表單onsubmit事件,用來UTF8編碼字段值
       dform[i].onsubmit = function(){
        var dlms = this.elements,l = dlms.length-1,pn = '',pt = '',pv = '';
        for(var i=0;i<l;i++){
         pn = dlms[i].name,pt = dlms[i].type,pv = dlms[i].value;
         if(!pn||pn=='targeturl'||pn=='ie'){continue;}
         if(pt=='submit'||pt=='reset'||pt=='button'){
          dlms[i].value = encodeURIComponent(pv);
         }else{
          dlms[i].value = encodeURIComponent(easyUTF8(pv));
         }
        }
       };
       }
      };
      //綁定該過程到window.onload
      if(document.attachEvent){window.attachEvent('onload',process);}else{window.addEventListener('load',process,false);}
      })();
      </script>
      //腳本放在輸出內容前,避免內容中可能出現腳本錯誤而導致我們要做的事情被廢掉
      //輸出抓到的目標頁面內容
      <?php echo ($ec=="gbk")?$opt:$org;?>

      在這個小作品中,我編寫了一個重要的JavaScript函數easyUTF8,它可以很方便地在JavaScript腳本中將GBK編碼的內容轉換為UTF-8編碼。

      我們還處理了一下表單中添加項目的兼容問題,注意看createIPH函數,在IE中創建的表單項內容,在指定name和value時可能會出現我們不希望的結果,這在DHTML手冊中已經有過描述了。

       

      分享:淺談基于UML的城軌列車超速防護系統建模
      摘要:分析I-Logix公司的Rhapsody軟件的主要特性在Rhapsody開發環境下對北京地鐵1號線的ATP系統車載設備進行UML建模,并介紹系統級調試功能。 統一建模語言UML(UnifiedModelingLanguage)是迄今為止最好的面向對象的統一建模語言,它取代了以往各種面向對象表示

      來源:模板無憂//所屬分類:PHP教程/更新時間:2009-11-18
      相關PHP教程