抓取Bing每日图片作为网站首页背景

news/2024/5/10 2:42:37/文章来源:https://blog.csdn.net/weixin_30297281/article/details/95418434

把Bing搜索的背景图片设置为自己网站的背景,实现背景及资讯的每日更新

效果图如下:

理一下思路,首先我们要抓取Bing的每日图片及最新资讯,然后保存图片及信息到本地,最后显示图片及资讯到网站首页。

第一步:抓取图片

  首先打开Bing,然后使用开发者工具 F12,点击审查网页元素,分析HTML结构如下图:

     

  这里可以看到背景的图片地址,这就准备从HTML元素中获取图片链接了。于是我还下载了Jumony 一个提取网页元素的帮助类,来获取background-image的元素(Jumony的使用可以直接在NuGet管理中搜索Jumony,然后安装,最后记得引用命名空间,Jumony的详细使用请移步http://www.cnblogs.com/Ivony/p/3447536.html)

  

  结果发现 获取的HTML标签里并没有CSS的属性,那也就取不到 背景图片的URL了,然后怎么办呢?

  继续使用开发者工具查看Bing网页,发现了一个Ajax请求,返回了一个Json数据,如下图:

  

  说明这个请求返回的Json就是Bing的每日图片的信息,这就能得到图片信息的请求网址了,查看消息头:

  

  请求网址:http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&nc=1470798060031&pid=hp&video=1

  然后检测请求中可以省略的参数,最后得到URL:http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1

      接下来就需要在程序中获取Json数据,使用WebClient 进行网页请求:

  

  这时我们就要对Json进行解析,获取我们想要的数据,也就是背景图片的URL:

  对Json的解析有很多方法:Json转换为dataTable,Json反序列化,也有第三方组件等,

  这里用自己比较擅长的方法:VS自带的javaScriptSerializer类将wallejson转换为模型,这个模型根据返回的Json数据结构创建

  解析完之后就得到了图片的URL,根据WebClient的DownLoadFile()方法保存图片到本地;

  附上模型:

 1  //用于解析Bing返回的Json数据
 2 
 3 
 4     public class Walle
 5     {
 6         public  List<images> images { get; set; }
 7         public tooltips tooltips { get; set; }
 8     }
 9 
10     public class images
11     {
12         public string startdate { get; set; }
13         public string fullstartdate { get; set; }
14         public string enddate { get; set; }
15         public string url { get; set; }
16         public string urlbase { get; set; }
17         public string copyright { get; set; }
18         public string copyrightlink { get; set; }
19         public string wp { get; set; }
20         public string hsh { get; set; }
21         public string drk { get; set; }
22         public string top { get; set; }
23         public string bot { get; set; }
24         public List<int> hs { get; set; }
25 
26 
27     }
28 
29     public class tooltips
30     {
31         public string loading { get; set; }
32         public string previous { get; set; }
33         public string next { get; set; }
34         public string walle { get; set; }
35         public string walls { get; set; }
36 
37     }

 

 

第二步:获取每日资讯

  我们要获取这里的数据:

 

  继续使用开发者工具查看数据的位置:

  

  这就可以使用Jumony抓取数据了吧,和刚开始一样,

  结果很郁闷,在HTML页面中找不到类名为"hplaCata"的元素内容。

  仔细查看了网络连接后,发现了一个很有意思的事情:

  如下图:

     

  打开这个请求后:

  

    原来是个单独的页面,怪不得在原来的页面上找不到,接下来就好办了:

    保存这个页面的请求:http://cn.bing.com/cnhp/life?currentDate=20160809&IID=SERP.5045&IG=CC0CACB23C324D99A37ACF3604BF19FE,

  经过简单的测试,currentDate是当天的日期,其他的参数则不需要。

  下面直接看代码,根据Jumony抓取数据:

  

 string date = DateTime.Now.ToString("yyyyMMdd");//获取文本信息string BingUrl = "https://cn.bing.com/cnhp/life?currentDate="+date;var Source = new JumonyParser().LoadDocument(BingUrl);string Title="";string Text="";//标题foreach (var item in Source.Find(".hplaCata > .hplatt")){Title = item.InnerText();}//文本foreach (var item in Source.Find("#hplaSnippet")){Text = item.InnerText();}

 

 

第三步:保存数据到本地

    前面两步已经获取到了图片以及资讯,然后应该保存数据了,

    一般来说我们都是保存图片路径 和 资讯数据到数据库,不过需求是替换原来的网站首页背景,偏向于对UI的改进,再动数据库就不太合适了。

    而且,图片会每日更新,系统则自动获取,这些数据只提供每天的查询,写操作则一天一次。

    解决思路:图片以当前日期为文件名,资讯信息以XML形式,文件名也是当前日期(如20160810)保存到网站目录下,每次首页加载都会查看以当前日期为文件名的Xml文件或JPG文件是否存在,不存在就执行程序抓取Bing图片和每日资讯,存在则获取数据传递给首页显示。

    保存资讯为XML,这里我用的是XmlSerializer,将Model转换并创建XML文件,这个Model主要根据保存的信息来创建,字段有: 标题,副标题,文本信息,图片路径,当前日期。获取数据时反序列化XML为Model;    

    模型:

    

 1  /// <summary>
 2     /// 用于保存和传输Bing背景图片及文本信息
 3     /// </summary>
 4     public  class BgImages
 5     {
 6         /// <summary>
 7         /// 标题
 8         /// </summary>
 9         public string Title { get; set; }
10 
11         /// <summary>
12         /// 副标题
13         /// </summary>
14         public string STitle { get; set; }
15         /// <summary>
16         /// 文本
17         /// </summary>
18         public string Text { get; set; }
19         /// <summary>
20         /// 图片路径
21         /// </summary>
22         public string Url { get; set; }
23         /// <summary>
24         /// 保存日期
25         /// </summary>
26         public string Date { get; set; }
27     }
View Code

 

    

    附上控制器内完整代码:      

  1    #region  联网抓取图片
  2 
  3         /// <summary>
  4         /// 读取背景信息
  5         /// </summary>
  6         /// <returns></returns>
  7         public ActionResult ReturnBgInfo()
  8         {
  9             //读取XML文件
 10             string Path = Server.MapPath("/Images/BingInfo/" + DateTime.Now.ToString("yyyyMMdd") + ".xml");
 11 
 12             FileInfo file = new FileInfo(Path);
 13 
 14             if (!file.Exists)
 15             {
 16                 GetNewBing();
 17             }
 18 
 19             FileStream files = new FileStream(Path, FileMode.Open);
 20             XmlSerializer xml = new XmlSerializer(typeof(BgImages));
 21             BgImages BgImage = (BgImages)xml.Deserialize(files);
 22             files.Close();
 23 
 24             return Json(BgImage);
 25 
 26         }
 27 
 28         /// <summary>
 29         /// //联网抓取图片
 30         /// </summary>
 31         public void GetNewBing()
 32         {
 33             string date = DateTime.Now.ToString("yyyyMMdd");
 34 
 35 
 36             //获取文本信息
 37             string BingUrl = "https://cn.bing.com/cnhp/life?currentDate=" + date;
 38 
 39             var Source = new JumonyParser().LoadDocument(BingUrl);
 40             string Title = "";
 41             string Text = "";
 42             string STitle = "";
 43 
 44             //标题
 45             foreach (var item in Source.Find(".hplaCata > .hplatt"))
 46             {
 47                 Title = item.InnerText();
 48             }
 49 
 50             //副标题
 51             foreach (var item in Source.Find(".hplaCata > .hplats"))
 52             {
 53                 STitle = item.InnerText();
 54             }
 55 
 56             //文本
 57             foreach (var item in Source.Find("#hplaSnippet"))
 58             {
 59                 Text = item.InnerText();
 60             }
 61 
 62 
 63             //Bing网址
 64             string url = "http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1";
 65 
 66             //获取Bing的图片 Json数据
 67             WebClient BingClient = new WebClient();
 68             BingClient.Encoding = System.Text.Encoding.UTF8;//定义对象的编码语言,此处或者是gb2312
 69             string wallejson = BingClient.DownloadString(url);
 70 
 71             if (wallejson != "null")
 72             {
 73                 //解析Json数据
 74                 JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
 75                 Walle walleinfo = javaScriptSerializer.Deserialize<Walle>(wallejson);
 76 
 77                 //保存图片到本地
 78                 string ImagePath = DateTime.Now.ToString("yyyyMMdd") + ".JPG";
 79                 BingClient.DownloadFile(walleinfo.images.First().url, Server.MapPath("/Images/BingInfo/") + ImagePath);
 80 
 81                 //保存信息到Model -- BgImages
 82                 BgImages model = new BgImages();
 83                 model.Date = walleinfo.images.First().enddate;
 84                 model.Text = Text;
 85                 model.Title = Title;
 86                 model.STitle = STitle;
 87                 model.Url = "/Images/BingInfo/" + ImagePath;
 88 
 89                 string xmlPath = Server.MapPath("/Images/BingInfo/" + DateTime.Now.ToString("yyyyMMdd") + ".xml");
 90 
 91                 //序列化XML
 92                 CreateXML(model, xmlPath);
 93 
 94             }
 95 
 96         }
 97 
 98 
 99 
100 
101         #region   XML序列化
102         public void CreateXML(BgImages model, string Path)
103         {
104             FileStream fs = new FileStream(Path, FileMode.Create);
105             //执行XML序列化
106             XmlSerializer xml = new XmlSerializer(typeof(BgImages));
107             xml.Serialize(fs, model);
108             fs.Close();
109         }
110         #endregion
111         #endregion
View Code

 

    

第四步:数据显示在首页

  因为网站首页的左侧背景图是一个母版页,所以图片的显示主要通过js来实现。

  在页面加载时,使用Ajax请求在后台获取数据,

  代码如下:

 $(document).ready(function () {//加载背景图片及文本信息$.post("/Test/ReturnBgInfo",function (data) {$("#animate-area").css("background-image", "url(" + data.Url + ")");$("#Title").html(data.Title);$("#STitle").html(data.STitle);$("#Text").html(data.Text);});
})

  

 

转载于:https://www.cnblogs.com/YQZXH/p/5756425.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_756303.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core 控制台如何嵌入运行 Web API网站?

【导读】我们知道在.NET Framework中可以嵌入运行Web APi&#xff0c;那么在.NET Core&#xff08;.NET 6称之为.NET&#xff09;中如何内嵌运行Web Api呢&#xff0c;在实际项目中这种场景非常常见&#xff0c;那么我们本节以.NET 6.0作为演示示例一起来瞅瞅。内嵌运行.NET Co…

【问题解决】Chrome浏览器:该网站使用HSTS。网络错误...此页面稍后可能会工作之解决方法

【问题解决】Chrome浏览器&#xff1a;该网站使用HSTS。网络错误…此页面稍后可能会工作之解决方法 原文地址&#xff1a; https://blog.csdn.net/weixin_43486390/article/details/96860374 这里我偷懒了&#xff0c;直接把别人解决过的方法直接搬过来了&#xff0c;不过&…

源码托管网站推荐——OKSvn

在团队开发时&#xff0c;没使用SVN或者其他版本控制工具必将带来很多不必要的麻烦。在本机搭建SVN的方法虽然可行&#xff0c;但你不能保证你的电脑一直处于运行状态&#xff0c;显然是很不方便的。 我们知道&#xff0c;新浪、谷歌都有项目托管&#xff0c;由于网速不给力&am…

建站手册-网站构建:万维网联盟(World Wide Web Consortium)

ylbtech-建站手册-网站构建&#xff1a;万维网联盟&#xff08;World Wide Web Consortium&#xff09;1.返回顶部 1、http://www.w3school.com.cn/site/site_w3c.asp2、2.返回顶部1、万维网联盟&#xff08;W3C&#xff09;创立了 WWW 标准。 W3C 的使命是通过发展规范、指导方…

数据分析案例(5)利用MYSQL+Python对某网站的用户数进行分析

数据与代码链接&#xff1a; https://pan.baidu.com/s/1vF3hzzI83tDDVl-kM03shQ 提取码&#xff1a;0202 user.sql文件大家自行导入mysql数据库中&#xff0c;我是放在了test01数据库中 数据由于是存储在MYsql数据库的&#xff0c;因此我们需要利用Python连接mysql数据库&…

discuz html5 手机,Discuz正式推出移动端社区建站工具Discuz Q

从黯然离场到二次上线&#xff0c;Discuz近期正式上线移动端社区建站软件Discuz Q&#xff0c;鼎力支持站长专属私域流量经营!了解到&#xff0c;Discuz! Q简单讲就是一套手机端的社区建站软件&#xff0c;核心就是帮助站长经营移动端私域流量&#xff0c;快速内容变现 &#x…

微信网站防屏蔽防红的措施以及微信域名检测API等工具的技术原理

为什么关心这种技术&#xff1f;因为我经常听到身边搞微商、搞微信项目的朋友都在叫苦连天&#xff0c;由于微信域名屏蔽、微信域名被拦截、弄得他们尸横遍野&#xff0c;损失的连过年回家的路费都没了&#xff0c;曾经的叱咤风云一下变成了今日的倒亏损。腾讯对微信中推广活动…

数字藏品交易平台开发 数字藏品交易网站开发

“数字藏品是运用电子信息技术促进文化艺术&#xff0c;尤其是传统式文化创意产业概率界限的移位&#xff0c;是推动文化创意产业使用价值和价值活起來的媒介。"12月21日&#xff0c;河北省博物院副院长赵志良在“用数赋智推动中华文化艺术创造力转换、创新能力发展趋势&q…

区块链nft网站开发 NFT数字藏品网站开发

虽然NFT自从2017年以来一直存在&#xff0c;NFT他们最初被用于加密社区内的边缘例&#xff08;收集加密猫&#xff09;。然而四年了&#xff0c;我们见证了艺术家&#xff0c;设计师&#xff0c;游戏开发者&#xff0c;音乐家和作家对这项技术的采用&#xff0c;在DEFI出现之前…

java中添加音乐_[Java教程]如何在网站中添加音乐

[Java教程]如何在网站中添加音乐0 2014-10-19 17:00:42来源&#xff1a;http://www.ido321.com/1042.html发现有很多的个人博客中添加了背景音乐&#xff0c;以增强用户体验。LZ搜集到了两种在网站中添加音乐的方式。一、豆瓣的FM这个非常简单&#xff0c;一段代码就可以实现。…

藏头诗php网站源码,四、中英翻译、歌词、藏头诗、智能聊天

中英翻译、歌词、藏头诗、智能聊天此章接口都来源于:http://api.ajaxsns.com/ ,感谢作者的无私奉献。先看效果图代码如下:1、共同方法private function _ajaxsns_comm($msg){$paramarray("key" > "free","appid" > "0","ms…

3.在Visual Studio 2017 下创建ASP.NET网站程序

1.文件——新建——项目 2.在新弹出来的窗口上选择Visual C#&#xff0c;然后选择ASP.NET Web 应用程序&#xff08;.NET Framework&#xff09;,然后点击确定 这里要注意下面的名称&#xff0c;位置&#xff0c;方案名称&#xff0c;需要改的就改了吧&#xff0c;新手还是一切…

存储过程可重用的代码块_GitHub推出新功能Actions,直接网站上构建、共享和执行代码...

​【新智元导读】GitHub推出了一个新版本的GitHub Actions测试版&#xff0c;内置了持续集成和交付功能。GitHub表示&#xff0c;它现在拥有4000多万用户。GitHub Actions是一个用于GitHub的因果关系的API&#xff0c;即基于任何事件协调任何工作流&#xff0c;与此同时GitHub负…

网页左侧导航栏点击怎么显示右侧内容_网站导航条应该怎么设计才比较易用

企业在做网站建设的时候需要&#xff0c;导航条是一个关键部分&#xff0c;一个明了易用的网站导航条能让用户在浏览网站的时候快速明确找到自己想要的页面&#xff0c;相当于网站的指路牌&#xff0c;所以导航条需要重点设计。那么如何才能设计出简单易用的网站导航条呢&#…

博文视点大讲堂41期-SEO难点之网站内部链接结构

博文视点大讲堂41期 SEO难点之网站内部链接结构 SEO是什么&#xff1f; 虽然这些年SEO概念普及了&#xff0c;但在很多人眼里&#xff0c;SEO和作弊、欺骗是一回事儿。这是对SEO的极大误解。 SEO是个强有力的工具&#xff0c;能以很合理的方式进行&#xff0c;既照顾到用户需求…

java setaccessible_「accessible」Java反射中的setAccessible()方法是否破坏了类的访问规则 - seo实验室...

accessiblejava反射机制提供的setaccessible()方法可以取消Java的权限控制检查&#xff0c;下面展示了这种方法的使用。package test;import java.lang.reflect.field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;class A {private i…

宝塔Linux301重定向,宝塔面板如何做网站301重定向跳转

网站301重定向对于我们日后做SEO还是挺重要的&#xff0c;它是指是一条对网站浏览器的指令&#xff0c;来显示浏览器被要求显示的不同的URL&#xff0c;当一个网页经历过其URL的最后一次变化以后时使用。一个永久定向是一种服务器端的重定向&#xff0c;能够被搜索引擎蜘蛛适当…

服务器运行堵塞 负载%100,小白站长如何快速了解网站服务器的运行状况

我们的网站服务器预装系统:CentOS Linux 7.6.1810 (Core)。对于小白站长来讲&#xff0c;因为宝塔管理面板是现在非常流行的一款免费的Windows/Linux管理应用&#xff0c;所以服务器安装这个应用&#xff0c;并安装Nginx -Tengine2.2.3运行环境&#xff0c;其可视化操作界面&am…

php课设源代码网站,php精品课程教学网站在线发布系统

功能需求3.3.1 学生部分1&#xff1a;课程展台&#xff1a;为学生提供课程操作平台。1) 课程简介&#xff1a;显示课程的基本情况的介绍&#xff1b;2) 教学大纲&#xff1a;显示课程的教学大纲内容&#xff1b;3) 授课计划&#xff1a;显示课程的授课计划&#xff1b;4) 备课教…

linux保险箱软件,360保险箱的保护功能 - 不怕盗号木马 奇虎360保险箱抢鲜试用(组图)_Linux安全_Linux公社-Linux系统门户网站...

360保险箱的保护功能二、360保险箱的保护功能保护功能是360保险箱的主要功能&#xff0c;在保护功能下共有“安全启动”、“正在保护”、“保护历史”三个标签。在安全启动这一项上&#xff0c;对应的程序类型有“聊天工具”、“网络游戏”、“网络银行”三种类型。其中聊天工具…