• 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 }

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

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

  • 相关阅读:
    Java泛型
    Hibernate JPA实体继承的映射(一) 概述
    Hibernate JPA实体继承的映射(二) @MappedSuperclass
    rownum使用说明
    Javascript 中使用Json的四种途径
    JavaScript中使用JSON,即JS操作JSON总结
    Refresh Tokens: When to Use Them and How They Interact with JWTs
    Nginx 安装与启动
    JSON与js对象序列化
    js对象小结
  • 原文地址:https://www.cnblogs.com/yanghaoinbeijing/p/3049329.html
Copyright © 2020-2023  润新知