php抓取网页中的所有图片地址

摘要:公司要求写一个脚本,然后抓取指定页面中符合尺寸的图片,所以,代码分享咯,欢迎交流。

公司要求写一个脚本,然后抓取指定页面中符合尺寸的图片,所以,代码分享咯,欢迎交流。

<?php
//可以通过post或者get过来网址
$url      = 'http://bbs.php100.com/read-htm-tid-324589.html';
$result = array();

if(judgeImage($url)) {  //不是图片的网址
    
    $content = curlAction($url);
    if(!$content) {
        $result['message'] = '上傳網址有誤或者該網址加密無法獲取圖片';
        $result['success']  = false;
        echo json_encode($result);
        exit;
    }
    
    //$parten = '#<img[/s|/S]*?src/s*=/s*["|/']*/s*(.[^>"/'/s]+)#i'; 
    //针对<img onmouseover="this.src='a.png';" onmouseout="this.src='b.png';" src="c.png"/>
    $parten = '#src/s*=/s*["|/']*/s*(.[^>"/'/s]+)#i'; 
    preg_match_all($parten, $content, $match);
    
    $imageArr = array();
    $imageArr = $match[1];
    unset($match);
    if(!$imageArr) {
        $result['message'] = '上傳網址無圖片';
        $result['success']  = false;
        echo json_encode($result);
        exit;
    }
    
    $parten2 = '([htps://]*[/w|.|-]+[^/]*)';
    preg_match_all($parten2, $url, $urlMatch);
    $perfix = $urlMatch[0][0];
    if($urlMatch[0][1]) {
        foreach($urlMatch[0] as $k => $val) {
            if($k == 0) continue;
            $urlArr[] = $val; 
        }
        $urlCount = count($urlArr);
    }
    unset($urlMatch);
    
    foreach($imageArr as $key => $image) {

        //排除js和一些不是图片结尾的东西
        if(judgeImage($image)) {
            unset($imageArr[$key]);
            continue;
        }
    
        $partenOne = '/^(.//)|^[/d|a-z]/i';
        $partenTwo = '/^//.+/i';

        if(stripos($image, 'http') !== false) {
    
            $newImg = $image;
    
        //最后一级目录
        } else if(preg_match($partenOne, $image)) {
    
            $count    = (empty($urlCount) || $urlArr[0] == '/') ? '' : strlen($urlArr[$urlCount-1]);
            $temp     = $count ? substr($url, 0, -$count) : $perfix;
            $newImg = (strpos($image, './') !== false) ? $temp.substr($image, 1) : $temp.'/'.$image;
    
        //顶级域名下的图片
        } else if(preg_match($partenTwo, $image)) {
    
            $newImg = $perfix.$image;
    
        //中间目录
        } else if(stripos($image, '../') !== false) {
    
            $occurCount = substr_count($image, '../');
            $start  = $occurCount*3;
            $item   = $occurCount+1;
            $count = 0;
    
            for($i=1; $i<=$item; $i++) {
                $count += strlen($urlArr[$urlCount-$i]);
            }
            $newImg = substr($url, 0, -$count).'/'.substr($image, $start); 
    
        }

        $imageArr[$key] = $newImg;
        //end
    
    }
    //var_dump($imageArr);exit;

    if(!empty($imageArr)) {
        $imageArr = array_unique($imageArr);

        foreach($imageArr as $k => $val) {
            if(!judgeSize($val)) continue;
            unset($imageArr[$k]); 
        }

        $imageArr = array_values($imageArr);
    }
    
    if(!$imageArr) {
        $result['message'] = '上傳網址無合格圖片';
        $result['success']  = false;
        echo json_encode($result);
        exit;
    }

} else {  //是图片的网址

    if(judgeSize($url)) {
        $result['message'] = '圖片太小';
        $result['success']  = false;
        echo json_encode($result);
        exit; 
    } else {
        $imageArr = array($url);  
    }

}

$result['message'] = $imageArr;
$result['total']        = count($imageArr);
$result['success']   = true;
echo json_encode($result);
exit;

//抓取方法
function curlAction($url) {
    $content = '';

    //初始化
    $curl = curl_init();
    //设置选项,包括URL
    curl_setopt($curl, CURLOPT_URL, $url);
    //在HTTP请求中包含一个”user-agent”头的字符串。
    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    //自动设置header中的referer信息;
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
    //设置curl允许执行的最长秒数
    //curl_setopt($curl, CURLOPT_TIMEOUT, 100);
    //启用时会将头文件的信息作为数据流输出;
    curl_setopt($curl, CURLOPT_HEADER, 0);
    //将curl_exec获取的信息以文件流的形式返回,而不是直接输出;
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //执行并获取HTML文档内容
    $content = curl_exec($curl);
    //输出错误
    if (curl_errno($curl)) {
        curl_close($curl);
        return false;
    }
    //关闭curl
    curl_close($curl);

    return $content;
}

//判断图片大小是否合格
function judgeSize($image) {

    $imageSize = array();
    $imageSize = getimagesize($image);
    return ($imageSize[0] < 100 || $imageSize[1] < 100) ? true : false; 

}

//判断是否是图片,不是返回true
function judgeImage($url) {

    $imageTemp = array();
    $imageTemp = explode('.', $url);
    $type     = array('jpg', 'png', 'bmp', 'gif', 'jpeg');
    $suffix    = strtolower($imageTemp[count($imageTemp)-1]);
    //针对有的图片网址后有 ?接参数的情况
    $unless = strpos($suffix, '?');
    if($unless != false) {
        $suffix = substr($suffix, 0, $unless); 
    }

    if(!in_array($suffix, $type)) return true;

}

?>

还不错吧,我写的,返回的是json数据,大家可以一起加油哦。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98456.html

(0)
上一篇 2021年8月21日
下一篇 2021年8月21日

相关推荐

发表回复

登录后才能评论