杭州浩海教育諮詢有限公司張景舒做客《逐夢年代》_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

在教育國際化背景下,不少家長選擇讓孩子在學習母語之外,學習另一種語言以提高孩子的核心競爭力,英語作為普及率較高的語言之一成為了不少家長的選擇。而隨着家長教育思想的轉變、國家政策的支持,不少家長選擇讓孩子出國留學。在出國前,家長和孩子往往會遇到各式各樣的問題,憑個人能力無法準確拿捏。近日,《逐夢年代》欄目組有幸請到了這樣一位嘉賓,他的企業能夠對想要出國留學的孩子提供很大的幫助,一起來分享他的教育情懷。

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

本期訪談嘉賓張景舒,杭州浩海教育諮詢有限公司董事長、浩海聯合創始人,“你好-故事”公益組織的創始人。曾獲得詹姆斯格萊格獎(康奈爾大學工程學院最高獎),康奈爾大學“歐”創業競賽銀牌,麻省理工學院脫口秀第一名, 曾任職於沃帝華等知名量化對沖基金。橫跨文學、工程、商科三個領域,擁有豐富的知識、閱歷儲備。張景舒坦言,自身的留學經歷曾因為不靠譜的留學中介帶來了陰霾,高考的分數只夠申請密歇根大學,在自身的不斷努力之下,成功轉學到康奈爾大學,為了幫助更多有留學夢的師弟師妹,他毅然投入到這份事業中來,為學子們帶來最專業的留學諮詢。

浩海留學是一家專註於美英高端留學的教育諮詢機構。機構由美國哈佛大學、麻省理工學院、康奈爾大學、密歇根大學、牛津大學、劍橋大學等知名學府畢業生創立,旨在為廣大中國赴英美留學生提供高端且專業的留學諮詢服務。不同於傳統留學中介,浩海留學智創的“互聯網+共享顧問”新模式能夠給每一位學生提供同專業名校畢業且奮戰在該領域一線的專業導師,為其量身定製該專業的背景提升規劃,申請指導,文書創作,以及就業指導來幫助申請者以相同的分數獲得更好的錄取結果;同時,公司理念區別於一般機構的“包辦”模式,浩海秉承“全程協同”、“全程透明“的模式,用心讓每個孩子找到自己的價值,挖掘出自己的潛力。

文書作為出國留學的申請材料之一,一直以來處於重要地位,因為它不僅能向錄取院校從各個角度展現申請者的求學動機,學術學習能力,還是唯一可以和招生官直接溝通的機會。正是意識到了文書的重要性,張景舒開始致力於為學生量身定製,提供個性化的教育諮詢服務,幫助學生打造最優質的軟背景,讓他們在這個國際競技舞台上脫穎而出,圓夢名校。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

喜看南水潤津沽_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

“通水啦!我們喝到江水啦!”11月30日上午,天津武清區丁家酄村,村民張彥忠擰開水龍頭,看着清澈的水嘩嘩流出,話語中洋溢着喜悅。

  “使用南水后,原水水質常規監測大部分指標一直保持在地表水Ⅱ類標準及以上。自來水出廠水、管網水濁度明顯下降,市民飲用水口感顯著提升。”天津水務集團生產技術和信息部副部長季洪德說。

  2014年12月12日,南水北調中線工程正式通水。漢江水自丹江口水庫啟程奔騰北上,到達南水北調中線工程天津幹線終點——曹庄泵站,由此進入天津的千家萬戶。漢江水也成為繼上世紀80年代的引灤入津工程后,天津又一條城市供水生命線。

  5年間,中線工程連續不間斷安全供水,水質穩定達標,累計45億立方米的供水量,相當於一個滿庫容的密雲水庫水量。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

  2018年起,天津啟動新一輪農村飲水提質增效工程,通過延伸自來水供水範圍、改擴建供水設施、改造老舊管網等措施,以優質自來水替代地下水源,全面提升2061個村、202.2萬人供水質量。目前,南水已覆蓋天津16個行政區中的14個,全市1000多萬居民受益。至明年工程全部完成后,絕大多數農村居民將喝上自來水。

  供水量持續增加,生態補水有底氣。天津南部的北大港濕地是東亞—澳大利亞候鳥遷徙的重要通道和驛站,每年冬季前後到此停歇和棲息的鳥類達上百萬隻。“截至目前總共觀測到鳥類276種,比2015年多了27種。”北大港濕地自然保護區管理中心野保科負責人孫洪義說。自去年10月啟動北大港水庫應急調水以來,北大港水庫累計入庫水量2.95億立方米,水庫蓄水量由干庫狀況增加至1.88億立方米,水面面積由不足30平方公里增加至119平方公里。

  2016年起,天津逐步實現對中心城區重點河道的常態化補水,年均生態補水10億立方米以上,進一步提高了河湖水系連通循環能力。

  截至2018年底,天津深層地下水開採量降至1.5億立方米,預計到2022年,全市地下水超採區基本實現零開採。《2018年天津市水資源公報》显示,2018年,平原淡水區淺層地下水年末存儲量比年初增加0.62億立方米。

  “南水來之不易,天津將落實好最嚴格水資源管理制度,深入推動節水型社會創建,讓清澈甘甜的江水持久造福津門大地。”天津市水務局局長張志頗說。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

單例模式,反射破環?_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

餓漢式

// 餓漢式單例
public class Hungry {
    
    //構造器私有
    private Hungry(){

    }
    // 一上來就把這個類加載了
    private final static  Hungry HUNGRY = new Hungry();

    public static Hungry getInstance(){
        return HUNGRY;
    }
}
// 餓漢式單例
public class Hungry {
    // 這4組數據非常耗內存資源,餓漢式一上來就把所有的內存裏面的東西全部加載進來了,就存在這個空間
    // 但這個空間現在是沒有使用的,可能會造成浪費空間
    private byte[] data1 = new byte[1024*1024];
    private byte[] data2 = new byte[1024*1024];
    private byte[] data3 = new byte[1024*1024];
    private byte[] data4 = new byte[1024*1024];
    
    //構造器私有
    private Hungry(){

    }
    // 一上來就把這個類加載了
    private final static  Hungry HUNGRY = new Hungry();

    public static Hungry getInstance(){
        return HUNGRY;
    }

}

餓漢式單例可能會造成浪費空間,所以想要用的時候再去創建這個對象,平時就先放在這個地方,於是就出現了懶漢式!

懶漢式

// 懶漢式單例
public class LazyMan {
	
   // 構造器私有
    private LazyMan(){
       
    }

    private  static LazyMan lazyMan;

   
    public static LazyMan getInstance(){
       
        if (lazyMan==null){
            lazyMan = new LazyMan(); 
        }
        return lazyMan;
    }
}

它是有問題的,單線程下確實單例ok,多線程併發就會出現問題!

測試

// 懶漢式單例
public class LazyMan {
	
   // 構造器私有
    private LazyMan(){
       System.out.println(Thread.currentThread().getName()+":: ok");
    }

    private  static LazyMan lazyMan;

   
    public static LazyMan getInstance(){
       
        if (lazyMan==null){
            lazyMan = new LazyMan(); 
        }
        return lazyMan;
    }
    
    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                LazyMan.getInstance();
            }).start();
        }
    }
}

發現單例有問題,每次結果可能都不一樣!

解決

// 懶漢式單例
public class LazyMan {


    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+":: ok");
    }

    private  static LazyMan lazyMan;

    // 雙重檢測鎖模式的 懶漢式單例 DCL懶漢式
    public static LazyMan getInstance(){
        if (lazyMan==null){
            synchronized (LazyMan.class){
                if (lazyMan==null){
                    lazyMan = new LazyMan(); 
                }
            }
        }
        return lazyMan;
    }

     public static void main(String[] args) {

         for (int i = 0; i < 10 ; i++) {
             new Thread(()->{
                LazyMan.getInstance();
             }).start();
         }
     }
}

但在極端情況下還是可能出現問題

經歷三個步驟:

1、 分配內存空間

2、 執行構造方法,初始化對象

3、 把這個對象指向這個空間

有可能會發生指令重排的操作!

比如,期望它執行 123 ,但是它真實可能執行132,比如第一個A線程過來執行了132,先分配空間再吧這個空間佔用了,佔用之後再去執行構造方法,如果現在突然來了個B線程,由於A已經指向這個空間了,它會以為這個 lazyMan 不等於 null ,直接return ,此時lazyMan還沒有完成構造,所以必須避免這個問題!

必須加上volatile

// 懶漢式單例
public class LazyMan {


    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+":: ok");
    }
	// 避免指令重排
    private volatile static LazyMan lazyMan;

    // 雙重檢測鎖模式的 懶漢式單例 DCL懶漢式
    public static LazyMan getInstance(){
        if (lazyMan==null){
            synchronized (LazyMan.class){
                if (lazyMan==null){
                    lazyMan = new LazyMan(); 
                }
            }
        }
        return lazyMan;
    }

     public static void main(String[] args) {

         for (int i = 0; i < 10 ; i++) {
             new Thread(()->{
                LazyMan.getInstance();
             }).start();
         }
     }
}

靜態內部類

// 靜態內部類
public class Holder {
    private Holder(){

    }
    public static Holder getInstance(){
        return InnerClass.HOLDER;
    }
    public static  class InnerClass{
        private static final Holder HOLDER = new Holder();
    }
}

也是單例模式的一種,不安全!

單例不安全 反射

// 懶漢式單例
public class LazyMan {


    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+":: ok");
    }

    private volatile static LazyMan lazyMan;

    // 雙重檢測鎖模式的 懶漢式單例 DCL懶漢式
    public static LazyMan getInstance(){
        if (lazyMan==null){
            synchronized (LazyMan.class){
                if (lazyMan==null){
                    lazyMan = new LazyMan(); //不是一個原子性操作
                }
            }
        }
        return lazyMan;
    }


    //反射
     public static void main(String[] args) throws Exception {
         LazyMan instance1 = LazyMan.getInstance();
         Constructor<LazyMan> declaredConstructor = LazyMan.class.getDeclaredConstructor(null);
         declaredConstructor.setAccessible(true); // 無視了私有的構造器
         // 通過反射創建對象
         LazyMan instance2 = declaredConstructor.newInstance();

         System.out.println(instance1);
         System.out.println(instance2);
     }
}

結論:反射可以破壞這種單例

解決

// 懶漢式單例
public class LazyMan {

    private LazyMan(){
        synchronized (LazyMan.class){
            if (lazyMan!=null){
                throw new RuntimeException("不要試圖使用反射破環 異常");
            }
        }
        System.out.println(Thread.currentThread().getName()+":: ok");
    }

    private volatile static LazyMan lazyMan;

    // 雙重檢測鎖模式的 懶漢式單例 DCL懶漢式
    public static LazyMan getInstance(){
        if (lazyMan==null){
            synchronized (LazyMan.class){
                if (lazyMan==null){
                    lazyMan = new LazyMan(); //不是一個原子性操作
                }
            }
        }
        return lazyMan;
    }

    //反射
     public static void main(String[] args) throws Exception {
         LazyMan instance1 = LazyMan.getInstance();
         Constructor<LazyMan> declaredConstructor = LazyMan.class.getDeclaredConstructor(null);
         declaredConstructor.setAccessible(true); // 無視了私有的構造器
         // 通過反射創建對象
         LazyMan instance2 = declaredConstructor.newInstance();

         System.out.println(instance1);
         System.out.println(instance2);
     }
}

但是如果都用反射創建對象的情況下,還是會破環單例!

測試

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

解決

// 懶漢式單例
public class LazyMan {
      // 標誌位
    private static boolean abc = false;

    private LazyMan(){
        synchronized (LazyMan.class){
            if (abc==false){
                abc=true;
            }else {
                throw new RuntimeException("不要試圖使用反射破環 異常");
            }
          
        }
        System.out.println(Thread.currentThread().getName()+":: ok");
    }
    private volatile static LazyMan lazyMan;

    // 雙重檢測鎖模式的 懶漢式單例 DCL懶漢式
    public static LazyMan getInstance(){
        if (lazyMan==null){
            synchronized (LazyMan.class){
                if (lazyMan==null){
                    lazyMan = new LazyMan(); //不是一個原子性操作
                }
            }
        }
        return lazyMan;
    }

    //反射
    public static void main(String[] args) throws Exception {
        //LazyMan instance1 = LazyMan.getInstance();
        Constructor<LazyMan> declaredConstructor = LazyMan.class.getDeclaredConstructor(null);
        declaredConstructor.setAccessible(true); // 無視了私有的構造器
        // 通過反射創建對象
        LazyMan instance2 = declaredConstructor.newInstance();
        LazyMan instance1 = declaredConstructor.newInstance();

        System.out.println(instance1);
        System.out.println(instance2);
    }
}

但是如果被人知道 abc這個變量,也可以破環!

單例又被破環了!

看一下源碼

它說不能使用反射破環枚舉,枚舉是jdk1.5出現的,自帶單例模式!

測試,寫一個枚舉類

// enum 本身就是一個class類
public enum EnumSingle {

    INSTANCE;
    public EnumSingle getInstance(){
        return INSTANCE;
    }
}

查看它的源碼

試圖破環!

// enum 本身就是一個class類
public enum EnumSingle {

    INSTANCE;
    public EnumSingle getInstance(){
        return INSTANCE;
    }
}
class Test{
    public static void main(String[] args) throws Exception {
        EnumSingle instance1 = EnumSingle.INSTANCE;
        Constructor<EnumSingle> declaredConstructor = EnumSingle.class.getDeclaredConstructor(null);
        declaredConstructor.setAccessible(true);
        EnumSingle instance2 = declaredConstructor.newInstance();
        System.out.println(instance1);
        System.out.println(instance2);
    }
}

它竟然說我現在的這個枚舉類中沒有空參構造器!

然後就去源碼里分析!

找到這個class文件!利用javap反編譯一下!

發現這個也显示有一個空參構造,證明這個也不對,用第三方的工具查看!

利用它再吧class文件生成java文件!

打開這個java文件

證明是idea和源碼騙了我!

再次嘗試破環!

// enum 本身就是一個class類
public enum EnumSingle {

    INSTANCE;
    public EnumSingle getInstance(){
        return INSTANCE;
    }
}
class Test{
    public static void main(String[] args) throws Exception {
        EnumSingle instance1 = EnumSingle.INSTANCE;
        Constructor<EnumSingle> declaredConstructor = EnumSingle.class.getDeclaredConstructor(String.class,int.class);
        declaredConstructor.setAccessible(true);
        EnumSingle instance2 = declaredConstructor.newInstance();
        System.out.println(instance1);
        System.out.println(instance2);
    }
}

結論:反射無法破環枚舉類!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

數據分析 | 基於智能標籤,精準管理數據_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

本文源碼:GitHub·點這裏 || GitEE·點這裏

一、場景分析

1、場景案例

互聯網行業的朋友一定了解或者聽說過下列幾個場景:

阿里:千人千面,意思不同用戶使用阿里相關的產品感覺是不一樣的,例如支付寶首頁的推薦內容,和其他相關推薦流信息是完全不同的。

騰訊:社交廣告,不同用戶的朋友圈或者其他媒體場景下的廣告信息是不同的,會基於用戶特徵推薦。

頭條:信息價值,根據用戶瀏覽信息,分析用戶相關喜好,針對分析結果推薦相關的信息流,越關注某類內容,獲取相關的信息越多。

如上幾種場景的邏輯就是:基於不斷分析用戶的行為,生成用戶的特徵畫像,然後再基於用戶標籤,定製化的推薦相關內容。

2、基本概念

通過上面的場景,衍生出來兩個概念:

用戶畫像

用戶畫像,作為一種勾畫目標用戶、聯繫用戶訴求與設計方向的有效工具,把該用戶相關聯的數據的可視化的展現,就形成了用戶畫像。用戶畫像在各領域得到了廣泛的應用,最初是在電商領域得到應用的,在大數據時代背景下,用戶信息充斥在網絡中,將用戶的每個具體信息抽象成標籤,利用這些標籤將用戶形象具體化,從而為用戶提供有針對性的服務。

標籤數據

標籤在生活中非常常見,比如商品標籤,個人標籤,行業標籤,例如提到996就想到程序員,提到程序員就想到格子衫。

標籤是把分散的多方數據進行整合納入統一的技術平台,並對這些數據進行標準化和細分,進行結構化存儲和更新管理,讓業務線可以把這些細分結果推向現有的互動營銷環境里的平台,產生價值,這些數據稱為標籤數據,也就是常說的標籤庫。數據標籤的概念也是在最近幾年大數據的發展中不斷火熱起來的。

標籤價值

  • 精細運營的基礎,有效提高流量精準和效率。
  • 幫助產品快速定位需求人群,進行精準營銷;
  • 能幫助客戶更快切入到市場周期中;
  • 深入的預測分析客戶並作出及時反應;
  • 基於標籤的開發智能推薦系統;
  • 基於某類用戶的分析,洞察行業特徵;

標籤的核心價值,或者說最常用的場景:實時智能推薦,精準化数字營銷。

二、數據標籤

1、標籤劃分

屬性標籤

屬性標籤是變化最小的,例如用戶實名認證之後,基於身份信息獲取相關:性別,生日,出生年月,年齡,等相關標籤。變動頻率小,且最具有精準性。

行為標籤

行為標籤就是用戶通過在產品上的一系列操作,基於行為日誌分析得出:例如購買能力、消費愛好、季節性消費標籤等。在信息流的APP上,通過相關瀏覽行為,不斷推薦用戶感興趣的內容就是基於該邏輯。

規則標籤

根據業務場景需求,配置指定規則,基於規則生成分析結果,例如:

  • 近7天活躍用戶:近7天,每天都登錄的用戶作為規則生成;
  • 丟失用戶:六個月內沒有任何操作,可以發放高額優惠劵;
  • 潛在用戶:使用或產生瀏覽數據,但是未發生任何交易行為;

這類標籤可以基於動態的規則配置,經過計算和分析,生成描述結果,也就是規則標籤。

擬合標籤

擬合類的標籤最具有複雜性,通過用戶上述幾種標籤,智能組合分析,給的預測值,例如:未婚、瀏覽相關婚禮內容,通過分析預測用戶將要舉辦婚禮,得到一個擬合結果:預測將要結婚。這個預測邏輯也可以反向執行,用戶購買嬰兒用品:預測已婚已育。

這就是數據時代常說的一句話:用戶在某個應用上一通操作之後,算法分析的結果可能比用戶對自己的描述還要真實。

2、標籤加工流程

數據採集

數據採集的渠道相對較多,比如同一APP內的各種業務線:購物、支付、理財、外賣、信息瀏覽等等。通過數據通道傳輸到統一的數據聚合平台。有了這些海量日誌數據的支撐,才具有數據分析的基礎條件。不管是數據智能,深度學習,算法等都是建立在海量數據的基礎條件上,這樣才能獲取具有價值的分析結果。

數據加工

結合如上業務,通過對海量數據的加工,分析和提取,獲取相對精準的用戶標籤,這裏還有關鍵的一步,就是對已有的用戶標籤進行不斷的驗證和修復,尤其是規則類和擬合類的相關標籤。

標籤庫

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

通過標籤庫,管理複雜的標籤結果,除了複雜的標籤,和基於時間線的標籤變,標籤數據到這裏,已經具有相當大的價值,可以圍繞標籤庫開放一些收費服務,例如常見的,用戶在某電商APP瀏覽某些商品,可以在某信息流平台看到商品推薦。大數據時代就是這麼令人感覺智能和窒息。

標籤業務

數據走了一大圈轉換成標籤,自然還是要回歸到業務層面,通過對標籤數據的用戶的分析,可以進行精準營銷,和智能推薦等相關操作,電商應用中可以提高成交量,信息流中可以更好的吸引用戶。

應用層

把上述業務開發成服務,集成到具有的應用層面,不斷提升應用服務的質量,不斷的吸引用戶,提供服務。當然用戶的數據不斷在應用層面產生,在轉到數據採集服務中,最終形成完整的閉環流程。

3、應用案例

從流程和業務層面描述都是簡單的,到開發層面都會變得複雜和不好處理,這可能就是產品和開發之間的隔閡。

標籤的數據類型

不同標籤的分析結果需要用不同的數據類型描述,在標籤體系中,常用描述標籤的數據類型如下:枚舉、數值、日期、布爾、文本類型。不同的類型需要不一樣的分析流程。

商品和標籤

這裏提供一個基礎案例,用商品的標籤來分析商品,例如通過商品產地,價格,狀態等條件,來查詢產品庫有多少符合條件的商品。

數據表設計

主要分四張表:標籤分類,標籤庫,標籤值,標籤數據。

CREATE TABLE `tc_tag_catalog` (
	`id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
	`catalog_name` VARCHAR (50) NOT NULL DEFAULT '' COMMENT '名稱',
	`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
	`update_time` datetime DEFAULT NULL COMMENT '更新時間',
	`state` INT (1) DEFAULT '1' COMMENT '狀態1啟用,2禁用',
	PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '標籤層級目錄';

CREATE TABLE `tc_tag_cloud` (
	`id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
	`catalog_id` INT (11) NOT NULL COMMENT '目錄ID',
	`tag_name` VARCHAR (100) DEFAULT '' COMMENT '標籤名稱',
	`tag_code` INT (11) DEFAULT NULL COMMENT '標籤編碼',
	`bind_column` VARCHAR (100) DEFAULT '' COMMENT '綁定數據列',
	`data_type` INT (2) NOT NULL COMMENT '1枚舉,2數值,3日期,4布爾,5值類型',
	`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
	`update_time` datetime DEFAULT NULL COMMENT '更新時間',
	`remark` VARCHAR (150) DEFAULT NULL COMMENT '備註',
	`state` INT (1) DEFAULT '1' COMMENT '狀態1啟用,2禁用',
	PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '標籤雲';

CREATE TABLE `tc_tag_data_enum` (
	`tag_code` INT (11) NOT NULL COMMENT '標籤編碼',
	`data_value` VARCHAR (150) NOT NULL COMMENT '枚舉值',
	`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
	KEY `tag_code_index` (`tag_code`) USING BTREE
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '標籤枚舉值';

CREATE TABLE `tc_tag_data_set` (
	`id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
	`product_name` VARCHAR (100) DEFAULT '' COMMENT '商品名稱',
	`unit_price` DECIMAL (10, 2) DEFAULT '0.00' COMMENT '單價',
	`is_shelves` INT (1) DEFAULT '1' COMMENT '是否上架:1否,2是',
	`origin_place` VARCHAR (100) DEFAULT '' COMMENT '產地',
	`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
	PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '標籤數據集';

模擬入參接口

這裏的參數應該是基於需求,動態選取,進行組織到一起:

例如圖片中這裏給定的標籤值列表,稱為枚舉值。

@RestController
public class AnalyzeController {

    @Resource
    private TagDataSetService tagDataSetService ;

    @GetMapping("/analyze")
    public String analyze (){
        List<TagParam> tagParamList = new ArrayList<>() ;

        TagParam tagParam1 = new TagParam(1,"產地","origin_place") ;
        List<String> valueList1 = new ArrayList<>() ;
        valueList1.add("深圳");
        valueList1.add("廣東");
        tagParam1.setValueList(valueList1);
        tagParamList.add(tagParam1) ;

        TagParam tagParam2 = new TagParam(2,"價格","unit_price") ;
        List<String> valueList2 = new ArrayList<>() ;
        valueList2.add("1999");
        tagParam2.setValueList(valueList2);
        tagParamList.add(tagParam2) ;

        TagParam tagParam3 = new TagParam(3,"生產日期","create_time") ;
        List<String> valueList3 = new ArrayList<>() ;
        valueList3.add("2020-05-01 13:43:54");
        tagParam3.setValueList(valueList3);
        tagParamList.add(tagParam3) ;

        TagParam tagParam4 = new TagParam(4,"是否上架","is_shelves") ;
        List<String> valueList4 = new ArrayList<>() ;
        valueList4.add("1");
        tagParam4.setValueList(valueList4);
        tagParamList.add(tagParam4) ;

        TagParam tagParam5 = new TagParam(5,"產品名稱","product_name") ;
        List<String> valueList5 = new ArrayList<>() ;
        valueList5.add("智能");
        tagParam5.setValueList(valueList5);
        tagParamList.add(tagParam5) ;

        Integer count = tagDataSetService.analyze(tagParamList) ;

        return "Result:" + count ;
    }
}

參數解析查詢

通過對參數的解析,最終形成查詢的SQL語句,獲取精準的結果數據。

@Service
public class TagDataSetServiceImpl extends ServiceImpl<TagDataSetMapper, TagDataSet> implements TagDataSetService {

    @Resource
    private TagDataSetMapper tagDataSetMapper ;

    @Override
    public Integer analyze(List<TagParam> tagParamList) {
        StringBuffer querySQL = new StringBuffer() ;
        for (TagParam tagParam:tagParamList){
            querySQL.append(" AND ") ;
            querySQL.append(tagParam.getBindColumn()) ;
            // 1枚舉,2數值,3日期,4布爾,5值類型
            List<String> valueList = tagParam.getValueList();
            switch (tagParam.getDataType()){
                case 1:
                    querySQL.append(" IN (") ;
                    for (int i = 0 ; i < valueList.size() ;i++){
                        if (i != valueList.size()-1){
                            querySQL.append("'").append(valueList.get(i)).append("',");
                        } else {
                            querySQL.append("'").append(valueList.get(i)).append("'");
                        }
                    }
                    querySQL.append(" )") ;
                    break;
                case 2:
                    querySQL.append("=").append(tagParam.getValueList().get(0)) ;
                    break;
                case 3:
                    querySQL.append(">='").append(tagParam.getValueList().get(0)).append("'") ;
                    break;
                case 4:
                    querySQL.append("=").append(tagParam.getValueList().get(0)) ;
                    break;
                case 5:
                    querySQL.append(" LIKE '%").append(tagParam.getValueList().get(0)).append("%'") ;
                    break;
                default:
                    break;
            }
        }
        /* 最終執行的 SQL
            SELECT COUNT(*) FROM tc_tag_data_set
            WHERE 1 = 1
            AND origin_place IN ('深圳', '廣東')
            AND unit_price = 1999
            AND create_time >= '2020-05-01 13:43:54'
            AND is_shelves = 1
            AND product_name LIKE '%智能%'
         */
        String whereCondition = String.valueOf(querySQL);
        return tagDataSetMapper.analyze(whereCondition);
    }
}

可能有人會說這不就是個查詢流程嗎?如果有這樣的疑問,把上述案例換成用戶查詢,標籤數據的價值會更直觀。

三、智能畫像

1、基本概念

用戶畫像

作為一種勾畫目標用戶、聯繫用戶訴求與設計方向的有效工具,用戶畫像在各領域得到了廣泛的應用。最初是在電商領域得到應用的,在大數據時代背景下,用戶信息充斥在網絡中,將用戶的每個具體信息抽象成標籤,利用這些標籤將用戶形象具體化,從而為用戶提供有針對性的服務。

行業畫像

通過行業屬性標籤,行業下用戶標籤的綜合分析,生成行業分析報告,提供極有價值的導向,這是最近兩年極其熱門的應用。

畫像補全

通過不斷分析用戶數據,豐富標籤庫,使用戶的畫像更加豐富立體。

2、畫像報告

通過標籤數據的分析,生成一份分析報告,報告內容包含豐富的用戶標籤統計數據。

例如:90后畫像報告

這個報告,互聯網用戶一定或多或少都看到過。主要是一些標籤統計,共性標籤展示,或者哪些群體對90后三觀影響最大,收入來源,學歷等各種分析解讀。

四、源代碼地址

GitHub·地址
https://github.com/cicadasmile/data-manage-parent
GitEE·地址
https://gitee.com/cicadasmile/data-manage-parent

推薦閱讀:《架構設計系列》,蘿蔔青菜,各有所需

序號 標題
01 架構設計:單服務.集群.分佈式,基本區別和聯繫
02 架構設計:分佈式業務系統中,全局ID生成策略
03 架構設計:分佈式系統調度,Zookeeper集群化管理
04 架構設計:接口冪等性原則,防重複提交Token管理
05 架構設計:緩存管理模式,監控和內存回收策略

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(二)_貨運

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

系列文章

  1. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用 abp cli 搭建項目
  2. 基於 abp vNext 和 .NET Core 開發博客項目 – 給項目瘦身,讓它跑起來
  3. 基於 abp vNext 和 .NET Core 開發博客項目 – 完善與美化,Swagger登場
  4. 基於 abp vNext 和 .NET Core 開發博客項目 – 數據訪問和代碼優先
  5. 基於 abp vNext 和 .NET Core 開發博客項目 – 自定義倉儲之增刪改查
  6. 基於 abp vNext 和 .NET Core 開發博客項目 – 統一規範API,包裝返回模型
  7. 基於 abp vNext 和 .NET Core 開發博客項目 – 再說Swagger,分組、描述、小綠鎖
  8. 基於 abp vNext 和 .NET Core 開發博客項目 – 接入GitHub,用JWT保護你的API
  9. 基於 abp vNext 和 .NET Core 開發博客項目 – 異常處理和日誌記錄
  10. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用Redis緩存數據
  11. 基於 abp vNext 和 .NET Core 開發博客項目 – 集成Hangfire實現定時任務處理
  12. 基於 abp vNext 和 .NET Core 開發博客項目 – 用AutoMapper搞定對象映射
  13. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(一)
  14. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(二)
  15. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(三)
  16. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(一)
  17. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(二)
  18. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(三)
  19. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(四)
  20. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(五)
  21. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(一)
  22. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(二)
  23. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(三)
  24. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(四)
  25. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(五)
  26. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(六)
  27. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(七)
  28. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(八)
  29. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(九)
  30. 基於 abp vNext 和 .NET Core 開發博客項目 – 終結篇之發布項目

上一篇(https://www.cnblogs.com/meowv/p/12971041.html)使用HtmlAgilityPack抓取壁紙數據成功將圖片存入數據庫,本篇繼續來完成一個全網各大平台的熱點新聞數據的抓取。

同樣的,可以先預覽一下我個人博客中的成品:https://meowv.com/hot ,和抓取壁紙的套路一樣,大同小異。

本次要抓取的源有18個,分別是博客園、V2EX、SegmentFault、掘金、微信熱門、豆瓣精選、IT之家、36氪、百度貼吧、百度熱搜、微博熱搜、知乎熱榜、知乎日報、網易新聞、GitHub、抖音熱點、抖音視頻、抖音正能量。

還是將數據存入數據庫,按部就班先將實體類和自定義倉儲創建好,實體取名HotNews。貼一下代碼:

//HotNews.cs
using System;
using Volo.Abp.Domain.Entities;

namespace Meowv.Blog.Domain.HotNews
{
    public class HotNews : Entity<Guid>
    {
        /// <summary>
        /// 標題
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 鏈接
        /// </summary>
        public string Url { get; set; }

        /// <summary>
        /// SourceId
        /// </summary>
        public int SourceId { get; set; }

        /// <summary>
        /// 創建時間
        /// </summary>
        public DateTime CreateTime { get; set; }
    }
}

剩下的大家自己完成,最終數據庫生成一張空的數據表,meowv_hotnews 。

然後還是將我們各大平台放到一個枚舉類HotNewsEnum.cs中。

//HotNewsEnum.cs
using System.ComponentModel;

namespace Meowv.Blog.Domain.Shared.Enum
{
    public enum HotNewsEnum
    {
        [Description("博客園")]
        cnblogs = 1,

        [Description("V2EX")]
        v2ex = 2,

        [Description("SegmentFault")]
        segmentfault = 3,

        [Description("掘金")]
        juejin = 4,

        [Description("微信熱門")]
        weixin = 5,

        [Description("豆瓣精選")]
        douban = 6,

        [Description("IT之家")]
        ithome = 7,

        [Description("36氪")]
        kr36 = 8,

        [Description("百度貼吧")]
        tieba = 9,

        [Description("百度熱搜")]
        baidu = 10,

        [Description("微博熱搜")]
        weibo = 11,

        [Description("知乎熱榜")]
        zhihu = 12,

        [Description("知乎日報")]
        zhihudaily = 13,

        [Description("網易新聞")]
        news163 = 14,

        [Description("GitHub")]
        github = 15,

        [Description("抖音熱點")]
        douyin_hot = 16,

        [Description("抖音視頻")]
        douyin_video = 17,

        [Description("抖音正能量")]
        douyin_positive = 18
    }
}

和上一篇抓取壁紙一樣,做一些準備工作。

.Application.Contracts層添加HotNewsJobItem<T>,在.BackgroundJobs層添加HotNewsJob用來處理爬蟲邏輯,用構造函數方式注入倉儲IHotNewsRepository

//HotNewsJobItem.cs
using Meowv.Blog.Domain.Shared.Enum;

namespace Meowv.Blog.Application.Contracts.HotNews
{
    public class HotNewsJobItem<T>
    {
        /// <summary>
        /// <see cref="Result"/>
        /// </summary>
        public T Result { get; set; }

        /// <summary>
        /// 來源
        /// </summary>
        public HotNewsEnum Source { get; set; }
    }
}
//HotNewsJob.CS
using Meowv.Blog.Domain.HotNews.Repositories;
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace Meowv.Blog.BackgroundJobs.Jobs.HotNews
{
    public class HotNewsJob : IBackgroundJob
    {
        private readonly IHttpClientFactory _httpClient;
        private readonly IHotNewsRepository _hotNewsRepository;

        public HotNewsJob(IHttpClientFactory httpClient,
                          IHotNewsRepository hotNewsRepository)
        {
            _httpClient = httpClient;
            _hotNewsRepository = hotNewsRepository;
        }

        public async Task ExecuteAsync()
        {
            throw new NotImplementedException();
        }
    }
}

接下來明確數據源地址,因為以上數據源有的返回是HTML,有的直接返回JSON數據。為了方便調用,我這裏還注入了IHttpClientFactory

整理好的待抓取數據源列表是這樣的。

...
var hotnewsUrls = new List<HotNewsJobItem<string>>
{
    new HotNewsJobItem<string> { Result = "https://www.cnblogs.com", Source = HotNewsEnum.cnblogs },
    new HotNewsJobItem<string> { Result = "https://www.v2ex.com/?tab=hot", Source = HotNewsEnum.v2ex },
    new HotNewsJobItem<string> { Result = "https://segmentfault.com/hottest", Source = HotNewsEnum.segmentfault },
    new HotNewsJobItem<string> { Result = "https://web-api.juejin.im/query", Source = HotNewsEnum.juejin },
    new HotNewsJobItem<string> { Result = "https://weixin.sogou.com", Source = HotNewsEnum.weixin },
    new HotNewsJobItem<string> { Result = "https://www.douban.com/group/explore", Source = HotNewsEnum.douban },
    new HotNewsJobItem<string> { Result = "https://www.ithome.com", Source = HotNewsEnum.ithome },
    new HotNewsJobItem<string> { Result = "https://36kr.com/newsflashes", Source = HotNewsEnum.kr36 },
    new HotNewsJobItem<string> { Result = "http://tieba.baidu.com/hottopic/browse/topicList", Source = HotNewsEnum.tieba },
    new HotNewsJobItem<string> { Result = "http://top.baidu.com/buzz?b=341", Source = HotNewsEnum.baidu },
    new HotNewsJobItem<string> { Result = "https://s.weibo.com/top/summary/summary", Source = HotNewsEnum.weibo },
    new HotNewsJobItem<string> { Result = "https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50&desktop=true", Source = HotNewsEnum.zhihu },
    new HotNewsJobItem<string> { Result = "https://daily.zhihu.com", Source = HotNewsEnum.zhihudaily },
    new HotNewsJobItem<string> { Result = "http://news.163.com/special/0001386F/rank_whole.html", Source = HotNewsEnum.news163 },
    new HotNewsJobItem<string> { Result = "https://github.com/trending", Source = HotNewsEnum.github },
    new HotNewsJobItem<string> { Result = "https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/word", Source = HotNewsEnum.douyin_hot },
    new HotNewsJobItem<string> { Result = "https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/aweme", Source = HotNewsEnum.douyin_video },
    new HotNewsJobItem<string> { Result = "https://www.iesdouyin.com/web/api/v2/hotsearch/billboard/aweme/?type=positive", Source = HotNewsEnum.douyin_positive },
};
...

其中有幾個比較特殊的,掘金、百度熱搜、網易新聞。

掘金需要發送Post請求,返回的是JSON數據,並且需要指定特有的請求頭和請求數據,所以使用IHttpClientFactory創建了HttpClient對象。

百度熱搜、網易新聞兩個老大哥玩套路,網頁編碼是GB2312的,所以要專門為其指定編碼方式,不然取到的數據都是亂碼。

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

...
var web = new HtmlWeb();
var list_task = new List<Task<HotNewsJobItem<object>>>();

hotnewsUrls.ForEach(item =>
{
    var task = Task.Run(async () =>
    {
        var obj = new object();

        if (item.Source == HotNewsEnum.juejin)
        {
            using var client = _httpClient.CreateClient();
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.14 Safari/537.36 Edg/83.0.478.13");
            client.DefaultRequestHeaders.Add("X-Agent", "Juejin/Web");
            var data = "{\"extensions\":{\"query\":{ \"id\":\"21207e9ddb1de777adeaca7a2fb38030\"}},\"operationName\":\"\",\"query\":\"\",\"variables\":{ \"first\":20,\"after\":\"\",\"order\":\"THREE_DAYS_HOTTEST\"}}";
            var buffer = data.SerializeUtf8();
            var byteContent = new ByteArrayContent(buffer);
            byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var httpResponse = await client.PostAsync(item.Result, byteContent);
            obj = await httpResponse.Content.ReadAsStringAsync();
        }
        else
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            obj = await web.LoadFromWebAsync(item.Result, (item.Source == HotNewsEnum.baidu || item.Source == HotNewsEnum.news163) ? Encoding.GetEncoding("GB2312") : Encoding.UTF8);
        }

        return new HotNewsJobItem<object>
        {
            Result = obj,
            Source = item.Source
        };
    });
    list_task.Add(task);
});
Task.WaitAll(list_task.ToArray());

循環 hotnewsUrls ,可以看到HotNewsJobItem我們返回的是object類型,因為有JSON又有HtmlDocument對象。所以這裏為了能夠統一接收,就是用了object。

針對掘金做了單獨處理,使用HttpClient發送Post請求,返回JSON字符串數據。

針對百度熱搜和網易新聞,使用Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);註冊編碼提供程序,然後在web.LoadFromWebAsync(...)加載網頁數據的時候指定網頁編碼,我使用了一個三元表達式來處理。

完成上面這一步,就可以循環 list_task,使用XPath語法,或者解析JSON數據,去拿到數據了。

...
var hotNews = new List<HotNews>();
foreach (var list in list_task)
{
    var item = await list;
    var sourceId = (int)item.Source;

    ...

    if (hotNews.Any())
    {
        await _hotNewsRepository.DeleteAsync(x => true);
        await _hotNewsRepository.BulkInsertAsync(hotNews);
    }
}

這個爬蟲同樣很簡單,只要拿到標題和鏈接即可,所以主要目標是尋找到頁面上的a標籤列表。這個我覺得也沒必要一個個去分析了,直接上代碼。

// 博客園
 if (item.Source == HotNewsEnum.cnblogs)
 {
     var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//div[@class='post_item_body']/h3/a").ToList();
     nodes.ForEach(x =>
     {
         hotNews.Add(new HotNews
         {
             Title = x.InnerText,
             Url = x.GetAttributeValue("href", ""),
             SourceId = sourceId,
             CreateTime = DateTime.Now
         });
     });
 }
// V2EX
if (item.Source == HotNewsEnum.v2ex)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//span[@class='item_title']/a").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText,
            Url = $"https://www.v2ex.com{x.GetAttributeValue("href", "")}",
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
 // SegmentFault
 if (item.Source == HotNewsEnum.segmentfault)
 {
     var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//div[@class='news__item-info clearfix']/a").Where(x => x.InnerText.IsNotNullOrEmpty()).ToList();
     nodes.ForEach(x =>
     {
         hotNews.Add(new HotNews
         {
             Title = x.SelectSingleNode(".//h4").InnerText,
             Url = $"https://segmentfault.com{x.GetAttributeValue("href", "")}",
             SourceId = sourceId,
             CreateTime = DateTime.Now
         });
     });
 }
// 掘金
if (item.Source == HotNewsEnum.juejin)
{
    var obj = JObject.Parse((string)item.Result);
    var nodes = obj["data"]["articleFeed"]["items"]["edges"];
    foreach (var node in nodes)
    {
        hotNews.Add(new HotNews
        {
            Title = node["node"]["title"].ToString(),
            Url = node["node"]["originalUrl"].ToString(),
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    }
}
// 微信熱門
if (item.Source == HotNewsEnum.weixin)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//ul[@class='news-list']/li/div[@class='txt-box']/h3/a").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText,
            Url = x.GetAttributeValue("href", ""),
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
// 豆瓣精選
if (item.Source == HotNewsEnum.douban)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//div[@class='channel-item']/div[@class='bd']/h3/a").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText,
            Url = x.GetAttributeValue("href", ""),
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
// IT之家
if (item.Source == HotNewsEnum.ithome)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//div[@class='lst lst-2 hot-list']/div[1]/ul/li/a").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText,
            Url = x.GetAttributeValue("href", ""),
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
// 36氪
if (item.Source == HotNewsEnum.kr36)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//div[@class='hotlist-main']/div[@class='hotlist-item-toptwo']/a[2]|//div[@class='hotlist-main']/div[@class='hotlist-item-other clearfloat']/div[@class='hotlist-item-other-info']/a").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText,
            Url = $"https://36kr.com{x.GetAttributeValue("href", "")}",
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
// 百度貼吧
if (item.Source == HotNewsEnum.tieba)
{
    var obj = JObject.Parse(((HtmlDocument)item.Result).ParsedText);
    var nodes = obj["data"]["bang_topic"]["topic_list"];
    foreach (var node in nodes)
    {
        hotNews.Add(new HotNews
        {
            Title = node["topic_name"].ToString(),
            Url = node["topic_url"].ToString().Replace("amp;", ""),
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    }
}
// 百度熱搜
if (item.Source == HotNewsEnum.baidu)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//table[@class='list-table']//tr/td[@class='keyword']/a[@class='list-title']").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText,
            Url = x.GetAttributeValue("href", ""),
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
// 微博熱搜
if (item.Source == HotNewsEnum.weibo)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//table/tbody/tr/td[2]/a").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText,
            Url = $"https://s.weibo.com{x.GetAttributeValue("href", "").Replace("#", "%23")}",
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
// 知乎熱榜
if (item.Source == HotNewsEnum.zhihu)
{
    var obj = JObject.Parse(((HtmlDocument)item.Result).ParsedText);
    var nodes = obj["data"];
    foreach (var node in nodes)
    {
        hotNews.Add(new HotNews
        {
            Title = node["target"]["title"].ToString(),
            Url = $"https://www.zhihu.com/question/{node["target"]["id"]}",
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    }
}
// 知乎日報
if (item.Source == HotNewsEnum.zhihudaily)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//div[@class='box']/a").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText,
            Url = $"https://daily.zhihu.com{x.GetAttributeValue("href", "")}",
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
// 網易新聞
if (item.Source == HotNewsEnum.news163)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//div[@class='area-half left']/div[@class='tabBox']/div[@class='tabContents active']/table//tr/td[1]/a").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText,
            Url = x.GetAttributeValue("href", ""),
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
// GitHub
if (item.Source == HotNewsEnum.github)
{
    var nodes = ((HtmlDocument)item.Result).DocumentNode.SelectNodes("//article[@class='Box-row']/h1/a").ToList();
    nodes.ForEach(x =>
    {
        hotNews.Add(new HotNews
        {
            Title = x.InnerText.Trim().Replace("\n", "").Replace(" ", ""),
            Url = $"https://github.com{x.GetAttributeValue("href", "")}",
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    });
}
// 抖音熱點
if (item.Source == HotNewsEnum.douyin_hot)
{
    var obj = JObject.Parse(((HtmlDocument)item.Result).ParsedText);
    var nodes = obj["word_list"];
    foreach (var node in nodes)
    {
        hotNews.Add(new HotNews
        {
            Title = node["word"].ToString(),
            Url = $"#{node["hot_value"]}",
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    }
}
// 抖音視頻 & 抖音正能量
if (item.Source == HotNewsEnum.douyin_video || item.Source == HotNewsEnum.douyin_positive)
{
    var obj = JObject.Parse(((HtmlDocument)item.Result).ParsedText);
    var nodes = obj["aweme_list"];
    foreach (var node in nodes)
    {
        hotNews.Add(new HotNews
        {
            Title = node["aweme_info"]["desc"].ToString(),
            Url = node["aweme_info"]["share_url"].ToString(),
            SourceId = sourceId,
            CreateTime = DateTime.Now
        });
    }
}

item.Result轉換成指定類型,最終拿到數據后,我們先刪除所有數據后再批量插入。

然後新建擴展方法UseHotNewsJob(),在模塊類中調用。

//MeowvBlogBackgroundJobsExtensions.cs
...
        /// <summary>
        /// 每日熱點數據抓取
        /// </summary>
        /// <param name="context"></param>
        public static void UseHotNewsJob(this IServiceProvider service)
        {
            var job = service.GetService<HotNewsJob>();

            RecurringJob.AddOrUpdate("每日熱點數據抓取", () => job.ExecuteAsync(), CronType.Hour(1, 2));
        }
...

指定定時任務為每2小時運行一次。

...
        public override void OnApplicationInitialization(ApplicationInitializationContext context)
        {
            ...
            var service = context.ServiceProvider;
            ...
            service.UseHotNewsJob();
        }

編譯運行,此時周期性作業就會出現我們的定時任務了。

默認時間沒到是不會執行的,我們手動執行等待一會看看效果。

執行完成后,成功將所有熱點數據保存在數據庫中,說明我們的爬蟲已經搞定了,並且Hangfire會按照給定的規則去循環執行,你學會了嗎?

開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

提車時不做好這些重要事情 出了門馬上就後悔到哭!_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

雖然里程表可以調,但也可以稍微看一下,也許就給你發現出問題了。出廠日期這是為了檢查是否是庫存車,如果不是太久,三四個月左右吧,還可以接受,如果時間太長,建議還是和4S店談談吧。發動機艙檢查是夠乾淨,或者油漬滲漏等等,如果有那必然是頻繁使用,也許是試駕車。

提車,是一件很興奮的事,但是很多人過於興奮,導致在提車的時候忘記檢查車輛,開回家之後發現不對勁的地方,或者有刮痕什麼的,而此時回去找4S店,只會認為是你自己弄傷,而進行維修,此時就會很無奈,所以在提車的時候別太興奮,下面這些流程必須得做。

檢查外觀

看看有沒有掛上,漆面的色澤均不均衡,或者有沒有凹陷的地方,

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

凹陷的話反光和正常平面的反光是不一樣的。

輪胎

同上,檢查輪轂有沒有刮傷,輪胎有沒有裂痕,輪胎上的胎毛是否還算完整。

內飾,功能

稍微試用一下一些功能,因為現在比較操作系統都放在了中控屏上,用一下看下有無問題。內飾面板之類有沒有完全接合,車窗,天窗開關是否正常。

里程表,燈光

所有燈光都常識打開關閉一次或幾次。雖然里程表可以調,但也可以稍微看一下,也許就給你發現出問題了。

出廠日期

這是為了檢查是否是庫存車,如果不是太久,三四個月左右吧,還可以接受,如果時間太長,建議還是和4S店談談吧。

發動機艙

檢查是夠乾淨,或者油漬滲漏等等,如果有那必然是頻繁使用,也許是試駕車。聽一聽發動機的運作聲是否正常。

試駕一下

稍微跑動一下,看下轉向之類的是否有異常。

尾語:畢竟花了大價錢買的,都不想出門就有問題,花了錢還不省心,所以最好“交貨”之前,檢查一遍,避免日後的麻煩。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

13萬落地 你可以買到質量好又省心的合資家轎有哪些?_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

雖然新款寶來相比老款寶來的長度有所增長,但是和同級別比起來,還是沒有什麼優勢。寶來的動力系統和朗逸比起來要精簡很多,發動機為1。6L 110馬力和1。4T 131馬力,匹配5擋手動、6擋手自一體和7擋雙離合變速箱。和桑塔納速騰一樣,寶來的後排地板中部凸起挺高的,影響舒適性。

今天給大家推薦三個高質量低油耗的合資緊湊型轎車,性價比都是很高的。

北京現代-領動

領動的車身尺寸為4610*1800*1450mm,軸距為2700mm,領動目前是現代集團最新的緊湊型轎車,也就是朗動的換代車型,這也是現代最喜歡的的多代同堂銷售。因為是最新款,所以領動的也是採用了最新的設計語言,同時加上自己是韓國車,所以顏值也是力壓全場。但從外觀上,領動已經可以征服很大一部分消費者了。

領動的動力系統為1.6L 128馬力 L、1.6L 130馬力 L4和1.4T 130馬力 L4,匹配6擋手動、6擋手自一體變速箱和7擋雙離合。其中領動的自動擋車型都採用了直噴發動機,動力輸出會更暢快,油耗也會相應的降低一點。其中1.6L自動擋車型的百公里油耗為7L多一點,表現很不錯。

不過遺憾的是領動的最低配依然沒有配備ESp車身穩定系統。前幾天一個朋友剛提了朗動,我說為啥不買領動呢?他說,朗動可以優惠2.5萬,領動可以么?突然感覺他說的好有道理,

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

我竟無言以對。所以希望領動的優惠也能大一點。

一汽大眾-寶來

寶來的車身尺寸為4562*1793*1468mm,軸距為2614mm。雖然新款寶來相比老款寶來的長度有所增長,但是和同級別比起來,還是沒有什麼優勢。

寶來的動力系統和朗逸比起來要精簡很多,發動機為1.6L 110馬力和1.4T 131馬力,匹配5擋手動、6擋手自一體和7擋雙離合變速箱。和桑塔納速騰一樣,寶來的後排地板中部凸起挺高的,影響舒適性。不過寶來的口碑也是路人皆知的,耐用省油一直是大家對它的印象。小編一直覺得,如果寶來不是掛着大眾的標,最起碼還能再優惠一萬。

廣汽本田-凌派

凌派車身尺寸為4664*1750*1505mm,軸距是2650mm。雖然軸距沒達到2.7米,但是本田的偷空間技術也是赫赫有名的,同時作為中國特供車的身份,兩個因素加起來使得凌派的後排空間十分巨大,另外後排地板也比較平整,就算後排坐三個人也不會感到不舒服。

凌派的發動機為1.8L 136馬力 L4,變速箱為5擋手動和CVT變速箱。雖然1.8L不能參与購置稅減半的政策優惠,但是這套動力系統也是久經考驗,成熟耐用,另外凌派有換上了一套CVT變速箱,雖然是1.8L的排量,但是自動擋的百公里油耗只有7.7L左右。另外這套動力系統也是非常的平順。

最後,凌派全系標配剎車輔助、牽引力控制、ESp。作為日系車,這點還是比較實在的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

北京匡時2019秋拍大戲開啟 中國書畫專場名家名作薈萃_包裝設計

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

北京匡時2019秋季拍賣會於21日在北京拉開帷幕,本季秋拍集中呈現了中國書畫、古籍善本、國石篆刻、名硯、現當代藝術等多個門類的600餘件藝術臻品,不僅有流傳有緒的名品——齊白石、陳半丁合繪《挖耳圖》,也有唐宋寫經、宋元碑帖等精品古籍刻本。

“中國書畫專場”共300餘件拍品,其中尤其值得關注的拍品有齊白石、黃賓虹、張大千、溥儒、林風眠、高鳳翰、錢泳、屠倬以及顧大昌舊藏清中拓《開通褒斜道摩崖》、初拓《袁安碑》等。北京文物商店舊藏齊白石、陳半丁1945年合繪的《挖耳圖》,此作先後在1990年在日本大阪龍華堂、新加坡新華美術中心以及首都博物館展出,有六次出版,是一件流傳有緒的赫赫名作。

另有新加坡戴淮清、唐錦雲夫婦舊藏的齊白石《燭鼠圖》《紅梅圖》,都是直接得自新加坡中華書局。黃賓虹《贈蔡守、談月色山水》手卷是為南社同仁所作,以用筆為主,勁峭簡練,有別於後期的層層點染,更多一些清朴自在的風味。

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

溥儒《鍾馗圖》用溥氏獨有的精準爽利的釘頭鼠尾描將鍾馗袍帶寬厚鬆軟的質感表現的淋漓盡致,也在衣折的蜿蜒承轉之中將人物的動態表現的入木三分致。林風眠《三美圖》畫的是一種半具體半抽象的環境,營造一種朦朧的情調,由姿情和氣質傳達出東方女性的溫柔閑雅、清淡秀媚、如詩如夢。

古籍善本專場則甄選拍品207件,包括唐宋寫經、宋元及歷代刻經等佛教經典、宮廷典籍、明清珍本、金石碑帖、拿破侖王后及陳寅恪舊藏西文搖籃本等諸多專題,其中由同一藏家提供的29件拍品多為稀見刻本及批校本,如蒲學泰斗路大荒手校《聊齋誌異》、鍾佛操精校《古文詞略》、劉世珩校樣本《大戴禮記》等,並徵得周叔弢家族的校刻本及藏書等。

方寸乾坤——印石篆刻專場彙集了明清代以來諸多文人篆刻精品佳作,這些印章有篆刻名家自用印,也有其為友人所刻姓名印、收藏印、詩文閑章等。所涉名家包括程邃、楊玉璇、郭懋介、郭祥忍、郭祥雄、陳禮忠、潘驚石、張純連等,可謂名家薈萃。

此外,預展還有寶硯齋藏硯專場、現當代藝術專場等精品。預展期為12月21日-22日,12月23日將舉槌拍賣。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

新年戲曲晚會在京舉行_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

新華社北京12月31日電 (記者鄒偉、王思北)2020年新年戲曲晚會31日晚在國家大劇院舉行。黨和國家領導人習近平、李克強、栗戰書、汪洋、王滬寧、趙樂際、韓正、王岐山等,同首都近千名群眾歡聚一堂,一起觀看演出,迎接新年的到來。

夜幕降臨,華燈璀璨。國家大劇院戲劇場內笑語盈盈、歡聲陣陣,洋溢着如春的暖意和喜慶的節日氣氛。19時45分,習近平等黨和國家領導人來到晚會現場,同前來觀看演出的老藝術家們親切握手、互致問候,全場響起熱烈掌聲。

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

高歌奮進新時代,梨園綻放盛世花。激越雄壯的《響鼓2020》拉開了晚會序幕。婺劇《信仰的味道》、壯劇《黃文秀》、京劇《智取威虎山》等劇目片段展現中國共產黨人“不忘初心、牢記使命”的崇高信仰和對祖國母親的赤子之心;貴州花燈戲《夫妻觀燈》、丹劇《槐蔭記》、閩劇《雙蝶扇》、川劇《別洞觀景》等經典名段創新呈現,綻放歷久彌新的藝術魅力;豫劇《蘇武》、紹劇《佘太君》、晉劇《於成龍》等精彩唱段致敬古代先賢,弘揚愛國精神,伸張民族大義,熔鑄傳統美德,浸潤濃濃的家國情懷;吉劇《時遷取帖》、少兒戲曲《八大鎚》等節目,以民族傳統藝術樣式營造其樂融融的輕鬆氣息;崑曲《夜奔》、徽劇《關羽觀陣》等選段和武戲集萃等節目彰顯了中國戲曲藝術的底蘊和風采。新編戲曲歌舞《中國,一定行!》將晚會氣氛推向最高潮,“中國人民一定能!”“中國一定行!”唱出時代強音。藝術家們的精湛技藝贏得全場陣陣喝彩和熱烈掌聲。

今年的新年戲曲晚會13個劇種同台獻藝,紹劇、貴州花燈戲、丹劇3個劇種首次亮相這一舞台,通過原創佳作和老、中、青、少四代演員的精彩表演,展現新時代戲曲藝術百花齊放的繁榮景象,唱響新時代愛國奮鬥之歌。

在京中共中央政治局委員、中央書記處書記,全國人大常委會部分領導同志、國務委員、全國政協部分領導同志,有關部門負責同志觀看演出。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

“元旦”趣談:春節、新年日期如何確定?_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

今天是1月1日,很多國家都稱呼這一天為元旦。它代表新一年的開始,在人們心目中是個歡快的節日。

有意思的是,在中國古代,“元旦”原本指的是現在的農曆春節,還有“端日”、“元正”等稱呼。而“春節”、“新年”以及“元旦”等名稱和日期的確定,也經歷了一個比較長的演變過程。

古代“元旦”二字有啥含義?

說起元旦,如果按照字面意思解釋,可以理解為“首日”。

“元旦”的“元”有開始、第一的意思,凡數之始稱為“元”;“旦”是一個象形字,上面的“日”代表太陽,下面的“一”象徵地平線,結合起來象徵太陽從地平線上冉冉升起,新的一天開始了。

所以,人們把“元”和“旦”兩個字結合起來,就引申為新年開始的第一天。據說,元旦又稱“三元”,即歲之元、月之元、時之元。

一元初始,萬象更新。古代的元旦十分受重視,晉代有個名叫辛蘭的詩人,寫過一首《元正》:“元正啟令節,嘉慶肇自茲。咸奏萬年觴,小大同悅熙。”記述的便是當時元旦的熱鬧情景。

古代“元旦”起源於何時?

實際上,中國古代的“元旦”,據說起於三皇五帝之一的顓頊,距今已有幾千年的歷史。《晉書》中記載:“顓帝以孟夏正月為元,其實正朔元旦之春”。

雖然“元旦”表示一年之首日的意思從未改變,但由於曆法原因,正月初一的計算方法,在西漢武帝之前並不十分統一,歷代的元旦月、日也不一致。

舉個例子,古時候的夏朝使用夏曆,夏曆以孟喜月(元月)為正月,但到了商朝,商朝使用的殷歷以臘月(十二月)為正月,周朝的周曆以冬月(十一月)為正月。

秦始皇統一中國后,又決定以陽春月(十月)為正月,也就是說,這時候的“元旦”變成了“十月初一”。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

直到漢武帝時期,才基本結束之前“變來變去”的狀態:漢武帝太初元年,鄧平等人創立“太初曆”,重定夏曆孟喜月(元月)為正月,把孟喜月的第一天(夏曆的正月初一)稱為元旦,一直沿用到清朝末年。

“春節”名稱的由來

時間走到了1912年,那一年1月份,孫中山發布《臨時大總統關於頒布曆書令》,要求內務部編印新曆書,隨後又規定陽曆(公曆)1月1日為“新年”,但不叫“元旦”。

由此一來,在中國出現了兩種曆法體系:一種是官方推行的“陽曆”,作為公共行政、國際交往等的時間標準;一種是傳統社會沿用的“農曆”,服務於農時與日常生活。

1914年1月,當時政府的內務部在給大總統的呈文中提出:“擬請定陰曆元旦為春節,端午為夏節,中秋為秋節,冬至為冬節……”後來只有“元旦為春節”被批准,所以傳統農曆新年易名為“春節”,傳統的“元旦”名稱被擱在了公曆的1月1日。

不過,民俗專家蕭放說,儘管當時的政府一直在推行公曆,後來甚至還強令不準過舊曆年,嚴禁民間過春節貼春聯等民俗活動,但老百姓不買賬,日常生活還是按照舊的年曆來過。

1949年9月27日,中國人民政治協商會議第一屆全體會議通過“中華人民共和國紀年採用公元紀年法”,農曆正月初一稱為“春節”,公曆1月1日定為“元旦”。至此,“元旦”成為人們歡度的節日,傳統年節也受到了應有的關注。

古代“元旦”吃什麼?

“四季新元旦,萬壽初春朝”元旦總是能給人們帶來新的期待,古代元旦宮廷有隆重的賀歲之禮。三國時曹植《元會》詩:“初步元祚,古日惟良,乃為嘉會,宴此高堂”。

有一種說法認為,歷朝歷代類似的慶賀典儀祈祀等活動,源於上古社會的“蜡祭”,主要祭祀莊稼和收穫神,如農神等。在社會生產力低下的時代,人們在新的一年開始之日,要感謝“神靈”、祖先的庇護,祈禱來年風調雨順。

此時的飲食也是豐富多彩,《荊楚歲時記》中便有明確記述。比如,元旦到了,南朝時荊楚地區拜賀完畢,接着是進椒柏酒,飲桃湯,進屠蘇酒、膠牙餳、五辛盤。進敷於散,服卻鬼丸,還要各吃一個雞蛋……

仔細數數,其中有飲料、食品、藥物,各有寓意。古代“元旦”,人們按部就班的執行者一整套習俗,忙的不亦樂乎。

明代詩人陳獻章在《元旦試筆》中則提到:“鄰牆旋打娛賓酒,稚子齊歌樂歲詩。”好似一幅“樂歲圖”,描摹的正是人們歡度傳統新年的景象。(記者 上官雲)

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌