抓取Bing每日圖片作為網站首頁背景

来源:http://www.cnblogs.com/YQZXH/archive/2016/08/10/5756425.html
-Advertisement-
Play Games

把Bing搜索的背景圖片設置為自己網站的背景,實現背景及資訊的每日更新 效果圖如下: 理一下思路,首先我們要抓取Bing的每日圖片及最新資訊,然後保存圖片及信息到本地,最後顯示圖片及資訊到網站首頁。 第一步:抓取圖片 首先打開Bing,然後使用開發者工具 F12,點擊審查網頁元素,分析HTML結構如 ...


把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);

           });
})

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 參考: operatingfocus.bokee.com/3327857.html www.oschina.net/code/snippet_237505_8646 www.cnblogs.com/techdoc/archive/2010/12/22/1913521.html 一.多進程編程里常用的 ...
  • Nice Dcv 安裝部署文檔 1、安裝渲染伺服器系統 渲染伺服器即為安裝有高性能物理顯卡的伺服器。 本測試使用RHEL6.0_x64系統,安裝過程選擇安裝KVM虛擬化平臺,Desktops、Development軟體包。 安裝過程部分截圖: 安裝完成後,可使用命令行或圖形界面(setup)的方式配 ...
  • Python安裝完Numpy,SciPy和MatplotLib後,可以成為非常犀利的科研利器。網上關於這三個庫的安裝都寫得非常不錯,但是大部分人遇到的問題並不是如何安裝,而是安裝好後因為配置不當,在使用時總會出現import xxx error之類的錯誤。我也是自己摸索了很久才發現如何去正確配置的。 ...
  • 在進入大數據領域來,一直使用微軟的Azure HDInsight,當前在中國區僅支持在Windows系統上部署集群,雖然創建的過程很簡單,但對於開發人員來說,就是一個黑盒子,在更深入的研究和開發擴展的過程中,遇到了不少麻煩。因此準備在本地手工搭建自己的HDP2.4集群進行研究和學習, 第一步通過VM ...
  • 1 using NPOI.HSSF.UserModel; 2 using NPOI.POIFS.FileSystem; 3 using org.in2bits.MyXls; 4 using System; 5 using System.Collections.Generic; 6 using Sys ...
  • ASP.NET MVC Razor語法 ...
  • 前言 前一篇淺顯的述說了一下c#介面的作用,並用了一個不怎麼好的例子述說了一下。時隔一天,在看完大家的評論後我在論壇中查看了很多前輩們對c#介面的描述,發現大家對例子的說明不是太容易讓我們這些新人理解。接下來,就用我這個新手的角度再來闡述一遍。哈哈哈哈…… 理論改編故事 A公司在經過“百獸齊鳴”的事 ...
  • 什麼叫HTTP/2? HTTP 2.0即超文本傳輸協議 2.0,是下一代HTTP協議。是由互聯網工程任務組(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小組進行開發。是自1999年http1.1 發佈後的首個更新。HTTP 2.0在2013年8月 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...