1. 程式人生 > >微信的祕密-python視覺化微信好友資訊

微信的祕密-python視覺化微信好友資訊

記得2016年第一次開通微信的時候,我以及周圍的大多數人還是重度的QQ使用者,當時只是跟風開通了一下,也沒覺得會改變什麼。沒想到才兩年過去,我已經忘記了QQ的存在,每天起來第一件事就是檢視微信,睡覺前也必然要看一下朋友圈有什麼好玩有意義的事情,不得不說騰訊的產品策略絕對是一流的。那麼我們能用python對微信做些什麼呢?
還好微信官方有一個比較冷門的python庫-itchat,這是微信提供的一個藉口,我們可以藉由它來實現對微信資訊的提取,本文要做的是提取微信好友資訊並對個性簽名進行視覺化處理。
首先安裝我們所需要的庫:

pip install itchat
pip install matplotlib.
pyplot #用於生成2D圖 pip install jieba #用於中文分詞 pip install wordcloud #用於詞雲生成

第一步:提取好友資訊:
呼叫itchat,通過掃碼登陸網頁微信獲取返回的好友資訊,程式碼如下:

def get_data():
	itchat.auto_login()   #呼叫登陸模組
	friends=itchat.get_friends(update=True)  #獲取好友資訊
	return friends

執行程式掃描生成的二維碼登陸微信姐可以看到所有的好友資訊,涉及隱私,這裡就不放圖了。
第二步:通過對返回的資訊分析發現,每一行為一個好友的完整資訊,用‘,’隔開順序依次為:暱稱,備註名,性別(1為男,2為女,0為不確定(什麼鬼阿),省份,城市,個性簽名,星標,特殊好友許可權),這裡定義一個函式將獲取的資料儲存到列表中,程式碼如下:

def prase_data(data):
	friends=[]
	for item in data[1:]:
		friend={
		'NickName':item['NickName'],                           #暱稱
		'RemarkName':item['RemarkName'],                   #備註名
		'Sex':item['Sex'],#性別
		'Province':item['Province'],#省份
		'City':item['City'],#城市
		'Signature':item['Signature'
].replace('\n',' ').replace(' ',' '), #處理換行問題 'StarFriend':item['StarFriend'],#星標朋友 'ContactFlag':item['ContactFlag'] #好友許可權 } friends.append(friend) return friends

第三步:再定義一個函式將獲取的列表儲存為.txt檔案,程式碼如下:

def save_to_txt():
	
	friends=prase_data(get_data())
	for item in friends:
		with open ('jjdfriend.txt','a',encoding='utf-')as f:
			f.write('%s,%s,%d,%s,%s,%s,%d,%d\n'%(
			item['NickName'],item['RemarkName'],item['Sex'],
			item['Province'],item['City'],item['Signature'],
			item['StarFriend'],item['ContactFlag']))

第四步:接下來是最重要的部分,獲取個性簽名並生成詞雲,安裝好所需要的庫檔案之後,程式碼如下:

from wordcloud import WordCloud,STOPWORDS
import matplotlib.pyplot as plt
import jieba

signs=[]
with open ('fkdfriend.txt','r',encoding='utf-8')as f:
	rows=f.readlines()
	for row in rows:
		sign=row.split(',')[5]
		if sign!="":
			signs.append(sign)
			
split=jieba.cut(str(signs))#分詞
words=' '.join(split)#以空格連線
stopwords=STOPWORDS.copy()#設定遮蔽詞
stopwords.add('span')
stopwords.add('class')
stopwords.add('emoji1f334')
stopwords.add('emoji1f388')
stopwords.add('emoji1f33a')
stopwords.add('emoji1f33c')
stopwords.add('emoji1f3633')

bg_image=plt.imread('ground.jpg')
wordcloud = WordCloud(mask=bg_image,background_color='white',scale=1.5,stopwords=stopwords).generate(words)
#image_colors=ImageColorGenerator(bg_image)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
wordcloud.to_file('word.jpg')

生成的圖片如下:在這裡插入圖片描述
問題來了,為什麼生成的是亂碼,查詢資料後發現wordcloud是預設不支援中文的,所以我們需要進行一些操作,首先找到系統中的字型資料夾:位置為:C:\Windows\Font,開啟后里有這些字型:
在這裡插入圖片描述
這裡我選擇了微軟雅黑字型,接下來需要將字型檔案複製到系統安裝wordcloud位置,路徑如下:C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\wordcloud,將選擇字型貼上到資料夾內,如下圖:
在這裡插入圖片描述
並且修改上面一句程式碼為:

wordcloud = WordCloud(mask=bg_image,background_color='white',font_path='msyhbd.ttc',scale=1.5,stopwords=stopwords).generate(words)#增加中文字型

執行成功,效果如下:

在這裡插入圖片描述
通過詞雲,你或許會恍然大悟,原來你們這樣的人啊。是啊,在現在這個社會,我們似乎更像是一個行走的資料包,而且幾乎每時每刻都在產生新資料,有很多人對大資料時代感到恐懼,認為隱私會被濫用之類。但事實上,每一次新技術的出現伊始都會有這樣的聲音,但我相信技術是無罪的,有問題的只是一部分人而已,並且這樣的人無論什麼時代都會存在,所以讓我們敞開胸懷,擁抱這個美好的大資料時代。
當然,微信好友中能處理的資訊還有很多,比如性別分佈,地理位置都很有分析價值,有興趣的可以嘗試,這裡推薦一個百度開源的python視覺化庫-pyecharts,這個庫可以很大程度上替代matplotlib,pygal以及Geo。好了,就囉嗦這麼多。

備註:本文中涉及的jieba庫所用到的分詞技術看起來好像是一個很神奇的東西,原來我也這麼認為,但直到看來吳軍先生的《數學之美》一書,發現它的解決依舊是使用了很常見的數學模型-馬爾科夫鏈,感興趣的可以閱讀這一部分內容。