如何用PHP抓取必应的每日背景图
必应每日一图(cn.bing.com),指的是 cn.bing.com 网站的背景图片每天00:00就会更新一张。
很多人都喜欢把这些图片当作壁纸(包括我,当然,我并不是手动更换的,而是通过一款软件《必应自动桌面》来实现每天自动更换壁纸,当然,我们的主题是 如何用PHP抓取必应的每日背景图 )。
Bing的每日背景图片官方都有一个接口,一个是 json 方式,一个是 XML 的方式,所以就有了下面的这两个地址。
1. http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1 2. http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1
根据上面接口的参数,我大致得出了以下3个参数的解析:
1. format,非必要。我理解为输出格式,不存在或者不等于js,即为xml格式,等于js时,输出json格式;
2. idx,非必要。不存在或者等于0时,输出当天的图片,-1为已经预备用于明天显示的信息,1则为昨天的图片,idx最多获取到前16天的图片信息;*
3. n,必要。这是输出信息的数量,比如n=1,即为1条,以此类推,至多输出8条。
有兴趣的同学可以去研究上面的接口吧,接下来我来贴代码了,我是调用的第二个接口(返回格式是 XML
):
<?php /** *Description:获取Bing每日背景图 *Version:1.0 *Author:初文 */ ini_set('date.timezone','Asia/Shanghai');//设置时区,亚洲、上海;老外好像更喜欢上海,所以不能改成 Asia/Beijing /** *我对此做了缓存,减轻服务器负载,如果不需要,你可以自己改一下 */ $tomorrow=strtotime(date('Y-m-d 00:00:00',strtotime('+1 day')));//明天的时间戳 $cache_time=$tomorrow-time();//明天的时间戳-现在的时间戳=缓存的时间,因为必应每日一图,一天换一次... $modified_time=@$_SERVER['HTTP_IF_MODIFIED_SINCE']; if(strtotime($modified_time)+$cache_time>time()){//如果缓存的时间戳大于现在的时间戳 header("HTTP/1.1 304");//发送HTTP状态码304,使浏览器返回缓存的结果 }else{//否则抓取重新抓取图片,返回给用户 $str=curl_get('http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1'); if(preg_match("/<url>(.+?)<\/url>/ies",$str,$matches)){ $imgurl='http://cn.bing.com'.$matches[1]; } if($imgurl){ header('Content-Type: image/JPEG'); header ("Last-Modified: ".gmdate("D, d M Y H:i:s", time() )." GMT");//发送Last-Modified头标,设置文档的最后的更新日期。 header ("Expires: ".gmdate("D, d M Y H:i:s", time()+$cache_time )." GMT");//发送Expires头标,设置当前缓存的文档过期时间,GMT格式。 header ("Cache-Control: max-age=$cache_time");//发送Cache_Control头标,设置xx秒以后文档过时,可以代替Expires,如果同时出现,max-age优先。 @ob_end_clean(); @readfile($imgurl); @flush(); @ob_flush(); die; }else{ die('error, please try again !');//获取失败,提醒用户刷新页面重试 } } function curl_get($url,$time_out=10){ $ch=curl_init($url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); curl_setopt($ch,CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; U; Android 4.4.1; zh-cn; R815T Build/JOP40D) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 Chrome/4.5 Mobile Safari/533.1'); curl_setopt($ch,CURLOPT_TIMEOUT, $time_out); $content=curl_exec($ch); curl_close($ch); return($content); } ?>
Demo: https://www.ogdn.net/assets/img/bingimg.php //仅供演示用,不能用此链接作网站背景链接,因为有防盗链,你弄到网站当背景图也不会显示,要是真有需要,请在下方留言,我抽空做一个外链