JavaScript-如何高效的获取网页中大于指定尺寸所有图片?
在http://pinterest.com这个网站上,注册后,它有一个add a pin, 当你提交一个网站的URL后,按Find Images时,它可以查找你提交网页上所有图片的(并进行长和宽条件的筛选),整个过程一般在10秒左右。请问这是如何实现的,效率这么高?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我的粗浅看法是,我觉得他们可能后台会定期跑一个程序,会抓取各个网站的图片并判断大小,将图片的大小存在他们的数据库里,图片可能不会都存在本地,要是当时抓再判断大小肯定来不及,就算代码写的很好,但网络不给力也是白搭。
这个我正好做过,如果要提高筛选效率,最好的办法应该是将这一步放到浏览器里面通过JS来进行。
具体步骤:
1、通过服务端脚本(比如php)将整个目标网页抓取并返回给浏览器;
2、用正则表达式甄选出所有的图片标签;
3、JS判断图片大小,筛选出目标尺寸的图片。
大概就是这样。
我也提供一个思路,php获取给定网页中所有的图片地址(不进行图片资源的分析),图片的尺寸由前端JS来处理,php处理页面部分,只需要处理图片处理的部分,直接返回JS一个图片地址的对象就可以,JS处理部分
图片预加载JS转自 再谈javascript图片预加载技术
这个也很简单呀,通过PHP的getimagesize()就可以获取远程的图片的宽度和高度,我给你写了一下并封装成了函数,你试试
函数功能:
可以支持http://开头的图片和/开头的绝对地址图片
$url参数可以加http://也可以不加http://
支持定义获取最小宽度和高度到最大宽度和高度的图片
以下代码你运行看看,我这里测试是完全没问题的。速度方面也不是大问题,我抓新浪的首页的所有指定宽高的图片,也就5秒左右。
<?php
/**
* 获取远程网址下的所有指定宽度和高度的图片
* @param string $url 网站地址
* @param int $min_width 图片最小宽度
* @param int $min_height 图片最小高度
* @param int $max_width 图片最大宽度
* @param int $max_height 图片最大高度
* @return array 筛选后的图片信息
*/
function getImage($url='', $min_width=50, $min_height=50, $max_width=100, $max_height=100){
$result = array();
if(empty($url)){
return array();
}
if(strtolower(substr($url, 0, 7)) != 'http://'){
$url = 'http://' . $url;
}
$content = file_get_contents($url);
if(empty($content)){
return array();
}
preg_match_all('/<imgs+.*?src="(.*?)".*?>/', $content, $matches);
if($matches[1]){
foreach($matches[1] as $image){
//判断以/开头的绝对图片URL地址
if(substr($image, 0, 1) == '/'){
$urls = explode('/', $url);
$image = 'http://' . $urls[2] . $image;
}
$info = @getimagesize($image);
if( !empty($info) && $info[0]>intval($min_width) && $info[1]>intval($min_height) && $info[0]<intval($max_width) && $info[1]<intval($max_height) ){
$info['url'] = $image;
$result[] = $info;
}
}
}
return $result;
}
//测试
$result = getImage('www.sina.com', 60, 50, 120, 100);
if($result){
foreach($result as $img){
echo "图片地址:" . $img['url'] . "<br>";
echo "图片宽度:" . $img[0] . "<br>";
echo "图片高度:" . $img[1] . "<br><br />";
}
}
?>