PHP中怎样实现文章采集
注意容错.用SESSION控制可以避免很多麻烦.当 timeout的时候,刷新下就ok了.延长脚本运行时间可以@set_time_limit(0)
数据采集,大部分是用正则表达式,我简单地介绍下如何实现采集的思路.这里说的是php的实现.一般是本机运行,放到空间上是不明智的,因为不但很耗资源还需要支持远程抓取函数,比如file_get_contents($urls)file($url)等. 1,文章列表页面的自动切换,以及文章路径的获得. 2,获得:标题,内容 3,入库 4,问题 1,文章列表页面的自动切换,以及文章路径的获得. a,列表页面的自动切换一般依赖动态页面来实现.比如 http://www.phpfirst.com/foru ... d=1&page=$i 可以在后面利用$i的自动增加或范围来实现,比如$i++; 也可以像penzi演示的那个一样,要从第几页到第几页,代码方面控制$i的范围就可以. b,文章路径的获得分需要填正则和无需填正则2种: 1)无需填正则就是获得上面的文章列表页面的所有连接 但是最好对连接进行过滤,处理---判断重复连接,只留一个,处理相对路径,变成绝对路径.比如../ 和./等. 以下是我写的乱七八糟的实现函数: PHP: --------------------------------------------------------------------------------
//$e=clinchgeturl("http://phpfirst.com/forumdisplay.php?fid=1"); //var_dump($e); function clinchgeturl($url) { //$url="http://127.0.0.1/1.htm"; //$rootpath="http://fsrootpathfsfsf/yyyyyy/"; //var_dump($rrr); if(eregi(''(.)*[\.](.)*'',$url)){ $roopath=split("\/",$url); $rootpath="http://".$roopath[2]."/"; $nnn=count($roopath)-1;for($yu=3;$yu<$nnn;$yu++){$rootpath.=$roopath[$yu]."/";} // var_dump($rootpath); //http: ,'''',127.0.0.1,xnml,index.php } else{$rootpath=$url; //var_dump($rootpath); } if(isset($url)){ echo "$url 有下列裢接: $fcontents = file($url); while(list(,$line)=each($fcontents)){ while(eregi(''(href[[:space:]]*=[[:space:]]*"?[[:alnum:]:@/._-]+[\?]?[^\"]*"?)'',$line,$regs)){ //$regs[1] = eregi_replace(''(href[[:space:]]*=[[:space:]]*\"?)([[:alnum:]:@/._-]+)(\"?)'',"\\2",$regs[1]); $regs[1] = eregi_replace(''(href[[:space:]]*=[[:space:]]*[\"]?)([[:alnum:]:@/._-]+[\?]?[^\"]*)(\.*)[^\"\/]*([\"]?)'',"\\2",$regs[1]); if(!eregi(''^http:\/\/'',$regs[1])){ if(eregi(''^\.\.'',$regs[1])){ // $roopath=eregi_replace(''(http:\/\/)?([[:alnum:]:@/._-]+)[[:alnum:]+](\.*)[[:alnum:]+]'',"http:\/\/\\2",$url); $roopath=split("\/",$rootpath); $rootpath="http://".$roopath[2]."/"; //echo "这是根本d :"."\n"; $nnn=count($roopath)-1;for($yu=3;$yu<$nnn;$yu++){$rootpath.=$roopath[$yu]."/";} //var_dump($rootpath); if(eregi(''^\.\.[\/[:alnum:]]'',$regs[1])){ //echo "这是../目录/ :"."\n"; //$regs[1]="../xx/xxxxxx.xx"; // $rr=split("\/",$regs[1]); //for($oooi=1;$oooi $rrr=$regs[1]; // {$rrr.="/".$rr[$oooi]; $rrr = |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |