接上一篇,为了在抓取的页面内容中提取我们想要的信息,我们一般要用正则来处理页面内容结果。
比如preg_match_all 函数,可以把符合规则的内容 存到一个数组里面。
用法:
$content=file_get_contents("http://health.china.com/html/breast/fxlan/1.html");
$pattern = "@http://www.yjbys.com/zhaopinhui/index.asp\?rq=(.*?)\">(.*?)@i";
$flag = preg_match_all($pattern,$content,$m);
这里$flag会有两个结果,一是没有匹配到符合规则$pattern的内容,返回false;一是匹配到符合规则的内容,将内容存储在数组$m里。你可以print_r($m); 来检查$m到底有没有内容。
采集就是如此简单。
当然,取得内容后的操作,就不一一说了,无非是入库之类的操作。
在这里要提一下如何才能提高采集效率,就是让你的采集程序跑起来不会太占资源以至于拖垮服务器!
1.在采集程序开始前 先临时定义一下php环境的的限制,如此可以预防跑着跑着突然停止的尴尬。同时也可预防php崩溃。
//脚本最长的运行时间
set_time_limit(180000);
//临时调整的php可用的内存
$r = ini_set("memory_limit","500M") ;
//PCRE的最大回溯(backtracking)步数。貌似跟for循环的次数紧密相关
$r = ini_set("pcre.backtrack_limit","8000") ;
//PCRE的最大递归(recursion)深度。如果你将该值设的非常高,将可能耗尽进程的栈空间,导致PHP崩溃
$r = ini_set("pcre.recursion_limit","8000") ;
2.多点用strpos,substr,explode,str_replace函数,而尽量少用preg_match_all,preg_match()这类正则函数,因为这类函数的效率实在不咋样,我一般都是先用strpos,substr,explode,str_replace函数处理,实在不行,才会用preg_match_all,preg_match
最后也发一下preg_match的用法例子:
//这个表示在字符串$name中查找css字符,将匹配的个数放到$matches里去。
preg_match("/css/", $name, $matches)
$cont=preg_replace("/(?<=href=)([^\>]*)(?=\>)/i","", $cont); //过滤url
$cont=preg_replace( "/.*<\/script>/isU ", "", $cont );//过滤掉javscript
替换所有 class=innerlink 的 a 标签:
$content = preg_replace('/(.*?)/i', '${1}', $content);
上面是两个正则替换的例子。
基本上采集就这些了,而有关正则的话题,下一篇继续…