根据前几篇的博文:
可以得到了单页面和多页面的采集功能 如下:
1 $urls = array('http://www.baidu.com','http://www.hao123.com'); 2 $htmls = get_htmls($urls); 3 foreach($htmls as $html){ 4 $matches = get_matches('!<a[^<]+</a>!',$html,'没有找到链接',true); 5 if($matches){ 6 var_dump($matches); 7 } 8 }
这样不管是如何采集 最后都是处理一个html页面
数据采集的过程经常要深入好几层的页面 得到想要的数据 如论坛:
先采集论坛的列表页 再通过列表页采集到的地址 进入内容页
循环层次太多 代码不好维护 管理 既然是列表页和内容页 的采集规则不一样 把他们分出来成为两个函数
1 $urls = array(列表页网址1,列表页网址2,列表页网址...); 2 $htmls = get_htmls($urls); 3 foreach($htmls as $html){ 4 $list_urls = get_list_urls($html); 5 $contents_htmls = get_htmls($list_urls); 6 foreach($contents_htmls as $c_html){ 7 contents_exec($c_html); 8 } 9 } 10 function get_list_urls($html){ 11 //处理列表页内容 得到下一层网址 12 return 得到的网址数组; 13 } 14 function contents_exec($html){ 15 //处理内容页 插入数据库等等.... 16 }
但是这样如果层次更多 循环结构还是会很绕 那么就把这种循环规律 写成一个web_spider函数
1 function web_spider($urls,$func,$chunk_num,$options = array(),$method = 'get'){ 2 //$urls 网址数组 3 //$func 函数名字符串 4 //$chunk_num 一次并行采集的页数 5 //因为使用get_htmls 所以$options $method 不可少 6 $urls_chunk_array = array_chunk($urls,$chunk_num,true); 7 foreach($urls_chunk_array as $urls){ 8 $htmls = get_htmls($urls,$options,$method); 9 foreach($htmls as $key=>$html){ 10 $func($html,$key); 11 } 12 } 13 }
那么代码编写如下:
1 $urls = array(列表页网址1,列表页网址2,列表页网址...); 2 web_spider($urls,'get_list_urls',10); 3 function get_list_urls($html,$key){ 4 //$key 是为了判断哪个页面 5 //处理列表页内容 得到下一层网址 6 web_spider(得到的网址数组,'contents_exec',10); 7 } 8 function contents_exec($html,$key){ 9 //$key 是为了判断哪个页面 10 //处理内容页 插入数据库等等.... 11 }
这样编写之后代码就更好的管理 哪个采集页面出问题 就修改相应的func
有时候函数内需要调用上一个函数的变量时 记得做成全局变量的调用方式 这个都懂
我在2012所做的项目中 基本都是使用这种函数式的采集方式
还是很方便 好使用
注意的是function中要正确的才执行这个函数 因为要这样才能实现continue的操作
1 function get_list_urls($html,$key){ 2 //$key 是为了判断哪个页面 3 //处理列表页内容 得到下一层网址 4 $matches = get_matches('!<a[^<]+</a>!',$html,'没有找到链接',true); 5 if($matches){ 6 web_spider(得到的网址数组,'contents_exec',10); 7 } 8 }
这是采集数据的一些心得 终于断断续续写完了这个系列 希望可以帮助到人
明天就要去杭州了 心情很兴奋 把该完成的都完成了