天天看點

第一次個人程式設計作業

部落格班級 2018級計算機和綜合實驗班
作業要求 第一次個人程式設計作業
作業目标 資料采集,反爬蟲,資料處理,可視化,Ajax,搭建伺服器
作業源代碼 first-personal-work
學号 211806229
目錄
  • 前言
  • 一、計劃安排
    • 2. 創新說明
  • 二、倉庫搭建
  • 三、資料采集
    • 1)遇到的問題
      • 1. 擷取評論的時候也将子評論爬蟲進去了。
      • 2. 擷取全部評論數,直接通過 requests 擷取不到
      • 3. 評論總數資料太大
      • 4. 報錯'utf-8' codec can't decode byte 0xff in position 1: invalid start byte
  • 四、資料處理
  • 五、資料可視化
    • 遇到的問題
      • 1)界面渲染很慢
  • 六、推送伺服器
  • 七、git commit 規範
  • 八、作業二:疫情統計分布資訊圖
    • 1. 資料采集
    • 2. 資料處理
    • 3. 資料可視化
  • 參考資料

詞雲圖挂伺服器上面,資料加載有點慢,詞雲圖很慢才會顯示出來。

分析了一下作業,做了一張思維導圖。

作業一需要通過爬蟲進行資料的擷取,檢視網上的相關資料,基本都是通過 requests 擷取資料,然後利用正規表達式處理資料。但是仔細觀察了程式,發現他們爬蟲的頁數較少,但是由于是爬蟲騰訊的網址,我覺得擷取到所有的評論,肯定要反爬蟲,目前的思路是利用使用者代理和IP代理進行。IP代理這裡還有涉及到IP池的問題,因為不充錢的肯定要自己處理IP。資料處理這步就是看第三步可視化需要什麼樣的資料了。echarts 官網沒有找到詞雲圖的模闆,通過百度發現,好像是 echarts3.0 取消了詞雲圖,但是還是可以通過 GitHub 擷取到詞雲圖模闆的源碼。觀察源碼發現,詞雲圖所需要的資料格式也是

{"name":xxx,"value":xxx}

所有處理成這個格式就行了。因為擷取到的評論都是長文字,所有這裡就涉及到NLP自然語言的處理,作業提供了三個分詞工具,仔細閱讀了官方文檔,發現 jieba 學起來比較簡單,是以就選擇了 jieba 進行分詞。官網有執行個體代碼,想過去應該是不會很難。

作業二,觀察了一下用友,發現提供了 api 和示例代碼以及 Json 傳回示例,猜測應該是,通過提供的程式,可以擷取到 Json 文本,然後利用得到的 Json 進行處理。通過搜尋了解到,地圖的展示也是通過模闆 + 資料,然後資料還是

{"name":xxx,"value":xxx}

,應該是和作業一一樣的處理方法。後面簡單寫了一下處理方式。和作業一套路一樣。

目前看起來作業二難度應該和作業一差不多,作業一難度主要在于反爬部分,作業二省略了資料擷取的步驟,但是可視化可以有多種多樣的樣式。

第一次個人程式設計作業

步驟 計劃時間 完成狀态
倉庫搭建 5min 完成
分析網址 30min
正規表達式
完整代碼 1h
反爬蟲
儲存為JSON
jieba分詞處理 45min
資料處理
詞雲 2h
ajax 3h
項目推送 10min
推送伺服器

利用寶塔,搭建了一個伺服器,把網址挂載在上面。

作業要求,是建立

crawl

chart

兩個分支一個是處理資料采集和代碼程式設計的,一個是資料可視化的。

倉庫分支是完成項目很重要的一個部分。個人認為,B站上面黑馬程式員的Git教程的分支管理那個圖很好了解,而小甲魚的視訊操作性更強。

爬蟲 騰訊視訊的全部評論

仔細檢視了源碼,發現評論主要在 data 下面的 oriCommList 清單裡,其他範圍的評論為子評論。個人認為子評論也算有效評論,目前不打算處理。

第一次個人程式設計作業

嘗試了 xpath 和 requests 發現不能擷取全部評論數,是以目前隻能通過 selenium 擷取,但是 selenium 效率太低了,就擷取一個評論總數,還不如打開源碼直接修改評論總數,是以暫時沒有修改

因為之前爬蟲過很多網站,同一個 user-agent 很容易被 ban ,是以目前建構了使用者代理,然後進行随機。其實還想加一個 ip 代理的,但是使用了 ip 代理的網址,上面寫的正常的 ip ,在使用的時候,拒絕連接配接。也嘗試過建構代理池。但是代理池一般都是使用docker 和 Redis 進行擷取。暫時沒有選用,之選用了使用者代理,然後在擷取 headers 的時候加個 time.sleep(1)。目前還是正常的。

4. 報錯

'utf-8' codec can't decode byte 0xff in position 1: invalid start byte

遇到這個問題,實在無語,我懷疑後面的評論是新出的 emjoy,然後utf-8不能識别,程式挂掉了。但是選取其他格式,在解釋的過程估計還會挂掉,就暫時爬到1萬條吧。

第一次個人程式設計作業

資料已經全部爬完了。需要開始進行資料處理,資料需要整理為

{"name":xxx,"value":xxx}

格式。

Python入門:jieba庫的使用參考了這位大佬的程式。在之前在閱讀制作詞雲的文章時,遇到文本問題的時候,他們會删去語氣助詞等詞。查閱資料發現已經有人整理好了,中文常用停用詞表,直接進行使用就行了。這時候就直接把分好的詞中删除,停詞即可。

參考了『NLP自然語言處理』中文文本的分詞、去标點符号、去停用詞、詞性标注這位大佬的程式。再此基礎上進行修改,并将處理好的詞組,儲存為echarts需要的格式。

def moveStopwords(words, stopwords):  # 去停用詞

    out_list = []
    for word in words:
        if word in stopwords:
            continue
        else:
            out_list.append(word)

    return out_list
           

主要就是判斷分出來的詞是否在停用詞内,不存在則存儲到清單中用于後續的使用。

def main():

    CountList = []
    stopwords = getStopwords()  # 建立停用詞
    words = dealFile()  # 處理文本
    depart = moveStopwords(words, stopwords)  # 去停用詞
    items = totol(depart)

    for i in range(len(items)):
        CountDict = {}
        word, count = items[i]
        if count >= 10:
            CountDict["name"] = word
            CountDict["value"] = count
            CountList.append(CountDict)

    saveFile(CountList)
           

增加了一個判斷語句,因為爬出來的資料很大,有很多僅出現了少次的詞組,沒有較大的意義,是以就進行了删除。

多次嘗試發現,範圍大于十的生成的圖形會比較好看。

echarts 還是挺簡單的。主要就五個步驟,然後直接在官方文檔裡面找配置項,進行更改。

由于目前版本的 echarts 是沒用詞雲的模闆的在 echarts.js 中。是以通過 GitHub 找到了 echarts-wordcloud,該文檔提供了兩份詞雲圖的模闆,直接使用就可以了。但是這個文檔裡面的資料是直接貼進去的,因為資料處理之後獲得的資料較多,通過直接粘貼的方式,其實并不友善,是以就去學了一下 Ajax 調用 JSON 來渲染網頁。因為網上有現成的,就直接改改就用了。但是有個問題,網頁渲染的效率非常的低,不知道是因為資料量太大的原因,還是程式效率太低的原因。最後加了一個儲存圖檔的工具欄,大概就這樣完成了。效果圖如下:

第一次個人程式設計作業

目前還沒有解決。嘗試過優化,但是失敗了。加了一個加載動畫,讓進入網頁不是那麼的尴尬,但是在渲染資料的時候,還是有一段時間的空白。我在想是不是資料太大的原因,然後加載資料是直接通過循環清單的長度,時間複雜度較高的原因。

詞雲圖網址挂伺服器上面了。用寶塔,挺無腦的,可玩性還挺高。

index.html 不在主目錄下面,在寶塔裡設定運作路徑,更改之後,網址不能渲染。直接帶路徑,卻可以渲染很奇怪。

你可能已經忽略的git commit規範,完整的寫法可以參考以上連接配接。

簡單的可以寫成(冒号後面有一個空格需要注意。)

<type>: <subject> //這樣的格式
           

type 主要有一下七種,根據需要進行選擇。

feat: 新增feature
fix: 修複bug
docs: 僅僅修改了文檔,如readme.md
style: 僅僅是對格式進行修改,如逗号、縮進、空格等。不改變代碼邏輯。
refactor: 代碼重構,沒有新增功能或修複bug
perf: 優化相關,如提升性能、使用者體驗等。
test: 測試用例,包括單元測試、內建測試。
chore: 改變建構流程、或者增加依賴庫、工具等。
revert: 版本復原
           

subject 就是簡短的描述一下送出内容。

需要注意的是

  1. 以動詞開頭,使用第一人稱現在時;
  2. 第一個字母小寫;
  3. 結尾不加句号(.);
  4. 内容不超過五十個字元

搭建了一個 Maven 環境,導入jar包,複制執行個體代碼,更改key。編寫一個檔案儲存函數,對擷取到的JSON文本進行儲存,資料擷取完成。

第一次個人程式設計作業

這題難點應該在于資料處理。觀察生成的 JSON 檔案,發現國家的資料主要在

country

清單中間。它是一種層級遞進的關系。直接調用

import json

庫利用遞進關系直接提取出所需要的資訊。目前還注意到,他的國家是按照洲分的,是以每個洲都要單獨的提取出來,然後進行整合處理。觀察了 echarts 的地圖模闆發現,國家是英文的,是以要對中英文進行轉化。通過用友接口提取出來的 JSON 檔案,發現資料包含,确診人數,治愈人數和死亡人數。這些資訊都可以展現在網頁上。格式大概就是

{name:“福建”,value:[{name:“時間”,value:“20180318”},{name:“數值”,value:“521990”},{name:“類型”,value:“管理”},{name:“程度”,value:“一般”}]},

具體可以參考echarts 中國地圖,tooltip,legend同時顯示多組資料

第一次個人程式設計作業

利用層級關系可以直接擷取到想要的資料。

第一次個人程式設計作業
def DealDate(data):

    data=data["data"]["continent"]
    Asia=data[0]["country"]
    Europe=data[1]["country"]
    NorthAmerica=data[2]["country"]
    SouthAmerica=data[3]["country"]
    Africa=data[4]["country"]
    Oceania=data[5]["country"]
    country=Asia+Europe+NorthAmerica+SouthAmerica+Africa+Oceania
           

首先找到一個世界地圖的模闆,DataVis-2019nCov,World Population。閱讀項目,檢視項目所需要的資料格式。然後直接引用處理過的 JSON 檔案即可。

Python入門:jieba庫的使用

中文常用停用詞表

『NLP自然語言處理』中文文本的分詞、去标點符号、去停用詞、詞性标注

基于Echarts的自定義圖案動态詞雲

5 分鐘上手 ECharts

繼續閱讀