找回密码
 注-册

QQ登录

只需一步,快速开始

查看: 1523|回复: 0

[PHP] 如何使用PHP服务端代理抓取网页内容<转>

[复制链接]
Leya 发表于 2010-2-11 06:16:30 | 显示全部楼层 |阅读模式
最近公司暂时断开外网,只开放公司自己所有的站点允许访问,说实在的,做WEB开发的断网,真是让人哭笑不得......

由于需要查找资料,只好简单写了一个PHP的服务端代理页面来用一下!

简单框架页面:
  1. style type="text/css">
  2. *{margin:0;padding:0;}
  3. html,body{overflow:hidden;}
  4. td{padding:0;vertical-align:top;}
  5. </style>
  6. <table width="100%" height="100%" cellspacing="0" cellpadding="0" border="0">
  7. <tr>
  8. <td style="height:25px;background:#d4d0c8;padding:5px 10px;">
  9. <form method="post" action="action_get.php" target="actioncontent" style="margin:0;padding:0;">
  10. <input type="text" id="targeturl" name="targeturl" style="width:100%;border:1px inset;margin:0;" />
  11. </form>
  12. </td>
  13. </tr>
  14. <tr>
  15. <td>
  16. <iframe name="actioncontent" style="width:100%;height:100%;"></iframe>
  17. </td>
  18. </tr>
  19. </table>
  20. <script type="text/javascript">
  21. window.onload = function(){
  22. document.getElementById('targeturl').focus();
  23. };
  24. </script>
复制代码
PHP代理页面:
  1. <?php
  2. //使用Snoopy的抓页功能
  3. include "Snoopy.class.php";
  4. //目标URL
  5. $url = $_REQUEST['targeturl'];
  6. //将所有传递过来的参数列出来
  7. $par = array();
  8. $GetPost = array_merge($_POST,$_GET);
  9. foreach($GetPost As $Key=>$Value){
  10. if($Key!='targeturl'){
  11.   $Value = str_replace("%25","%",$Value);
  12.   array_push($par,($Key . "=" . $Value));
  13. }
  14. }
  15. //判断目标URL是否带有?(即是否带有参数)
  16. $cc = strpos($url,"?") ? "&" : "?";
  17. //重组URL
  18. $geturl = !$par ? $url : $url.$cc.implode("&",$par);
  19. //抓取重组后的URL页面内容
  20. $snoopy = new Snoopy;
  21. $snoopy->fetch($geturl);
  22. //替换目标内容中脚本里有可能替换父窗口地址的代码
  23. $org = str_replace("top.location","top.title",$snoopy->results);
  24. //尝试转换目标内容编码到UTF-8
  25. $opt = iconv("gbk","utf-8",$org);
  26. //判断目标内容编码为GBK或UTF-8
  27. $ec = strlen($opt)?"gbk":"utf-8";

  28. ?>
  29. <script type="text/javascript">
  30. //封闭运行,避免与后面内容中脚本混乱
  31. (function(){
  32. 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('');};
  33. 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;};
  34. 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;}};
  35. //回显目标URL到父窗口文本框
  36. var dtu = top.document.getElementById('targeturl');
  37. if(dtu){dtu.value = '<?php echo $geturl;?>';}
  38. //目标URL及domain
  39. var sref = '<?php echo $url;?>';
  40. var sdomain = sref.match(/^http:\/\/[^\/]*/i)[0];
  41. //页面加载后执行下面的过程
  42. var process = function(){
  43. //抓取页面中所有链接
  44. var dlink = document.getElementsByTagName('a'),la = dlink.length;
  45. //抓取页面中所有表单
  46. var dform = document.getElementsByTagName('form'),lf = dform.length;
  47. //遍历所有链接,替换它们的href地址
  48. for(var i=0;i<la;i++){
  49. var src = dlink[i].href.toString().replace(/^http:\/\/www\.w3cgroup\.com(?:\/geturl)?/i,sdomain);
  50. var oargs = getArgs(src),ahref = [];
  51. //UTF-8编码参数值
  52. for(var d in oargs){
  53.   if(!d||d=='filename'||!oargs[d]){continue;}
  54.   ahref.push(d+'='+encodeURIComponent(easyUTF8(oargs[d])));
  55. }
  56. var ghref = ahref.length?oargs.filename+'?'+ahref.join('&'):oargs.filename;
  57. //重设链接地址
  58. dlink[i].href = 'http://www.w3cgroup.com/geturl/action_get.php?targeturl='+ghref;
  59. }
  60. //遍历所有表单,替换它们的action地址
  61. for(i=0;i<lf;i++){
  62. //抓取表单action并处理
  63. var src = dform[i].action.toString().replace(/^http:\/\/www\.w3cgroup\.com(?:\/geturl)?/i,sdomain);
  64. if(!(/^http/.test(src))){src = (/^\/.*$/.test(src))?(sdomain+src):(sdomain+'/'+src);}
  65. //创建一个隐藏域targeturl,值为上面处理的src地址
  66. var dfi = createIPH('targeturl',src);
  67. dform[i].appendChild(dfi);
  68. //创建一个隐藏域ie,值为utf-8,纯属为搜索引擎使用
  69. var dfi2 = createIPH('ie','utf-8');
  70. dform[i].appendChild(dfi2);
  71. //重设表单提交目标窗口
  72. dform[i].target = 'actioncontent';
  73. //重设表单action地址
  74. dform[i].action = 'http://www.w3cgroup.com/geturl/action_get.php';
  75. //重设表单onsubmit事件,用来UTF8编码字段值
  76. dform[i].onsubmit = function(){
  77.   var dlms = this.elements,l = dlms.length-1,pn = '',pt = '',pv = '';
  78.   for(var i=0;i<l;i++){
  79.    pn = dlms[i].name,pt = dlms[i].type,pv = dlms[i].value;
  80.    if(!pn||pn=='targeturl'||pn=='ie'){continue;}
  81.    if(pt=='submit'||pt=='reset'||pt=='button'){
  82.     dlms[i].value = encodeURIComponent(pv);
  83.    }else{
  84.     dlms[i].value = encodeURIComponent(easyUTF8(pv));
  85.    }
  86.   }
  87. };
  88. }
  89. };
  90. //绑定该过程到window.onload
  91. if(document.attachEvent){window.attachEvent('onload',process);}else{window.addEventListener('load',process,false);}
  92. })();
  93. </script>
  94. //脚本放在输出内容前,避免内容中可能出现脚本错误而导致我们要做的事情被废掉
  95. //输出抓到的目标页面内容
  96. <?php echo ($ec=="gbk")?$opt:$org;?>
复制代码
在这个小作品中,我编写了一个重要的JavaScript函数easyUTF8,它可以很方便地在JavaScript脚本中将GBK编码的内容转换为UTF-8编码。

我们还处理了一下表单中添加项目的兼容问题,注意看createIPH函数,在IE中创建的表单项内容,在指定name和value时可能会出现我们不希望的结果,这在DHTML手册中已经有过描述了。

原文地址:http://www.v-ec.com/dh20156/article.asp?id=274
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注-册

本版积分规则

Archiver|手机版|小黑屋|DoDVip ( 桂ICP备14000730号 )

GMT+8, 2024-5-3 15:54 , Processed in 0.049381 second(s), 20 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表