博客班級 | 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. 創新說明
利用寶塔,搭建了一個服務器,把網址掛載在上面。
二、倉庫搭建
作業要求,是創建 crawl
和chart
兩個分支一個是處理數據采集和代碼編程的,一個是數據可視化的。
倉庫分支是完成項目很重要的一個部分。個人認為,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. 數據采集
搭建了一個 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-2019nCov,World Population。閱讀項目,查看項目所需要的數據格式。然后直接引用處理過的 JSON 文件即可。
參考資料
Python入門:jieba庫的使用
中文常用停用詞表
『NLP自然語言處理』中文文本的分詞、去標點符號、去停用詞、詞性標注
基於Echarts的自定義圖案動態詞雲
5 分鍾上手 ECharts