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