C# Windows Form 開發過程,2013微軟社群之星 之 部落格文章分析軟體 By Register 。

  • 6045
  • 0
  • C#
  • 2020-08-21

社群之星的競賽中有一項是要寫Windows相關的技術或知識放在點部落的部落格文章中,一開始就非常盲目地的寫文章,也不知道其他隊伍的狀況是如何了,就令人有點不安心的感覺,到這邊要講一個典故,想必大家都知道"指南車"的由來吧!話說傳說中的"指南車"是在古代戰爭時用來引導士兵們方向的發明,以便士兵們在茫茫人海中能夠知道方向,能夠讓士兵們降低不安全的感覺...

在2013年的下半年度,SUKI有幸入取了第八屆的微軟學生大使(Microsoft Student Partners , MSP),

在MSP已經度過了半年了,也很感謝Bill叔、Ouch大大在2013年7、8月間,

每個禮拜的週末傳授MSP技術開發組的夥伴們各種Windows Phone App、Windows Store App、

其他開發相關以及人生哲理的經歷,就在2013年的9月份,因為MSP的身分也比較快的得知微軟的相關競賽,

如怪獸爭霸戰、技術達人來挑戰和2013微軟社群之星的大型競賽,

原本沒有打算要參加 2013 微軟社群之星的競賽,是因為自己目前剛升研究所,許多原文論文以及研究,如拔山倒樹而來...

再加上自己原本有一個小小的團隊在弄,如果再加上 2013社群之星,可肯定的是我會被淹沒在堆積不完的事物中,

就在社群之星報名快要截止的時候,MSP的夥伴EN、顥顥、郭董已經組好隊伍要報名社群之星了,

但是EN因為有其他事物要忙碌,所以不方便參加社群之星,所以因緣際會之下就我就加入了顥顥、郭董組成了現在的

Register !!

既然加入了,就全力以赴,火力全開吧,畢竟我也不想因為我個人忙碌的因素拖垮整個Register !

所以這個學期過得異常的"充實" !!  哈哈

 

 

 

也因為社群之星的競賽中有一項是要寫Windows相關的技術或知識放在點部落的部落格文章中,

一開始就非常盲目地的寫文章,也不知道其他隊伍的狀況是如何了,就令人有點不安心的感覺,

到這邊要講一個典故,想必大家都知道"指南車"的由來吧!

話說傳說中的"指南車"是在古代戰爭時用來引導士兵們方向的發明,以便士兵們在茫茫人海中能夠知道方向,

能夠讓士兵們降低不安全的感覺,

 

所以大概在2013年10月中,寫文章寫到一半突然靈機一動!

發現其實可以寫一個類似的分析工具來分析所有隊伍的文章情況,

當天有了這個念頭之後晚上興奮地都睡不著,隔天早上10點起來把上開始製作!

首先就到了點部落"2013社群之星的修練團隊" 把所有隊伍的帳號寫到C#中的自定義類別中,

不寫死的原因是因為還不知道所有隊伍的編排,只能從大家的部落格中旁邊的相關連結,來判斷是不是同一組的,

再來就是其實寫到自定義類別中,也是比較良好的撰寫模式的方式

 

image

再來透過郭董的教學文章得知了在C#中,如何分析網頁標籤的套件HTML Agility Pack

參考郭董的文章:

[Windows Phone/C#] C# 網頁擷取資料 解析網頁標籤(HTML Parser )API -HTML Agility Pack 以Windows Phone 8 為例

 

知道如何解析網頁標籤後,就開始來分析點部落的部落格,其實有在寫程式的人都知道,

想法很快很簡單,但是實際上做起來並不是這麼順利,過程中我們會遇到一些詭異奇怪的問題,

原本文章數我是打算透過"訂閱"的XML來分析,但是這個方法到最後失靈了,因為訂閱的Xml只會提供50篇文章,

所以當文章超過50篇之後,就不會計算到了,再來很不幸的是點部落的部落格樣式只要換一套,

所有的網頁標籤就會跟著換了,我原本是針對自己的部落格標籤進行分析,

殊不知測試其他同學的部落格時就Crash了....結果搞了半天的Code不能用...就先[ // ] 起來放,

因此用就土法煉鋼的方式,把整個部落格首頁的頁面網頁文字全部擷取下來,

再用正規表示式來判斷網頁中是否有出現【閱讀數 : XXXX】,用正規表示式的好處是,

可以有規則的判斷各種情況,因為每篇文章的閱讀數不同所以XXXX也會不同,

所以在這邊正規表示式是最適合的方法了,首先到首頁可以看到第一頁的文章,

一般來說是15篇,一篇文章也就搭配了一個閱覽數,所以我們只要判斷閱覽數有幾個,

就可以知道有幾篇文章了,

image

 

那該如何判斷所有的文章呢?

其實很簡單,因為在文章首頁底下有個【下一頁】的話,

如果有出現的話就進入下一頁在蒐集一次文章數和閱讀數,

如果沒有出現的話就代表是最後一頁了,點部落的頁數是這樣子的

在你的部落格首頁的網址之後加上/Default.aspx?pg=XX 就可以跳到指定的頁數,

也就是

/Default.aspx?pg=0  第一頁

/Default.aspx?pg=1 第二頁

/Default.aspx?pg=2 第三頁

.....以此類推!!

也因為不用進入到每篇文章擷取閱讀數的資訊,所以也不用擔心會免費贊助閱覽數 ㄏㄏ

把每一組的文章數,和總瀏覽數蒐集起來之後,寫入自定義的類別陣列中,

image

最後再用 總瀏覽數/文章數 來算出文章的平均瀏覽數,如此一來所有隊伍的資料就可以很輕易的被分析出來,

另外我將分析某個帳號的文章數和瀏覽數的功能寫到一個自定義類別中(GetInfo_Task),然後我只要在主程式中

利用迴圈的方式來呼叫GetInfo_Task中的方法就可以取得所有隊伍的資料了,

image

而且並傳入主程式介面上的ListBox ,因為一開始我並不會使用DataGridView,所以使用ListBox呈現,

再來因為我不知道什麼時候網頁資訊會全部解析完成,所以在這邊把ListBox 傳入GetInfo_Task中,

也因為我也不會自定義事件,也就是我希望當擷取網頁結束後自動Return,有點像是Mouse.Click的那種事件,

然後地一個版本就製作完成了 :

image

 

我很開心的跟郭董、顥顥分享!話說大家都很興奮,因為有了"指南車"!!

很貼心的顥顥還幫我抓Bug~ 哈哈,我覺得能夠跟高手共事,真是太有榮幸了,也真的是太棒了!

修正了小小的Bug之後,顥顥也建議我可以使用DataGridView來做,因為ListBox並不會幫忙排序,

除非在程式內自己撰寫排續的方法,再者ListBox不會對其,就跟上面那張圖一樣,或許是可以對齊的!?

只是SUKI不才,只能排成這樣...

接下來不到久的時間,我把ListBox修改成了DataGridView,也就有感而發了這篇文章

C# Windows Form 開發,使用程式碼插入DataGridView欄位資料。

可是我並沒有把GetInfo_Task中要傳入的ListBox刪除,

只是單純隱藏起來而已,因為怕程式出錯還要改很麻煩,一部分的原因是因為這隻程式並不算在2013微軟社群之星的門檻中...

這隻程式若要寫得很完美恐怕還需要花一些時間,

使用DataGridView之後就方便很多了,不僅省下了對其的麻煩,連排序也不用自己來,因為它都幫你做好了 ^ ^

加入DataGridView的版本

image

看起來真的美觀多了

 

但是其實寫程式寫久了就會有職業病,就是追求完美,只有看到 文章數、總瀏覽數、平均瀏覽數是不夠的

若能在程式中觀看到每組每個時段增加的閱覽數,那就太棒了!

因此SUKI又繼續寫了下去…

 

自定義一個類別,把日期時間、和隊伍的所有資訊記錄下來

image

接著利用內建的序列化功能把自定義的類別轉換為Json存起來,存成一個Log檔,

在這邊我也學到了如何寫入檔案,經過反覆的測試序列化和反序列化的正確性,

還使用了線上Parse Json的網站(http://json.parser.online.fr/)來確認寫入的Json格式是否正確,

 

 

image

確認無誤之後,一開始是使用手動的方式來記錄,後來我實在是覺得太麻煩了...但是我的電腦又不可能24H開著,

住外面的學生都是到電費都貴得嚇嚇叫,只好動用到學校實驗室的伺服器,伺服器總要24H開著吧,哈哈

所以也就改寫了程式碼,利用Timer設定每15分鐘自動記錄一次,紀錄完之後再重新整理! 這樣應該不算DDOS攻擊吧...XD

 

但是也因為我的程式寫的很草率(寫APP 寫文章卡要緊啊!),沒有寫入例外狀況的處理方式,有時網路出現一點問題,

或是點部落的網站突然進不去了,就會Crash掉.....,所以都要重新開啟程式。

都是利用TeamViewer來觀看的,話說學校要開啟 "Windows 遠端桌面連線"的Port還要另外申請...@@

話說之前原本想要用學校的電腦當作代理伺服器,結果也是不行啊 哈哈 Port 都被擋掉了 QQ....

 

原本是預想可以用Google Chart來做的,這樣可以省下寫圖表的時間,

[image[4].png]

 

但是已因為社群之星,已經進入到了尾聲,在不寫APP的話恐怕會落後很多,所以就沒又繼續在寫圖表的部分了

 

不管最後結果如何,我都很謝謝我們的

教練Demo Fan、R姊、K姊、Pinky、Stacy、講師、工作人員們、社群之星、來聽講座的同學們、協助的老師

還有一起同爆肝共吃苦的夥伴們,顥顥、郭董,以前我比較常自幹,在這次的比賽當中,

我也體會到了團隊合作共同為了同一件事情努力的那種氛圍,能夠與你們共事真的太棒了!!

SUKI

HOLIESTAR