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