curl数据采集系列之代码分离及并行逻辑控制函数web_spider

根据前几篇的博文:

curl数据采集系列之单页面采集函数get_html

curl数据采集系列之多页面并行采集函数get_htmls

curl数据采集系列之正则处理函数get_matches

可以得到了单页面和多页面的采集功能 如下:

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 }

这是采集数据的一些心得 终于断断续续写完了这个系列 希望可以帮助到人

明天就要去杭州了 心情很兴奋 把该完成的都完成了

你可能感兴趣的:(spider)