利用itchat介面進行微信好友資料分析
阿新 • • 發佈:2019-02-12
配置環境
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:程式碼那裡有問題可以私我哦~