欢迎来到天天文库
浏览记录
ID:34783836
大小:72.68 KB
页数:6页
时间:2019-03-10
《用ajax和php编写简单的蜘蛛程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、用AJAX和PHP编写简单的蜘蛛程序02/21/2011JAMESSHIH发表回复蜘蛛程序可以从网站上自动提取资料,从而极大地节省人力,所以现在蜘蛛程序现在用得非常多。不过一般的蜘蛛程序由于计算量比较大,通常用C#加上HTML分析库来做。而对于简单的任务,例如从成百上千页的列表中提取数据,那么用PHP来实现更简单易行。用PHP编写的蜘蛛程序还有一个好处,就是服务器能起到优质代理服务器的作用,因为是通过服务器抓取目标网站的。一般托管主机都拥有优秀的网络接入质量,这对抓取速度有很大帮助。如果你拥有一个主机,特别是国外主机的话,这个好处嘛……你懂的。以一个从数
2、百页的列表中提取出需要的数据的任务为例,这像是一个反过程,将网页上的列表还原成数据库表。程序主要有以下工作要做:1.获得或生成URL2.下载目标页面内容3.分析页面、提取数据:4.将提取到的数据写入数据库或文件我的思路是将这个蜘蛛程序的控制功能放在客户端,而具体执行任务的功能放在服务器端。由客户端的AJAX来监视和控制服务器端的运行。客户端的工作:1.生成URL通过分析页面,或从提取到的页面中取得链接,可以确定下一页的URL。例如“www.ex1.com/list.php?page=123”或“www.ex2.com/list-123.html”。由Ja
3、vaScript生成要提取的URL,并发送给服务器端。服务器端一次只负责处理一个页面。2.存放和展示程序运行状态用户可以知道现在正在抓取哪一页、抓取到了多少条数据、失败重试的次数。如果用户暂停程序,下次还可以继续抓取。3.控制程序运行通过AJAX命令服务器端执行提取、分析和储存工作。在本例中,为了提高程序运行的稳定性,没有采用多线程设计,一次只请求一个页面。所以定义了两个函数:fnRun()和fnGet()。fnRun()是“启动/暂停”按钮的事件处理函数。它负责切换程序的运行和暂停状态,这是通过设置一个标志位bRunning来实现的。varbRunni
4、ng=0,nRetry=0,page=500;functionfnRun(){//当前处于停止状态if(bRunning==0){bRunning=1;$(‘#btn’).val(‘暂停‘);//更改按钮文字fnGet();}//当前处于运行状态else{bRunning=0;$(‘#btn’).val(‘继续‘);}}fnGet()则负责生成URL并创建AJAX请求,当AJAX请求完成(服务器端完成了工作)后,fnGet()递归调用,继续处理下一页。如果fnGet()遇到bRunning==0也就是用户要求暂停时,则停止递归调用。functionfnG
5、et(){if(bRunning==0)return0;if(page<1){$(‘#btn’).val(‘完成‘).attr(‘disabled’,true);alert(‘祝贺您!抓取成功完成!’);return0;}$(‘#cur_page’).html(page);$.ajax({type:“GET”,url:“count.php”,data:“page=”+page–,beforeSend:function(jqXHR,settings){$(‘#busy’).show();//告诉用户正在进行AJAX请求},success:function(
6、data,textStatus,jqXHR){$(‘#busy’).hide();//告诉用户AJAX请求已完成try{varjson=eval(‘(‘+data+’)’);}catch(oException){//网络繁忙,页面抓取有问题的处理varjson=newObject();json.msg=[];json.msg[0]=‘ERROR’;json.msg[1]=data;}if(json.msg[0]==‘S’){//成功获取,更新抓取到的数据条数$(‘#cur_num’).html(json.num);fnGet();}else{page++
7、;//要重试这一页,所以页码先加1nRetry++;//重试数加1$(‘#cur_retry’).html(nRetry);fnGet();}},error:function(jqXHR,textStatus,errorThrown){//与服务器端的通信出错//TODO:错误处理}});}4.多线程控制如果感到服务器仍有余力,可以在客户端同时创建多个AJAX请求,创建一个类来管理它们。服务器端的工作:1.下载目标页面通过file_get_contents()下载页面。以GET方式发送的参数只要加在URL后面就行了,但有时需要以POST方式发送,就要用s
8、tream_context_create()做一个上下文:$url=‘http:
此文档下载收益归作者所有