简单的PHP采集网页图片

public $domain = '';

    /**
     * 获取图片
     * @param string $targetUrl
     * @author wuzhc 2015-10-23
     */
    public function actionGetImgs($targetUrl = ''){
        set_time_limit(0);
        $urlMatchArr = $this->_getMatchUrls($targetUrl);
        $i = 0;
        if ( null !== $urlMatchArr ) {
            foreach ( $urlMatchArr as $val ) {
                if ( $url = $this->_returnUrl($val) ) {
                    if($this->_downloadImage($url)){
                        echo $url.'<br>';
                        $i++;
                    }
                } else {
                    continue;
                }
            }
        }
        echo 'A total of '.$i.' images are downloaded';
    }

    /**
     * 判断获取的URL路径
     * 1、为相对路径时,则构造成绝对路径
     * 2、判断该URL是否可用
     * @param $matchUrl
     * @return 成功返回URL,失败返回false
     * @author wuzhc 2015-10-23
     */
    private  function _returnUrl($matchUrl)
    {
        //在相对路径前加上域名
        if( substr($matchUrl,0,4) != 'http' ) {
            $matchUrl = $this->domain.$matchUrl;
        }
        $urlHeard = @get_headers($matchUrl); //发送HEAD请求来判断是否存在死链
        if( $urlHeard[0] && strpos($urlHeard[0], '200') )
            return $matchUrl;
        else
            return false;
    }

    /**
     * 获取采集网址域名
     * 如果目标的地址以http开头,用PHP内置的函数获取
     * (因为parse_url对相对路径的 URL 不起作用,即只能正确识别http开头的URL,)
     *如果不是http开头的URL使用正则获取域名
     * 以上取不到域名。则返回false
     * @param $targetUrl
     * @author wuzhc 2015-10-23
     */
    private  function _getTargetUrlHost($targetUrl = 'www.baidu.com'){
        if ( substr($targetUrl,0,4) == 'http' ) {
            $urlArr = parse_url($targetUrl);
            $urlArr['scheme'] and $scheme = $urlArr['scheme'].'://';
            $urlArr['host'] and $host = $urlArr['host'];
            $this->domain = $scheme.$host;
        } else {
            $pattern = '/[\w\-\_]+\.(?:com\.cn|com|cn|net|org|cm)/';
            if ( preg_match($pattern, $targetUrl, $matches) ) {
                $this->domain = $matches[0];
            }
        }
    }

    /**
     * 获取网页匹配到的所有图片的URL
     * @param $targetUrl
     * @return array
     * @author wuzhc 2015-10-23
     */
    private  function _getMatchUrls($targetUrl = ''){
        $this->_getTargetUrlHost($targetUrl); //获取域名

        if( function_exists("curl_init") ) {
           $content = $this->_getContentByCurl($targetUrl);
        }else{
            $content = file_get_contents($targetUrl);
            iconv('gb2312','utf-8',$content); //链接有中文会有乱码问题
        }

        $pattern = '/((?:http|https):\/\/(?:[^\.\/\(\)\?]+)\.(?:[^\.\/]+)\.(?:com\.cn|com|cn|net|org))?\/(?:[^\.:\"\'\(\)\?]+)\.(jpg|png|gif)/i';
        $content and preg_match_all($pattern, $content, $match);
        if( $match[0] && is_array($match[0]) ) {
            return $match[0];
        } else {
            return null;
        }
    }

    /**
     * 下载远程图片到本地
     * @param string $url 远程文件地址
     * @param bool $isReName 保存后的文件名(true则为随机生成的文件名,false则为原文件名)
     * @param array $fileType 允许的文件类型
     * @param string $dirName 文件保存的路径(路径其余部分根据时间系统自动生成)
     * @return array 返回文件名、文件的保存路径
     * @author blog.snsgou.com
     * it has been modified by wuzhc 2015-10-23
     */
    private  function _downloadImage($url, $isReName = true, $dirName = 'content/tmpFile', $fileType = array('jpg', 'gif', 'png')){
        if ( $url == '' ) {
            return false;
        }

        $defaultFileName = basename($url); // 获取文件原文件名
        $suffix = substr(strrchr($url, '.'), 1);  // 获取文件类型

        //过滤下载文件类型
        if ( !in_array($suffix, $fileType) ) {
            return false;
        }

        $fileName = $isReName ? time().mt_rand(0,9).'.'.$suffix : $defaultFileName; // 设置保存后的文件名

        // 获取远程文件资源
        if( function_exists("curl_init") ) {
            $file = $this->_getContentByCurl($url);
        } else {
            ob_start();
            readfile($url);
            $file = ob_get_contents();
            ob_end_clean();
        }

        // 设置文件保存路径
        $dirName = $dirName . '/' . date('Y', time()) . '/' . date('m', time()) . '/' . date('d', time());
        if ( !file_exists($dirName) ) {
            mkdir( $dirName,  0777,  true );
        }

        // 保存文件
        $res = fopen($dirName . '/' . $fileName, 'a');
        fwrite($res, $file);
        fclose($res);

        return array(
            'fileName' => $fileName,
            'saveDir' => $dirName
        );
    }

    /**
     * curl获取内容
     * @param $url
     * @param int $timeout
     * @return mixed
     * @author wuzhc 2015-10-23
     */
    private  function _getContentByCurl($url,$timeout = 100){
        $ch = curl_init();
        $this_header = array(
            "content-type: application/x-www-form-urlencoded;
            charset=UTF-8"
        );
        curl_setopt($ch, CURLOPT_HTTPHEADER, $this_header);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $content = curl_exec($ch);
        curl_close($ch);
        return $content;
    }

你可能感兴趣的:(简单的PHP采集网页图片)