优点:通过PHP小偷,我们可以借用别人网站上的信息而不用自己辛苦地去采集。
缺点:需要把整页的HTML代码读取到本地,然后通过匹配获取到想要的信息再进行显示,这样大大影响网页的加载速度。
改进:通过AJAX异步读取HTML代码,后台进行匹配获取到想要的信息,再显示到前台页面。
预备知识:PHP、AJAX、正则表达式。
关键字:file_get_contents()、fopen()、fwrite()、eregi(),前三个关键字都是关于PHP文件处理的函数,eregi()是关于正则表达式的函数。
一、PHP小偷原理的实现:
1、file_get_contents()、fopen()、fwrite()的应用
咱们用华夏黑客牛刀小试吧,把主页的全部信息获取过来。
建立一个PHP文件:
<?php $url='http://www.77169.com'; //file_get_contents()函数获取网页的html文档 $file=file_get_contents($url); //建立一个新文件ImitationIndex.htm $newfile=fopen('ImitationIndex.htm','w'); //把内容读取进去 fwrite($newfile,$file); //关闭打开的文件 fclose($newfile); ?> |
ImitationIndex.htm获取主页全部的HTML(保存好,以备下次使用)。
2、eregi()函数的应用
通过eregi()获取里的内容:
<?php $url='http://www.77169.com'; //file_get_contents()函数获取网页的html文档 $file=file_get_contents($url); //通过eregi()匹配获取想要的信息 eregi('<title>(.*)</title>',$file,$rg); //建立一个新文件 $newfile=fopen('title.htm','w'); //把内容读取进去 fwrite($newfile,$rg[1]); ?> |
打开title.htm可以看到已经获取了<title></title>之间的内容
从上面的两个例子,已经知道PHP小偷的实现原理,从中也知道它的不足之处,但通过AJAX可以完善它,使它可以用于实践项目中。
二、PHP小偷技术的实用和改进:
目的:获取华夏黑客的最新资讯,并实时更新查看示例。
实际中可能只用到三个页面:showNews.php、Update.php、HackNews.htm,但为了能看到实时更新的效果,这里用到了模拟主页的页面ImitationIndex.htm。
showNews.php:
<style type="text/css"> body{background:#c60;} a{color:#444;font:12px Courier New;padding:8px;} a:hover{color:#f00} #hei_content{width:400px;background:#ccc;border:2px solid #000;border-bottom:5px solid #000;} </style> <?php echo('<div id="hei_content">'); include('HackNews.htm'); echo('</div>'); ?> <script type="text/javascript"> window.οnlοad=UpdateNews; function GetXmlHttp() { var xmlhttp; try { //IE7.0 ect xmlhttp=new ActiveXObject("Msxml2.XMLHTTP"); } catch(a) { try { //ie6.0 ect xmlhttp=new ActiveXObject("Mscrosoft.XMLHTTP"); } catch(b) { //非IE xmlhttp=new XMLHttpRequest(); } } return xmlhttp; } function StateChange() { if(xmlhttp.readyState==4&&xmlhttp.status==200) { document.getElementById("hei_content").innerHTML=xmlhttp.responseText; } } function UpdateNews() { xmlhttp=GetXmlHttp(); xmlhttp.onreadystatechange=StateChange; var url='Update.php'; url=url+"?sid="+Math.random(); xmlhttp.open("GET",url,true); xmlhttp.send(null); } </script> |
HackNews.htm是已经缓存的文件,这样不用加载主页上的整个HTML再显示,这个工作留给AJAX:
document.getElementById("hei_content").innerHTML=xmlhttp.responseText |
xmlhttp.responseText就是加载更新后的内容。
Update.php:
<?php $url='ImitationIndex.htm'; //file_get_contents()函数获取网页的html文档 $file=file_get_contents($url); //$regx为正则表达式的内容,用于匹配获取想要的信息 $regx='<td background=http://hack.77169.com/UploadFiles_8057/200902/20090220100422648.gif colSpan=3 height=100> (.*)</td> </tr> </table> </td> </tr> <tr> <td colSpan=3><IMG height=8 src=/"http://hack.77169.com/UploadFiles_8057/200902/20090220100422568.gif'; //eregi()获取匹配到的内容,赋值给数组变量$rg; eregi($regx,$file,$rg); //建立一个新文件HackNews.htm $newfile=fopen('HackNews.htm','w'); //把内容读取进去 fwrite($newfile,$rg[1]); fclose($newfile); //用iconv编码转换后,输出匹配的HTML内容 $rg[1]=iconv('gb2312','utf-8',$rg[1]); echo($rg[1]); ?> |
Update.php是异步更新的后台页面,“$newfile=fopen('HackNews.htm','w');”和“fwrite($newfile,$rg[1]);”把更新的内容重新保存在HackNews.htm中,下次在index.php中include时就直接调用这个页面,“$url='ImitationIndex.htm'”在实际应用中应该是“$url='http://www.77169.com'”,但为了便于调试,建立一个ImitationIndex.htm模拟页面,如果对ImitationIndex.htm页面中最新资讯中的内容改改,就可以看到实时更新效果。
总结:通过AJAX改进的PHP小偷技术,在采集多个网站的大量信息下,页面的加载速度并不会受多大影响。