一分鐘搞懂你的博客為什麼沒人看

来源:https://www.cnblogs.com/abountme/archive/2019/01/22/10300737.html
-Advertisement-
Play Games

關於博客訪問量的問題,影響因素有很多,例如你的權重,你的博客數量,包括你的標題是否吸引人都是一個衡量的標準。 這些東西需要的是日積月累,今天我們從其中的一個維度入手:發帖時間。相信大家都明白,不論是csdn,博客園這種技術博客 還是今日頭條百度貼吧或者抖音快手這種娛樂論壇,都有自己的線上高峰期。例如 ...


  關於博客訪問量的問題,影響因素有很多,例如你的權重,你的博客數量,包括你的標題是否吸引人都是一個衡量的標準。

這些東西需要的是日積月累,今天我們從其中的一個維度入手:發帖時間。相信大家都明白,不論是csdn,博客園這種技術博客

還是今日頭條百度貼吧或者抖音快手這種娛樂論壇,都有自己的線上高峰期。例如百度貼吧,用戶年齡段普遍偏小,“夜貓子”占據主力。

21-23點是線上高峰期,這個時間的閱讀量以及評論量也是最多的,自媒體人肯定會選擇在這個時間發帖已得到更多的閱讀及評論。

 

  那我們的博客園呢?目前我們還不知道,既然園子裡面都是程式猿,數據統計咱就要拿出點技術人員該有的樣子,接下來我們

寫一個爬蟲統計所有的發帖時間以及閱讀數量。

  所需語言:

    python

    c#

    sql server

  • 爬取數據

我們打開博客園首頁,首頁的文章列表有發帖時間,閱讀數,博客園最多只有200頁,我們只要將這200頁的所有文章閱讀數,發帖時間爬取到就ok。

 

下麵我們用python+scrapy 來編寫爬蟲代碼。

環境配置:

pip install scrapy 安裝爬蟲框架,scrapy安裝容易遇到坑,scrapy教程與常見坑,不懂scrapy看鏈接。

scrapy startproject csblog 創建項目

scrapy gensider scblogSpider “csblogs.com” 創建爬蟲文件

修改csblog下麵的items.py

title:文章標題

read:閱讀數

date:發帖時間

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class CnblogsItem(scrapy.Item):
    title = scrapy.Field()
    read = scrapy.Field()
    date = scrapy.Field()

 

然後我們編寫爬蟲代碼,首先審查下首頁的html結構。

首先吐槽下翻頁遇到的坑,https://www.cnblogs.com/#p4,錶面看上去#p4是頁碼,但是多次嘗試變化頁碼爬取,都無效果,始終為第一頁。

經過調試工具查看請求才發現,這個url是被重寫過得,想要翻頁得這麼發請求。

 

接下來就容易多了,向這個地址發請求,在返回的html中取得相應的數據就好了,貼代碼。

 

# -*- coding: utf-8 -*-
import scrapy
from cnblogs.items import CnblogsItem

class CsblogSpider(scrapy.Spider):
    name = 'csblog'
    allowed_domains = ['cnblogs.com']
    start_urls= ['https://www.cnblogs.com/mvc/AggSite/PostList.aspx']

    PageIndex = 1
    

    def start_requests(self):     
        url = self.start_urls[0]
        #因為博客園只允許200頁
        for each in range(1,200):
            print("抓取頁碼")
            print(each)
            post_data ={
                'CategoryId':'808',
                'CategoryType':"SiteHome",
                'ItemListActionName':"PostList",
                'PageIndex':str(each),
                'ParentCategoryId':'0',
                'TotalPostCount':'400'
                

                }
            yield scrapy.FormRequest(url=url, formdata=post_data)


    def parse(self, response):
        items = []
        #所有文章都在<div class="post_item">中
        for each in response.xpath("/html/body/div[@class='post_item']"):
            #提取標題
            title = each.xpath('div[@class="post_item_body"]/h3/a/text()').extract()
            #提取發佈日期
            date = each.xpath('div[@class="post_item_body"]/div/text()').extract()
            #提取閱讀數
            read = each.xpath('div[@class="post_item_body"]/div/span[@class="article_view"]/a/text()').extract()
            title = title[0]
            #去除無用的字元
            date = str(date).replace("['                    \\r\\n    ', ' \\r\\n",'').replace(" \\r\\n    ']","").replace("發佈於 ","").lstrip()
            read = read[0].replace("閱讀(","").replace(")","")


            
            item = CnblogsItem()
            item['title'] = title
            item['read'] = read
            item['date'] = date
            items.append(item)


        
        return items
            
     

 

 爬蟲的代碼很簡單,這也是python的強大之處。

運行 scrapy crawl csblog -o data.xml 將爬取到的數據保存為xml。

 

我們已經將抓取到的數據保存到本地xml了,接下來要做的事情就是數據統計了。所謂“術業有專攻”,做統計沒有比sql 更強大的語言了,python的任務到此結束。

  • 數據存儲

為了方便的對數據進項統計查詢,我們把xml保存到MS Sql Server中,做個這個事情沒有比Sql server的老伙計C#更合適的了,沒啥好說的簡簡單單的幾個方法。

     static void Main(string[] args)
        {
            data d = (data)Deserialize(typeof(data), File.OpenRead(@"D:/MyCode/cnblogs/cnblogs/data.xml"));
            DataTable dt = ToDataTable<data.item>(d.items);
            dt.TableName = "t_article";
            dt.Columns.Remove("date");
            SqlHelper.ExecuteNonQuery(dt);
        }

        /// <summary>
        /// Convert a List{T} to a DataTable.
        /// </summary>
        private static DataTable ToDataTable<T>(List<T> items)
        {
            var tb = new DataTable(typeof(T).Name);
            PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo prop in props)
            {
                Type t = GetCoreType(prop.PropertyType);
                tb.Columns.Add(prop.Name, t);
            }
            foreach (T item in items)
            {
                var values = new object[props.Length];

                for (int i = 0; i < props.Length; i++)
                {
                    values[i] = props[i].GetValue(item, null);
                }

                tb.Rows.Add(values);
            }
            return tb;
        }

        /// <summary>
        /// Determine of specified type is nullable
        /// </summary>
        public static bool IsNullable(Type t)
        {
            return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
        }

        /// <summary>
        /// Return underlying type if type is Nullable otherwise return the type
        /// </summary>
        public static Type GetCoreType(Type t)
        {
            if (t != null && IsNullable(t))
            {
                if (!t.IsValueType)
                {
                    return t;
                }
                else
                {
                    return Nullable.GetUnderlyingType(t);
                }
            }
            else
            {
                return t;
            }
        }
        /// 反序列化  
        /// </summary>  
        /// <param name="type"></param>  
        /// <param name="xml"></param>  
        /// <returns></returns>  
        public static object Deserialize(Type type, Stream stream)
        {
            XmlSerializer xmldes = new XmlSerializer(type);
            return xmldes.Deserialize(stream);
        }

 

數據已經成功的存儲到sql server,接下來的數據統計是重頭戲了。

  • 數據統計
--200頁碼帖子總數量
select COUNT(*) from t_article

--查詢的哪個時間段閱讀量最多
--查詢結果顯示早9點閱讀量是最多的,並不意外
--而早6點(5180)與7點(55144)相差了近10倍
--7點與8點相比差了也有三倍,這說明程式猿們陸續
--開始上班了,上班敲代碼一定是查資料的高峰期,
--果不其然,8,9,10,11,15,16是閱讀量最高峰的幾個時間段
--都分佈在上班時間,而出乎意料的事22點的閱讀量也不低
--看來程式猿們回家後也很努力的嘛(應該是在加班)
select 
CONVERT(INT, CONVERT(varchar(2),time, 108)) as count,
SUM([read]) as [read]
from t_article 
group by 
CONVERT(INT, CONVERT(varchar(2),time, 108)) 
order by [read] desc

 

--查詢閱讀量在一個星期內的分佈情況
--結果一點都不意外,星期三比另六天
--高得多,星期一到星期五是工作日
--每天的閱讀量都很高,周末閱讀量下滑
--的厲害,因為休息了嘛(居然沒在加班)
select 
datename(weekday, time) as weekday,
SUM([read]) as [read]
from t_article 
group by 
datename(weekday, time) 
order by [read] desc

 

 

 

--按照閱讀數量排行
--閱讀數量與發帖時間基本成正比
--這意味著,你辛辛苦苦寫的文章
--沒人看,沒有關係。時間不會辜負你
select 
CONVERT(varchar(100), time, 111),
sum([read])
from t_article 
group by CONVERT(varchar(100), time, 111)
order by sum([read])

 

  • 總結


閱讀的最高峰時段是早9點,所以這也是發帖的最優時間,8,9,10都是不錯的時間,如果你想要更多的閱讀,不要錯過呦。

閱讀數量最少的是星期六跟星期日,這兩天可以不用發帖了,可以給自己放個假。

閱讀數量會隨著時間慢慢變多,也就是說一開始沒有閱讀也沒關係,只要帖子里有乾貨,隨著時間推移依然還會有許多閱讀從搜索引擎跳轉過來,閱讀量會慢慢上去的。

源碼以及資料庫下載地址


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

-Advertisement-
Play Games
更多相關文章
  • 所有基礎課程鏈接: 1.JavaScript基礎視頻教程總結(001-010章) 2.JavaScript基礎視頻教程總結(011-020章) 3. JavaScript基礎視頻教程總結(021-030章) 4. JavaScript基礎視頻教程總結(031-040章) 5. JavaScript基 ...
  • 預覽鏈接:https://www.vanwee.cn/%E6%BB%9A%E5%8A%A8%E7%9B%91%E5%90%AC/ 使用方法: 在想要添加動畫的元素上添加class類名:vanwee 由於我只需要從下漸現向上移動的效果,所以從原博主轉載過來做了調整,大家有不明白的地方建議查看轉載來源博 ...
  • 創建 function 對象的兩種方法: 方式一(推薦) 方式二:var func2 = new Function("參數1", "參數n","函數體"); arguments 對象 獲得參數的個數 獲得參數的個數和值的總額 控制拋出異常 自執行函數 instanceof 用於判斷一個變數是否某個對 ...
  • 在jquery中,給元素綁定事件,本文一共介紹三種方法,運用案例,針對最常用的on()方法,進行事件綁定操作。 事件綁定方法: ①$(element).bind() 參數:{ “事件名稱1”:function( ){ } ,“事件名稱2”:function(){ },......} 例如給類名為on ...
  • 一、23種設計模式分類: 二、設計模式的六大原則: 1、開閉原則(Open Close Principle):對擴展開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。 2、里氏代換原則(Liskov Substitution Principle):任何基類可以出 ...
  • DDD早於微服務「出道」十年,這兩個「忘年交」的軟體設計哲學是如何相愛相殺的? 背景 微服務現在可以說是軟體研發領域無人不提的話題,然而業界流行的對比多數都是所謂的Monolithic(單體應用),而大量的系統在十幾年前都已經是以SOA(面向服務架構)為基礎的分散式系統了,那麼微服務作為新的架構標準 ...
  • 靜兒就職的是新美大的基礎架構部門,做的是基於k8s的容器調度開發。k8s只是個工具,真正技術的上就是和網路打交道要多些。需要對網路中的數據流向有清晰的認識。大多數時間還是在做平臺,事情很跟業務很相似,也主要是工程。 之前記得有同事說過,設計的東西都被框架封裝好了,設計模式基本用不上。但是靜兒怎麼覺得 ...
  • 程式的三種基本結構 複合語句 將若幹個C語句使用花括弧{ }包括起來形成複合語句。花括弧內可以包含任何C語句, 其一般形式為: { 語句1; 語句2; …… 語句n; } 1.if條件分支語句 if語句有三種語法形式,構成三種分支結構。 1)流程(單選控制結構) 語句形式如下: if (表達式)語句 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...