使用 python 進行微信好友分析


一.環境要求

Windows 10;python 3.7;

第三方庫

wxpy 0.3.9.8——登錄微信
openpyxl 2.6.2——可對 excel 表格進行操作

pyecharts 0.5.11——百度的開源可視化庫,

wordcloud 1.5.0——詞雲制作庫

matplotlib 3.1.0——生成詞雲圖

pandas 0.24.2——讀取 excel 表格的數據

pyecharts-snapshot 0.2.0——是 pyecharts 的依賴庫之一

echarts-countries-pypkg——pyecharts 的世界地圖包

echarts-china-provinces-pypkg——pyecharts 的中國省份地圖包

 

第三方庫的安裝

(2019年6月10號)除了 pyecharts 其它都可以直接使用 pip 安裝,而安裝 pycharts 需要特殊些(因為最新版已出為 1.X版,不向下兼容),如下:
pip install wxpy
pip install openpyxl
pip install PIL
pip install pandas
pip install wordcloud
 
pip install pyecharts==0.5.11
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install pyecharts-snapshot

 

二.分析思路

 1.登錄微信,獲取好友的基本信息

使用 wxpy 的 Bot() 模塊,登錄微信

In [3]: from wxpy import * #導入模塊
In [4]: bot=Bot(cache_path=True)#初始化機器人,選擇緩存模式(掃碼)登錄Getting uuid of QR code.
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Loading the contact, this may take a little while.
Login successfully as 美好時光一定會來
 
In [5]: friend_all=bot.friends()
 
In [6]: print(friend_all[0].raw)#friend_all[0]是你的微信昵稱,.raw則是獲取你的全部信息

2、統計用戶信息

In [7]: len(friend_all) #統計查閱了多少好友
Out[7]: 155
1.   為了獲取好友信息中需要的部分,我們對信息需要進行處理。從上面的獲取信息全字段來看,我們獲取的每位好友的信息都是一個字典,字典里只有'City'、'Province'、'Signature'、
'NickName'、'HeadImgUrl'、'Sex'是我們需要的。下面我們就對這幾個 key 進行提取。方法是:對這幾個 key 提取相應的值,放入一個列表 list_0 中,即每個好友的這些 key
的值做成了一個列表,在對所有的好友使用 for 循環進行同樣的操作,將所有好友的列表做成一個大列表 lis 的元素,即列表中的元素是列表。 
In[7]:lis=[] #lis=['nickname','sex','city','province','headImgUrl','headImgFlag']
In[8]:for a_friend in friend_all:
    NickName=a_friend.raw.get('NickName',None)
    #Sex=a_friend.raw.get('Sex',None)
    Sex={1:"",2:"",0:"其他"}.get(a_friend.raw.get('Sex',None),None)
    City=a_friend.raw.get('City',None)
    Province=a_friend.raw.get('Province',None)
    Signature=a_friend.raw.get('Signature',None)
    HeadImgUrl=a_friend.raw.get('HeadImgUrl',None)
    HeadImgFlag=a_friend.raw.get('HeadImgFlag',None)
    list_0=[NickName,Sex,City,Province,Signature,HeadImgUrl,HeadImgFlag]
    lis.append(list_0)
 
  2.   為了將 lis 列表能夠保存到 excel 中,便於后面的使用,也便於此方法的再次使用,我們將這個功能寫成函數 lis2e19(),即將這種列表套列表的 lis 轉成 19 版的 exce 進行保存在本地。
def lis2e19(filename,lis):
    '''
    將列表寫入 07 版 excel 中,其中列表中的元素是列表.
    filename:保存的文件名(含路徑)
    lis:元素為列表的列表,如下:
    lis = [["名稱", "價格", "出版社", "語言"],
            ["暗時間", "32.4", "人民郵電出版社", "中文"],
            ["拆掉思維里的牆", "26.7", "機械工業出版社", "中文"]]
    '''
    import openpyxl
    wb = openpyxl.Workbook()
    sheet = wb.active
    sheet.title = 'list2excel19'
    file_name = filename
    for i in range(0, len(lis)):
        for j in range(0, len(lis[i])):
            sheet.cell(row=i+1, column=j+1, value=str(lis[i][j])) 
    
    wb.save(file_name)
    print("寫入數據成功!")
lis2e19(r'D:xm_wechat)

3.  將列表信息存儲到 excel 中,文件名為 wechat_02.xlsx。

lis2e19(r'D:xm_wechat)

打開文件(部分截圖):

 

4.  對數據進行初略的認知分析。

#對數據進行初步探索
#方法一
#粗略獲取好友的統計信息
data = friend_all.stats_text(total=True, sex=True,top_provinces=10, top_cities=100)
from pandas import read_excel
df=read_excel(r'C:\Users\Benny\Desktop\Python\Python練習\wechat_02.xlsx',sheetname='list2excel19')
print(data)

部分數據截圖如下:

 

5  對 city 列數據做成詞雲

方法一:利用 plt+wordcloud 方法

 
from wordcloud import WordCloud 
import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame
word_list= df['city'].fillna('0').tolist()#將 dataframe 的列轉化為 list,其中的 nan 用“0”替換
new_text = ' '.join(word_list) 
wordcloud = WordCloud(font_path='simhei.ttf', background_color="black").generate(new_text) 
plt.imshow(wordcloud) 
plt.axis("off") 
plt.show()

圖片:

 

6 將好友可視化展示在地圖上 

#將這些個好友在全國地圖上做分布
province_list = df['province'].fillna('NAN').tolist()
#將 dataframe 的列轉化為 list,其中的 nan 用“NAN”替換
count_province = pd.value_counts(province_list)#對 list 進行全頻率統計
from pyecharts import Map 
value =count_province.tolist() 
attr =count_province.index.tolist()
map=Map("各省微信好友分布", width=1200, height=600) 
map.add("", attr, value, maptype='china', is_visualmap=True, 
 visual_text_color='#000',
is_label_show = True) #顯示地圖上的省份
map.show_config() 
map.render(r'C:\Users\Benny\Desktop\Python\map3.html')

 圖片:

 

 

三 全部代碼:

一、環境與庫准備:

Anaconda Prompt下運行:

 

# -*- coding: utf-8 -*-
"""
Created on Wed Jun  5 12:52:28 2019

@author: ausa
"""

from wxpy import*
import openpyxl
import pandas as pd
from wordcloud import WordCloud 
import matplotlib.pyplot as plt
from pyecharts import Map 


def connect_in():
    ''' 
    連接網頁版微信並返回所有朋友信息
    bot:初始化機器人並選擇緩存模式(掃碼)登錄
    friend_all:獲取我所有微信好友信息
    '''
    bot=Bot(cache_path=True)
    friend_all=bot.friends()
    return friend_all

def analyse_friends(friend_all,top_provinces=10,top_cities=100):
    Friends = friend_all
    data = Friends.stats_text(total=True, sex=True,top_provinces=30, top_cities=500)
    print(data)

def get_column_title():
    '''輸入並列標題行
        ls=[]  默認為無
    '''
    column_titles=['NickName','Sex','City','Province',\
            'Signature','HeadImgUrl','HeadImgFlag']
    return colomn_titles

def data_dict_to_list(friend_all):
    '''
    data_ls:初值:設列表初值為包含列標題行列表的列表\
            遍歷所有好友信息字典提取數據加入到數據列表,並返回此數據列表
    list_0:一個微信好友的數據列表,包括'NickName','Sex','City','Province',\
            'Signature','HeadImgUrl','HeadImgFlag'.
    '''
    data_lis=[['NickName','Sex','City','Province','Signature','HeadImgUrl',\
               'HeadImgFlag']]
    for a_friend in friend_all:
        NickName = a_friend.raw.get('NickName',None)
        #Sex = a_friend.raw.get('Sex',None)
        Sex ={1:"",2:"",0:"其它"}.get(a_friend.raw.get('Sex',None),None)
        City = a_friend.raw.get('City',None)
        Province = a_friend.raw.get('Province',None)
        Signature = a_friend.raw.get('Signature',None)
        HeadImgUrl = a_friend.raw.get('HeadImgUrl',None)
        HeadImgFlag = a_friend.raw.get('HeadImgFlag',None)
        list_0=[NickName,Sex,City,Province,Signature,HeadImgUrl,HeadImgFlag]
        data_lis.append(list_0)
    return data_lis
    
def data_lis_savein_excel(data_lis=[],filename='wechat_data',\
                          sheet_title='wechat1'):
    '''
    將列表寫入 07 版 excel 中,其中列表中的元素是列表.
    filename:保存的文件名(含路徑)
    lis:元素為列表的列表,如下:
    lis = [["名稱", "價格", "出版社", "語言"],
           ["暗時間", "32.4", "人民郵電出版社", "中文"],
           ["拆掉思維里的牆", "26.7", "機械工業出版社", "中文"]]
    '''
    wb = openpyxl.Workbook()
    sheet = wb.active
    sheet.title =sheet_title
    file_name = filename +'.xlsx'
    for i in range(0, len(data_lis)):
        for j in range(0, len(data_lis[i])):
            sheet.cell(row=i+1, column=j+1, value=str(data_lis[i][j]))
    wb.save(file_name)
    return file_name
    print("寫入數據成功!")

def count_sing(file_name,sheet_name='wechat1',column_name='NickName'):
    '''輸出單個列的統計數據'''
    f=open(file_name,'rb')
    data=pd.read_excel(f,sheetname=sheet_name)
    print(column_name+'\t'+str(data[column_name].count()))
    print(data[column_name].describe())
    f.close()

def wordcloud_show(file_name,sheet_name='wechat1',column_name='City'):
    '''用 plt+wordcloud 方法得到詞雲圖'''
    f=open(file_name,'rb')
    data=pd.read_excel(f,sheetname=sheet_name)
    word_list= data[column_name].fillna('0').tolist()
    #將 dataframe 的列轉化為 list,其中的 nan 用“0”替換
    new_text = ' '.join(word_list) 
    wordcloud = WordCloud(font_path='simhei.ttf', \
                          background_color="black").generate(new_text) 
    plt.imshow(wordcloud) 
    plt.axis("off") 
    plt.show()
    f.close()
    
def save_wordcloud_to_html(save_road,file_name,sheet_name='wechat1',\
                           column_name='City'):
    '''利用 pyecharm 做詞雲並存為html文件'''
    f=open(file_name,'rb')
    data=pd.read_excel(f,sheetname=sheet_name)
    #count = df.city.value_counts() #對 dataframe 進行全頻率統計,排除了 nan
    city_list = data[column_name].fillna('NAN').tolist()
    #將 dataframe 的列轉化為 list,其中的 nan 用“NAN”替換
    count_city = pd.value_counts(city_list)#對 list 進行全頻率統計
    from pyecharts import WordCloud
    name = count_city.index.tolist()
    value = count_city.tolist()
    wordcloud = WordCloud(width=1300, height=620)
    wordcloud.add("", name, value, word_size_range=[20, 100])
    wordcloud.show_config()
    wordcloud.render(save_road+'wordcloud'+'.html')
    f.close()

def shou_data_in_countrymap(save_road,file_name,sheet_name='wechat1',\
                           column_name='Province'):
    '''將這些個好友在全國地圖上做分布'''
    f=open(file_name,'rb')
    data=pd.read_excel(f,sheetname=sheet_name)
    province_list = data[column_name].fillna('NAN').tolist()
    #將 dataframe 的列轉化為 list,其中的 nan 用“NAN”替換
    count_province = pd.value_counts(province_list)#對 list 進行全頻率統計
    value =count_province.tolist() 
    attr =count_province.index.tolist()
    map=Map("各省微信好友分布", width=1200, height=600) 
    map.add("", attr, value, maptype='china', is_visualmap=True, 
    visual_text_color='#000',
    is_label_show = True) #顯示地圖上的省份
    map.show_config() 
    map.render(save_road+'map1'+'.html')
    f.close()
    

def main():
    friends_data=connect_in()
    data_ls=data_dict_to_list(friends_data)
    file_name=data_lis_savein_excel(data_ls)
    analyse_friends(friends_data)
    count_sing(file_name)
    wordcloud_show(file_name)
    save_road=r'D:\xm_wechat'
    save_wordcloud_to_html(save_road,file_name)
    shou_data_in_countrymap(save_road,file_name)
main()

 

創建圖靈機器人: 
from wxpy import Bot,Tuling,embed,ensure_one
bot = Bot()
my_friend = ensure_one(bot.search('顧嘉偉'))  #想和機器人聊天的好友的備注
tuling = Tuling(api_key='ee8fb3854a6d40c1a0e42f57d7ac0342')
@bot.register(my_friend)  # 使用圖靈機器人自動與指定好友聊天
def reply_my_friend(msg):
    tuling.do_reply(msg)
embed()

 

 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

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



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