第一次個人編程作業


博客班級 2018級計算機和綜合實驗班
作業要求 第一次個人編程作業
作業目標 數據采集,反爬蟲,數據處理,可視化,Ajax,搭建服務器
作業源代碼 first-personal-work
學號 211806229

前言

詞雲圖掛服務器上面,數據加載有點慢,詞雲圖很慢才會顯示出來。

分析了一下作業,做了一張思維導圖
作業一需要通過爬蟲進行數據的獲取,查看網上的相關資料,基本都是通過 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 完成
正則表達式 30min 完成
完整代碼 1h 完成
反爬蟲 1h 完成
保存為JSON 30min 完成
jieba分詞處理 45min 完成
數據處理 1h 完成
詞雲 2h 完成
ajax 3h 完成
項目推送 10min 完成
推送服務器 30min 完成

2. 創新說明

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

二、倉庫搭建

作業要求,是創建 crawlchart兩個分支一個是處理數據采集和代碼編程的,一個是數據可視化的。
倉庫分支是完成項目很重要的一個部分。個人認為,B站上面黑馬程序員的Git教程的分支管理那個圖很好理解,而小甲魚的視頻操作性更強。

三、數據采集

爬蟲 騰訊視頻的全部評論

1)遇到的問題

1. 獲取評論的時候也將子評論爬蟲進去了。

仔細查看了源碼,發現評論主要在 data 下面的 oriCommList 列表里,其他范圍的評論為子評論。個人認為子評論也算有效評論,目前不打算處理。

2. 獲取全部評論數,直接通過 requests 獲取不到

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

3. 評論總數數據太大

因為之前爬蟲過很多網站,同一個 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 來渲染網頁。因為網上有現成的,就直接改改就用了。但是有個問題,網頁渲染的效率非常的低,不知道是因為數據量太大的原因,還是程序效率太低的原因。最后加了一個保存圖片的工具欄,大概就這樣完成了。效果圖如下:

遇到的問題

1)界面渲染很慢

目前還沒有解決。嘗試過優化,但是失敗了。加了一個加載動畫,讓進入網頁不是那么的尷尬,但是在渲染數據的時候,還是有一段時間的空白。我在想是不是數據太大的原因,然后加載數據是直接通過循環列表的長度,時間復雜度較高的原因。

六、推送服務器

詞雲圖網址掛服務器上面了。用寶塔,挺無腦的,可玩性還挺高。
index.html 不在主目錄下面,在寶塔里設置運行路徑,更改之后,網址不能渲染。直接帶路徑,卻可以渲染很奇怪。

七、git commit 規范

你可能已經忽略的git commit規范,完整的寫法可以參考以上連接。
簡單的可以寫成(冒號后面有一個空格需要注意。)

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

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

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

subject 就是簡短的描述一下提交內容。
需要注意的是

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

八、作業二:疫情統計分布信息圖

1. 數據采集

搭建了一個 Maven 環境,導入jar包,復制實例代碼,更改key。編寫一個文件保存函數,對獲取到的JSON文本進行保存,數據獲取完成。

2. 數據處理

這題難點應該在於數據處理。觀察生成的 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

3. 數據可視化

首先找到一個世界地圖的模板,DataVis-2019nCovWorld Population。閱讀項目,查看項目所需要的數據格式。然后直接引用處理過的 JSON 文件即可。

參考資料

Python入門:jieba庫的使用
中文常用停用詞表
『NLP自然語言處理』中文文本的分詞、去標點符號、去停用詞、詞性標注
基於Echarts的自定義圖案動態詞雲
5 分鍾上手 ECharts


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM