PHP小偷程序的原理與实现及改进

优点:通过PHP小偷我们可以借用别人网站上的信息而不用自己辛苦地去采集

缺点:需要把整页的HTML代码读取到本地,然后通过匹配获取到想要的信息再进行显示,这样大大影响网页的加载速度

改进:通过AJAX异步读取HTML代码,后台进行匹配获取到想要的信息,再显示到前台页面

预备知识:PHP,AJAX,正则表达式

关键字:file_get_contents() fopen() fwrite() eregi()

前三个关键字都是关于PHP文件处理的函数,eregi()是关于正则表达式的函数

PHP小偷原理的实现

一,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(保存好,以备下次使用)

二,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.onload=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>

showNews.php中的

echo('<div id=hei_content>');
include('HackNews.htm');
echo('</div>');

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小偷技术,在采集多个网站的大量信息下,页面的加载速度并不会受多大影响

打赏
微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixin
金额随意 快来“打”我呀~

未经允许不得转载:信言博客 » PHP小偷程序的原理與实现及改进

赞 (0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏