php单线程爬虫类

  1. 代码:
    /**
    * @desc:单线程爬虫类
    * @author [Lee] <[<[email protected]>]>
    * @property
    * 1、callcontent 获取给定url页面中的内容的回调函数
    * 2、calltodo 处理业务逻辑的回调函数 如:把抓取到的内容处理后存到数据库
    * @method
    * run 执行爬虫程序
    *     @param depth 深度 默认2
    *     @return void
    */
    class crawl{
    public $callcontent = 'getcontent';  #  获取给定url页面中的内容的回调函数
    public $calltodo = 'todo';  #  处理业务逻辑的回调函数 如:把抓取到的内容处理后存到数据库
    private $url;  #  内部属性:当前处理中的url
    /*
     @desc:内部方法,调用回调函数获取页面内容
     @param url 传入到回调函数的参数
     @return ret 页面内容
     */
    private function getcontent($url){
        $callback = $this->callcontent;
        $ret = call_user_func($callback,$url);
        return $ret;
    }
    /*
     @desc:内部方法,调用回调函数进行业务处理
     @param content 传入到回调函数的参数
     */
    private function todo($content){
        $callback = $this->calltodo;
        call_user_func($callback,$content);
    }
    /*
     @desc:内部方法,获取页面中的超链接
     @param content 页面内容
     @return urls 获取到的超链接
     */
    private function geturl($content){
        $preg = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
        $bool = preg_match_all($preg,$content,$res);
        $urls = array();
        if($bool){
            $urls = $res[1];
        }
        $urls = array_unique($urls);
        return $urls;
    }
    /*
     @desc:内部方法,修复不完整的url
     @param url 原始url
     @param url 修复好的url
     */
    private function reviseurl($url){
        $info = parse_url($url);
        $scheme = $info["scheme"]?:'http';
        $user = $info["user"];
        $pass = $info["pass"];
        $host = $info["host"];
        $port = $info["port"];
        $path = $info["path"];
        $url = $scheme . '://';
        if ($user && $pass) {
            $url .= $user . ":" . $pass . "@";
        }
        $url .= $host;
        if ($port) {
            $url .= ":" . $port;
        } 
        $url .= $path;
        return $url;
    }
    /*
     @desc:构造方法,初始化url
     */
    public function __construct($url){
        $this->url = $url;
    }
    /*
     @desc:主方法,执行程序
     @param depth 挖掘深度 默认2
     */
    public function run($depth = 2){
        $url = $this->url;
        if($depth > 0){
            $depth--;
            $content = $this->getcontent($url);
            // 业务处理开始
            $this->todo($content);
            // 业务处理结束
            $urls = $this->geturl($content);
            $url = $this->reviseurl($url);
            if (is_array($urls) && !empty($urls)) {
                foreach ($urls as $u) {
                    if (preg_match('/^http/', $u)) {
                        $returl = $u;
                    } else {
                        $real = $url . '/' . $u;
                        $returl = $real;
                    }
                    $crawl = new crawl($returl);
                    $crawl->run($depth);
                }
            }
        }
    }
    }
  2. 测试:
    $crawl = new crawl('www.baidu.com');
    $crawl->run();
    /*
    @desc:获取内容的回调
    */
    function getcontent($url){
    $http = new http($url);
    $ret = $http->get()->run();
    return $ret;
    }
    /*
    @desc:处理业务逻辑的回调
    */
    function todo($content){
    echo '执行内容'.PHP_EOL;
    }
  3. 输出:
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容

猜你喜欢

转载自blog.51cto.com/12173069/2125424