使用PHP抓取Bing每日图像并为己所用

Bing搜索的首页每天都会推送一张很漂亮的图片,把它保存下来,当做电脑桌面或是自己的网站背景图还不是美滋滋……

今天的bing图片是这样的

既然要抓取这张图片,首先就得弄清这张图是从何而来的。经过对必应首页的抓包,我们可以获得首页图的获取API。它的格式是这样的:

  1. http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1

注意,这里有几个GET参数,它们的作用分别是:

  • n,必要参数。这是输出信息的数量。比如n=1,即为1条,以此类推,至多输出8条。
  • format,非必要。返回结果的格式,不存在或者等于xml时,输出为xml格式,等于js时,输出json格式
  • idx,非必要。不存在或者等于0时,输出当天的图片,-1为已经预备用于明天显示的信息,1则为昨天的图片,以此类推,idx最多获取到前16天的图片信息

这里将n设定为1、format设定为js、idx设定为1,去发出GET请求,返回的数据是这样的:

  1. {
  2.     "images": [
  3.         {
  4.             "startdate": "20161222",
  5.             "fullstartdate": "201612221600",
  6.             "enddate": "20161223",
  7.             "url": "/az/hprichbg/rb/TheDomeEdinburgh_ZH-CN11993142817_1920x1080.jpg",
  8.             "urlbase": "/az/hprichbg/rb/TheDomeEdinburgh_ZH-CN11993142817",
  9.             "copyright": "爱丁堡一家叫做The Dome的夜店,苏格兰 (© Marty McKillop/500px)",
  10.             "copyrightlink": "http://www.bing.com/search?q=The+Dome,+Edinburgh&form=hpcapt&mkt=zh-cn",
  11.             "quiz": "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20161222_TheDomeEdinburgh%22&FORM=HPQUIZ",
  12.             "wp": false,
  13.             "hsh": "376393c9b49c6d8d1a6e7c2d38343105",
  14.             "drk": 1,
  15.             "top": 1,
  16.             "bot": 1,
  17.             "hs": []
  18.         }
  19.     ],
  20.     "tooltips": {
  21.         "loading": "正在加载...",
  22.         "previous": "上一个图像",
  23.         "next": "下一个图像",
  24.         "walle": "此图片不能下载用作壁纸。",
  25.         "walls": "下载今日美图。仅限用作桌面壁纸。"
  26.     }
  27. }

其中的“images”节点下的“url”值便是我们要获取的图像地址。我们把它取出来,再加上Bing的网址前缀(http://cn.bing.com)即组合成了完整的图像地址。比如说上面返回数据的完整图像地址是这样的:

  1. http://cn.bing.com/az/hprichbg/rb/TheDomeEdinburgh_ZH-CN11993142817_1920x1080.jpg

知道了背景图的获取方式,接下来就是用PHP去动态抓取了。

如果你只是单纯的想用作网页背景的话,你只需新建一个php文件,里面贴入如下代码:

  1. <?php
  2. $str = file_get_contents('http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1');   //从bing获取数据
  3. if(preg_match("/<url>(.+?)<\/url>/ies",$str,$matches)){ //正则匹配抓取图片url
  4. $imgurl='http://cn.bing.com'.$matches[1];
  5. }else{  //如果由于某些原因,没抓取到图片地址
  6. $imgurl='http://img.infinitynewtab.com/InfinityWallpaper/2_14.jpg'; //使用默认的图像(默认图像链接可修改为自己的)
  7. }
  8. header("Location: $imgurl");    //header跳转

然后把这个php文件上传到你的服务器或者是网站空间,访问这个php应该就能看到被跳转到了Bing的图片。

使用方法:直接将那个php文件的绝对地址当做图片放进网页中即可。

比如说,如果你的这个php的地址为“http://www.myweb.cn/bing.php”,那么你在你自己的网页的css中这么写就能当背景使用了:

  1. body{
  2. width:100%;
  3. height:100%;
  4. background: url(http://www.myweb.cn/bing.php) no-repeat;
  5.     -moz-background-size: cover;    /*背景图片拉伸以铺满全屏*/
  6.     -ms-background-size: cover;
  7.     -webkit-background-size: cover;
  8. background-size: cover;
  9. }

以上方法只是简单地跳转,如果想要抓取这张图片并保存到服务器呢?这里直接贴代码:

  1. <?php
  2. /**
  3.  * php抓取bing每日图片并保存到服务器
  4.  * 作者:mengkun (mkblog.cn)
  5.  * 日期:2016/12/23
  6.  */
  7. $path = 'temp';   //设置图片缓存文件夹
  8. $filename = date("Ymd") . '.jpg';  //用年月日来命名新的文件名
  9. if (!file_exists($path.'/'. $filename))    //如果文件不存在,则说明今天还没有进行缓存
  10. {
  11. if(!file_exists($path)) //如果目录不存在
  12.     {
  13. mkdir($path, 0777); //创建缓存目录
  14.     }
  15. $str = file_get_contents('http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'); //读取必应api,获得相应数据
  16. $str = json_decode($str,true);
  17. $imgurl = 'http://cn.bing.com'.$str['images'][0]['url'];    //获取图片url
  18. $img = grabImage($imgurl, $path.'/'.$filename); //读取并保存图片
  19. $handle = fopen("dat.txt", "a");    //用于存放图片信息,如果不需要保存图片的相关信息,可以把下面这些去掉。
  20. if ($handle)
  21.     {
  22. $copyright = $str['images'][0]['copyright'];    //说明
  23. $startdate = $str['images'][0]['startdate'];
  24. $fullstartdate = $str['images'][0]['fullstartdate'];
  25. $enddate = $str['images'][0]['enddate'];
  26. $urlbase = $str['images'][0]['urlbase'];
  27. $copyrightlink = $str['images'][0]['copyrightlink'];
  28. $quiz = $str['images'][0]['quiz'];
  29. $wp = $str['images'][0]['wp'];
  30. $hsh = $str['images'][0]['hsh'];
  31. $drk = $str['images'][0]['drk'];
  32. $top = $str['images'][0]['top'];
  33. $bot = $str['images'][0]['bot'];
  34. $tempArr = array("imgurl"=>$imgurl,"copyright"=>$copyright, "startdate"=>$startdate,
  35. "fullstartdate"=>$fullstartdate, "enddate"=> $enddate, "urlbase"=>$urlbase,
  36. "copyrightlink"=> $copyrightlink, "quiz"=>$quiz, "wp"=> $wp,
  37. "hsh"=>$hsh,"drk"=>$drk, "top"=> $top, "bot"=> $bot);   //将相关信息放进数组中
  38.         fwrite($handle, json_encode($tempArr) ."\r\n"); //最终以json格式保存在文本文档中
  39.         fclose($handle);
  40.     }
  41. }
  42. /**
  43.  * 远程抓取图片并保存
  44.  * @param $url 图片url
  45.  * @param $filename 保存名称和路径
  46.  */
  47. function grabImage($url, $filename = "")
  48. {
  49. if($url == "") return false; //如果$url地址为空,直接退出
  50. if ($filename == "") //如果没有指定新的文件名
  51.     {
  52. $ext = strrchr($url, ".");  //得到$url的图片格式
  53. $filename = date("Ymd") . $ext;  //用天月面时分秒来命名新的文件名
  54.     }
  55.     ob_start();         //打开输出
  56.     readfile($url);     //输出图片文件
  57. $img = ob_get_contents();   //得到浏览器输出
  58.     ob_end_clean();             //清除输出并关闭
  59. $size = strlen($img);       //得到图片大小
  60. $fp2 = @fopen($filename, "a");
  61.     fwrite($fp2, $img);         //向当前目录写入图片文件,并重新命名
  62.     fclose($fp2);
  63. return $filename;           //返回新的文件名
  64. }

这样,如果这个php被访问,它就会自动启动抓取并保存。你可以用阿里云监控或其他类型的网站监控服务来实现每天自动运行这个php。

我这里挂在服务器上测试了一下,已经成功运行了三天:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闪电gogogo的专栏

使用Ctex中遇到的一些问题

一般下载好Ctex,我是使用Latex+dvi2pdf完成编译的,但是发现推荐的使用为: 1)运行CCT & Latex命令生成两次dvi和ps文件

994
来自专栏跟着阿笨一起玩NET

Dev XtraTreeList 学习

本文转载:http://www.cnblogs.com/VincentLuo/archive/2012/01/06/2313983.html

381
来自专栏数据小魔方

如何在Excel里加载第三方插件,让你的Excel功能更加强大!!!

今天是小魔方的第三篇推送教程,要谈的话题是如何在Excel里加载第三方插件工具! 记得第一期的时候讲的如何调用开发工具,其实微软公司在开发office办公套件的...

3115
来自专栏腾讯社交用户体验设计

vuejs初体验-Chrome插件开发实录

1322
来自专栏一“技”之长

Tkinter之Menu组件用法 原

    开发工具类桌面应用使用Python、Java这类语言是一种不错的选择,他们的GUI库都可以很好的支持跨平台特性。本系列博客主要总结Tkinter库中提供...

682
来自专栏FreeBuf

基于Django的双因子认证实现

双因子简介 对于网络信息系统来说,能否识别使用者的身份,是能否确保安全的基础和关键。在实际应用中,许多网络信息系统都会要求使用者在使用系统之前,提供一些相关信息...

32710
来自专栏狂码一生

ThinkPHP文件上传

    在自己写的类中加入一个方法,下面我把我写的一个方法直接拿上来:     /*      * 文件上上传      * */     public fu...

45010
来自专栏生信技能树

shell界面颜值知多少

颜色值设置: PS1中设置字符颜色的格式为:[\e[F;Bm],其中“F“为字体颜色,编号为30-37,“B”为背景颜色,编号为40-47。

992
来自专栏用户2442861的专栏

chrome使用技巧(看了定不让你失望,不错)

之前有看过刘哇勇写的Chrome 控制台不完全指南,让我觉得瞬间对chrome的了解实在太浅了。对此特意了解了一番(也就是在他的博文上进行了一些总结和了解一些其...

581
来自专栏逻辑熊猫带你玩Python

Python | Time Marker时间标签(附详细注释)

如果您之前关注过我的内容,可以回忆一下我之前发过两篇关于文章,如果没有可以进入下面链接:

511

扫码关注云+社区