zoukankan      html  css  js  c++  java
  • 统计微信好友信息小程序

    此小项目参考《微信好友数据分析 》——余本国

    一、功能介绍:

      本文主要介绍利用网页端微信获取数据,实现个人微信好友数据的获取,并
    进行一些简单的数据分析,功能包括:
      1.爬取好友列表,显示好友昵称、性别和地域和签名, 文件保存为 xlsx 格式
      2.统计好友的地域分布,并且做成词云和可视化展示在地图上

    二、运行环境及相关库的安装

    1. Python 3.x(使用Anaconda的spyder编辑器)
    2. 使用到的Python库安装:
    • 在Anaconda的Anaconda Prompt下运行下列命令,安装前先升级pip,代码如下:
    Python -m pip install --upgrade pip
    • 安装 wxpy: pip install wxpy
       
    • 安装 PIL: pip install pillow
       
    • 安装 pyecharts:pip install pyecharts
       
    • 安装 Itchat: pip install itchat
       
    • 安装 Jieba: pip install jieba
       
    • 安装 Pandas:pip install Pandas
       
    • 安装 Numpy:pip install Numpy
    • 安装 wordcloud:pip install wordcloud
    • 安装地图数据包:pip install echarts-china-provinces-pypkg    
      •   pip install echarts-countries-pypkg 

    代码如下

    # -*- coding: utf-8 -*-
    """
    Created on Wed Jun  5 11:44:42 2019
    
    @author: lenovo
    """
    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=[]
        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+'	'+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+'.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'C:UserslenovoAppDataLocalProgramsPythonPython37'
        
        save_wordcloud_to_html(save_road,file_name)
        shou_data_in_countrymap(save_road,file_name)
    main()

                      效果:

  • 相关阅读:
    (转)android
    (转)Eclipse 扩大内存
    (转)setTextColor()的参数设置方式
    RelativeLayout里的gravity不能居中的解决方法
    hdu1010 Tempter of the Bone
    ubuntu系统下如何禁用笔记本触摸板
    十滴水,半成品,大多数关卡可以过去,不过也有几个过不去,仍在调试中,不断更新
    HDU1007 TLE代码和AC代码对比
    hdu1013
    1005 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/DXL123/p/10978901.html
Copyright © 2011-2022 走看看