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 }

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

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

转载于:https://www.cnblogs.com/yanghaoinbeijing/archive/2013/04/28/3049329.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值