把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. public class Walle
  4. {
  5. public List<images> images { get; set; }
  6. public tooltips tooltips { get; set; }
  7. }
  8.  
  9. public class images
  10. {
  11. public string startdate { get; set; }
  12. public string fullstartdate { get; set; }
  13. public string enddate { get; set; }
  14. public string url { get; set; }
  15. public string urlbase { get; set; }
  16. public string copyright { get; set; }
  17. public string copyrightlink { get; set; }
  18. public string wp { get; set; }
  19. public string hsh { get; set; }
  20. public string drk { get; set; }
  21. public string top { get; set; }
  22. public string bot { get; set; }
  23. public List<int> hs { get; set; }
  24.  
  25. }
  26.  
  27. public class tooltips
  28. {
  29. public string loading { get; set; }
  30. public string previous { get; set; }
  31. public string next { get; set; }
  32. public string walle { get; set; }
  33. public string walls { get; set; }
  34.  
  35. }

 

第二步:获取每日资讯

  我们要获取这里的数据:

  1.  

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

  

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

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

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

  如下图:

  打开这个请求后:

  

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

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

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

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

  

  1. string date = DateTime.Now.ToString("yyyyMMdd");
  2.  
  3. //获取文本信息
  4. string BingUrl = "https://cn.bing.com/cnhp/life?currentDate="+date;
  5.  
  6. var Source = new JumonyParser().LoadDocument(BingUrl);
  7. string Title="";
  8. string Text="";
  9.  
  10. //标题
  11. foreach (var item in Source.Find(".hplaCata > .hplatt"))
  12. {
  13. Title = item.InnerText();
  14. }
  15.  
  16. //文本
  17. foreach (var item in Source.Find("#hplaSnippet"))
  18. {
  19. Text = item.InnerText();
  20. }

第三步:保存数据到本地

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

    一般来说我们都是保存图片路径 和 资讯数据到数据库,不过需求是替换原来的网站首页背景,偏向于对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. }

    

    附上控制器内完整代码:      

  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. string BingUrl = "https://cn.bing.com/cnhp/life?currentDate=" + date;
  37.  
  38. var Source = new JumonyParser().LoadDocument(BingUrl);
  39. string Title = "";
  40. string Text = "";
  41. string STitle = "";
  42.  
  43. //标题
  44. foreach (var item in Source.Find(".hplaCata > .hplatt"))
  45. {
  46. Title = item.InnerText();
  47. }
  48.  
  49. //副标题
  50. foreach (var item in Source.Find(".hplaCata > .hplats"))
  51. {
  52. STitle = item.InnerText();
  53. }
  54.  
  55. //文本
  56. foreach (var item in Source.Find("#hplaSnippet"))
  57. {
  58. Text = item.InnerText();
  59. }
  60.  
  61. //Bing网址
  62. string url = "http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1";
  63.  
  64. //获取Bing的图片 Json数据
  65. WebClient BingClient = new WebClient();
  66. BingClient.Encoding = System.Text.Encoding.UTF8;//定义对象的编码语言,此处或者是gb2312
  67. string wallejson = BingClient.DownloadString(url);
  68.  
  69. if (wallejson != "null")
  70. {
  71. //解析Json数据
  72. JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
  73. Walle walleinfo = javaScriptSerializer.Deserialize<Walle>(wallejson);
  74.  
  75. //保存图片到本地
  76. string ImagePath = DateTime.Now.ToString("yyyyMMdd") + ".JPG";
  77. BingClient.DownloadFile(walleinfo.images.First().url, Server.MapPath("/Images/BingInfo/") + ImagePath);
  78.  
  79. //保存信息到Model -- BgImages
  80. BgImages model = new BgImages();
  81. model.Date = walleinfo.images.First().enddate;
  82. model.Text = Text;
  83. model.Title = Title;
  84. model.STitle = STitle;
  85. model.Url = "/Images/BingInfo/" + ImagePath;
  86.  
  87. string xmlPath = Server.MapPath("/Images/BingInfo/" + DateTime.Now.ToString("yyyyMMdd") + ".xml");
  88.  
  89. //序列化XML
  90. CreateXML(model, xmlPath);
  91.  
  92. }
  93.  
  94. }
  95.  
  96. #region XML序列化
  97. public void CreateXML(BgImages model, string Path)
  98. {
  99. FileStream fs = new FileStream(Path, FileMode.Create);
  100. //执行XML序列化
  101. XmlSerializer xml = new XmlSerializer(typeof(BgImages));
  102. xml.Serialize(fs, model);
  103. fs.Close();
  104. }
  105. #endregion
  106. #endregion

    

第四步:数据显示在首页

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

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

  代码如下:

  1. $(document).ready(function () {
  2.  
  3. //加载背景图片及文本信息
  4. $.post(
  5. "/Test/ReturnBgInfo",
  6. function (data) {
  7.  
  8. $("#animate-area").css("background-image", "url(" + data.Url + ")");
  9. $("#Title").html(data.Title);
  10. $("#STitle").html(data.STitle);
  11. $("#Text").html(data.Text);
  12.  
  13. });
  14. })

  

抓取Bing每日图片作为网站首页背景的更多相关文章

  1. 【PHP】使用PHP抓取Bing每日图像并为己所用

    Bing搜索的首页每天都会推送一张很漂亮的图片,把它保存下来,当做电脑桌面或是自己的网站背景图还不是美滋滋…… 今天的bing图片是这样的 既然要抓取这张图片,首先就得弄清这张图是从何而来的.经过对必 ...

  2. 获取Bing每日图片API接口

    bing图片每日更新,对于这一点感觉挺不错的,如果能够把bing每日图片作为博客背景是不是很不错呢?首先我们进入Bing首页,会发现自动转到中国版.不过这没关系,中国版更符合国情,速度也比国际版快一些 ...

  3. python抓取bing主页背景图片

    最初Python2写法: #!/usr/bin/env python # -*- coding:utf-8 -*- # -*- author:nancy -*- # python2抓取bing主页所有 ...

  4. PHP批量抓取远程网页图片并存到本地实现方法和源码

    做为一个仿站工作者,当遇到网站有版权时甚至加密的时候,WEBZIP也熄火,怎么扣取网页上的图片和背景图片呢.有时候,可能会想到用火狐,这款浏览器好像一个强大的BUG,文章有版权,屏蔽右键,火狐丝毫也不 ...

  5. 使用wget工具抓取网页和图片 成功尝试

    使用wget工具抓取网页和图片 发表于1年前(2014-12-17 11:29)   阅读(2471) | 评论(14) 85人收藏此文章, 我要收藏 赞7 wget 网页抓取 图片抓取 目录[-] ...

  6. 使用wget工具抓取网页和图片 及 相关工具几个

    想保存一些网页,最后找到这 wget 的 shell脚本,虽然不是太理想,亲测可用呢. 使用wget工具抓取网页和图片   来源 https://my.oschina.net/freestyletim ...

  7. 必应(Bing)每日图片获取API

    必应(Bing)每日图片获取API January 11, 2015 API http://lab.dobyi.com/api/bing.php 介绍 Value Description title ...

  8. python学习-抓取知乎图片

    #!/bin/usr/env python3 __author__ = 'nxz' """ 抓取知乎图片webdriver Chromedriver驱动需要安装,并指定d ...

  9. 【Python爬虫程序】抓取MM131美女图片,并将这些图片下载到本地指定文件夹。

    一.项目名称 抓取MM131美女写真图片,并将这些图片下载到本地指定文件夹. 共有6种类型的美女图片: 性感美女 清纯美眉 美女校花 性感车模 旗袍美女 明星写真 抓取后的效果图如下,每个图集是一个独 ...

随机推荐

  1. Linux查看系统版本信息的

    // 显示电脑以及操作系统的相关信息 uname -a // 正在运行的内核版本 cat /proc/version // 显示的是发行版本信息 cat /etc/issue // 适用于所有的lin ...

  2. UltraISO PE(软碟通) v9.6.2.3059 注册码

    注册码: 王涛7C81-1689-4046-626F

  3. Storm系列(十)聚流示例

    功能:将多个数据源的数据汇集到一个处理单元进行集中分类处理: 入口类TestMain 1  ; i < size; i++) { 31              content += input ...

  4. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep解决方法

    14/03/26 23:10:04 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:10020. Already tried ...

  5. HW2.20

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  6. gcc编译选项的循环重复查找依赖库等命令

    link时,若liba.a依赖libb.a,若这样写 -lb -la,则链接通不过,gcc有个选项:-Xlinker ,可以让gcc在链接时反复查找依赖库,用法 : gcc -shared -o li ...

  7. win7下wubi安装Ubuntu,重装win7后找回Ubuntu启动项

    怀念一下我的win7,使用了将近5年,最近终于慢慢处于崩溃且无法修复的状态. 还是重新安装了. 原本是win7下使用wubi安装Ubuntu.重装win7后,肯定没有了Ubuntu的启动项. 具体恢复 ...

  8. novnc ignoring socket not reay

  9. passwnger

    环境:ubuntu10.04 + nginx + passenger + ruby1.8.7 rails2.3.x #安装nginx(手动编译) $  mkdir -p /home/mouse/opt ...

  10. A Plain English Guide to JavaScript Prototypes

    When I first started learning about JavaScript object model my reaction was of horror and disbelief. ...