使用PHP每日自动抓取Bing每日图像并保存到本地,附源码
in php源码各种技术 with 0 comment

使用PHP每日自动抓取Bing每日图像并保存到本地,附源码

in php源码各种技术 with 0 comment

主要作用

自动抓取当前最新的bing每日图像,并自动把图片保存在自己服务器上。您可以把接口用作网站背景图片,这样网站每天都会自动更换bing背景图片,每天都不一样的体验。

效果预览

下面这种图片每天都会自动更换为bing最新的每日图像

请输入图片描述

具体实现方法:发布文章 插入图片时直接填接口地址就行

UC截图20180608102621.png

数据分析

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

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请求,返回的数据是这样的:

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

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

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

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

项目地址

https://gitee.com/keziyun/bing

源代码

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

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

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

自动抓取图片并保存在本地

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

<?php
$path = 'temp';   //设置图片缓存文件夹
$filename = date("Ymd") . '.jpg';  //用年月日来命名新的文件名
if (!file_exists($path.'/'. $filename))    //如果文件不存在,则说明今天还没有进行缓存
{
    if(!file_exists($path)) //如果目录不存在
    {
        mkdir($path, 0777); //创建缓存目录
    }
    $str = file_get_contents('http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'); //读取必应api,获得相应数据
    $str = json_decode($str,true);
    $imgurl = 'http://cn.bing.com'.$str['images'][0]['url'];    //获取图片url
    $img = grabImage($imgurl, $path.'/'.$filename); //读取并保存图片
    $handle = fopen("dat.txt", "a");    //用于存放图片信息,如果不需要保存图片的相关信息,可以把下面这些去掉。
    if ($handle)
    {
        $copyright = $str['images'][0]['copyright'];    //说明
        $startdate = $str['images'][0]['startdate'];
        $fullstartdate = $str['images'][0]['fullstartdate'];
        $enddate = $str['images'][0]['enddate'];
        $urlbase = $str['images'][0]['urlbase'];
        $copyrightlink = $str['images'][0]['copyrightlink'];
        $quiz = $str['images'][0]['quiz'];
        $wp = $str['images'][0]['wp'];
        $hsh = $str['images'][0]['hsh'];
        $drk = $str['images'][0]['drk'];
        $top = $str['images'][0]['top'];
        $bot = $str['images'][0]['bot'];
        $tempArr = array("imgurl"=>$imgurl,"copyright"=>$copyright, "startdate"=>$startdate,
        "fullstartdate"=>$fullstartdate, "enddate"=> $enddate, "urlbase"=>$urlbase,
        "copyrightlink"=> $copyrightlink, "quiz"=>$quiz, "wp"=> $wp,
        "hsh"=>$hsh,"drk"=>$drk, "top"=> $top, "bot"=> $bot);   //将相关信息放进数组中
        fwrite($handle, json_encode($tempArr) ."\r\n"); //最终以json格式保存在文本文档中
        fclose($handle);
    }
}
/**
 * 远程抓取图片并保存
 * @param $url 图片url
 * @param $filename 保存名称和路径
 */
function grabImage($url, $filename = "")
{
    if($url == "") return false; //如果$url地址为空,直接退出
    if ($filename == "") //如果没有指定新的文件名
    {
        $ext = strrchr($url, ".");  //得到$url的图片格式
        $filename = date("Ymd") . $ext;  //用天月面时分秒来命名新的文件名
    }
    ob_start();         //打开输出
    readfile($url);     //输出图片文件
    $img = ob_get_contents();   //得到浏览器输出
    ob_end_clean();             //清除输出并关闭
    $size = strlen($img);       //得到图片大小
    $fp2 = @fopen($filename, "a");
    fwrite($fp2, $img);         //向当前目录写入图片文件,并重新命名
    fclose($fp2);
    return $filename;           //返回新的文件名
}

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

懒得动手?

如果您实在懒得动手,那您可以直接用下面这个接口

https://api.yuntuchuang.com/api/bing.php

使用方法

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

body{
    width:100%;
    height:100%;
    background: url(https://api.yuntuchuang.com/api/bing.php) no-repeat;
    -moz-background-size: cover;    /*背景图片拉伸以铺满全屏*/
    -ms-background-size: cover;
    -webkit-background-size: cover;
    background-size: cover;
}

更多接口

下面这个网站里收集了非常多的优质图片,并划分为三种类型(简约、二次元、游戏),您可以根据实际情况选择合适的接口来作为网站背景图片。

https://api.yuntuchuang.com/

相关推荐

《网站随机背景图片api调用接口,让网站每次刷新都变换为不同的背景图片》

《不使用任何第三方api接口,每次刷新网页都随机变换背景图片》

《专注且干净的壁纸下载网站,支持下载4K壁纸》

版权说明

转载自:本程序由孟坤博客开发,原文地址:https://mkblog.cn/492/ , 感谢原作者分享。

Responses