1. 程式人生 > >利用itchat介面進行微信好友資料分析

利用itchat介面進行微信好友資料分析

配置環境

python3
所需模組: itchat \ codecs \ json \ pyecharts \ collections \ jieba

主題思路

通過itchat登陸微信網頁版,然後獲取好友的暱稱、省份、簽名等等,然後利用重新封裝的百度開源的echarts的python版pyecharts進行視覺化分析,主要有四種方式:柱狀圖、餅圖、地圖、詞雲。程式碼邏輯並不難,非常簡單,細節需要注意,比如各種介面所需要的資料型別不同,需要進行轉變。通過這次寫程式碼,我發現官方文件真的好用,無需記憶,隨用隨查罷了。
pyecharts官方文件
itchat官方文件
以上兩個是這次主要用到的兩個庫

程式碼(當然是具有優美註釋的啦)

import itchat
import codecs
import json
from pyecharts import Bar,Pie,Map,WordCloud
# 容器類
from collections import Counter
import jieba.analyse

# 資料儲存方法,為了防止編碼不統一的情況,使用codecs來進行開啟
def saveFriends(friendsList):
    outputFile = './result/friends.json'
    with codecs.open(outputFile,'w'
,encoding='utf-8') as jsonFile: # 預設使用ascii,為了輸出中文將引數ensure_ascii設定成False jsonFile.write(json.dumps(friendsList,ensure_ascii=False)) def getFriends(inputFile): with codecs.open(inputFile,encoding='utf-8') as f: friendsList = json.load(f) return friendsList # 繪製柱狀圖
def drawBar(name,rank): outputFile = './result/省份柱狀圖.html' bar = Bar(title='省份分佈柱狀圖',width=1200,height=600,title_pos='center') bar.add( '', # 註解label屬性 name, # 橫 rank # 縱 ) bar.show_config() bar.render(outputFile) # 繪製餅圖 def drawPie(name,rank): outputFile = './result/性別比例圖.html' pie = Pie('性別比例圖', width=1200, height=600, title_pos='center') pie.add( '', name,rank, is_label_show = True, # 是否顯示標籤 label_text_color = None, # 標籤顏色 legend_orient = 'vertical', # 圖例是否垂直 legend_pos = 'left' ) pie.render(outputFile) # 繪製地圖 def drawMap(name,rank): outputFile = './result/區域分佈圖.html' map = Map(title='微信好友區域分佈圖', width=1200, height=600, title_pos='center') map.add( '',name,rank, maptype = 'china', # 地圖範圍 is_visualmap = True, # 是否開啟滑鼠縮放漫遊等 is_label_show = True # 是否顯示地圖示記 ) map.render(outputFile) # 繪製個性簽名詞雲 def drawWorldCloud(name,rank): outputFile = './result/簽名詞雲.html' cloud = WordCloud('微信好友簽名詞雲圖', width=1200, height=600, title_pos='center') cloud.add( ' ',name,rank, shape='circle', background_color='white', max_words=200 ) cloud.render(outputFile) # 實現將counter資料結構拆分成兩個list,再傳給pyecharts def counter2list(_counter): nameList,countList = [],[] for counter in _counter: nameList.append(counter[0]) countList.append(counter[1]) return nameList,countList def dict2list(_dict): nameList, countList = [], [] for key,value in _dict.items(): nameList.append(key) countList.append(value) return nameList, countList # 利用jieba模組提取出關鍵詞並計算其權重,利用了TF-IDF演算法 def extractTag(text,tagsList): if text: tags = jieba.analyse.extract_tags(text) for tag in tags: tagsList[tag] += 1 if __name__ == '__main__': # 性別在itchat介面獲取的資料中顯示的是0,1,2三種我們使用一個字典將其對映為男、女、其他 sexList = {'0': '其他', '1': '男', '2': '女'} # 自動登陸 itchat.auto_login() # 利用API獲取朋友列表 friends = itchat.get_friends(update=True) friendsList = [] for friend in friends: # 將friends提取出有用資料並存放在字典中 item = {} item['NickName'] = friend['NickName'] item['Sex'] = sexList[str(friend['Sex'])] item['Province'] = friend['Province'] item['Signature'] = friend['Signature'] # 為了獲取頭像用 item['UserName'] = friend['UserName'] friendsList.append(item) # 儲存好友列表的json資訊 saveFriends(friendsList) # 讀取friends.json中的資料 inputFile = './result/friends.json' friendList = getFriends(inputFile) # 需要統計的欄位使用counter資料型別儲存 provinceCounter = Counter() sexDict = {'男':0,'女':0,'其他':0} signatureCounter = Counter() for friend in friendList: if friend['Province'] != '': provinceCounter[friend['Province']] += 1 sexDict[friend['Sex']] += 1 extractTag(friend['Signature'],signatureCounter) # 統計出排名前16的省份 provinceList,rankList = counter2list(provinceCounter.most_common(15)) # 繪製柱狀圖 drawBar(provinceList, rankList) # 繪製地圖 drawMap(provinceList, rankList) # 繪製男女比例餅圖 sexList,percentList = dict2list(sexDict) drawPie(sexList, percentList) # 繪製詞雲 tagsList,rankList = counter2list(signatureCounter.most_common(200)) drawWorldCloud(tagsList, rankList)

實現結果

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

最後的兩句

這次並沒有講太多的細節,因為好睏了= =,在此處鳴謝知乎二胖學習了一些python技巧,比如codecs讀取檔案來繞開編碼問題,這簡直就是神器好嗎,想起了哪些被編碼支控的恐懼了。本次demo學習歷時兩天,在公司寫了一部分,然後發現帶不出來,想上傳到github上還差點違規,只好回家又寫了一遍,以後還是在家在寫吧,寫程式碼的時候能比看論文開心點,醬,晚安。
PS:程式碼那裡有問題可以私我哦~