• 【Python】第一个微信小项目


    一、微信好友数据分析功能介绍

     

    1.爬取好友列表,显示好友昵称、性别和地域和签名, 文件保存为 xlsx 格式
    2.统计好友的地域分布,并且做成词云和可视化展示在地图上
    3.获取所有好友的头像,合并成一张大图

    二、需要的库

    1、Pyecharts:一个用于生成echarts图表的类库,echarts是百度开源的一个数据可视化库,用echarts生成的图可视化效果非常棒,使用pyechart库可以在python中生成echarts数据图。

    2、Itchat:一个开源的微信个人号接口,使用python调用微信从未如此简单。

    3、Jieba:简单的分词操作库。

    4、Numpy:NumPy 系统是 Python 的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩 阵。

    5、Pandas:pandas 是基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

    6、Pillow:图像处理。

    7、wxpy:wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能 扩展。 (微信本身提供)

    注:Pyecharts可能安装0.5.*的版本比较好

    以上的三方库可以通过命令符(cmd)来实现安装,具体命令:pip install ***

    另:可视化显示在地图上要安装地图数据包:

    pip install echarts-china-provinces-pypkg

    pip install echarts-countries-pypkg

    三、运行环境:

    使用 Anaconda 下的 spyder 编辑器。

    三、分步操做

    1、让程序登录微信,并获取我的好友相关信息。

     from wxpy import *           #导入模块
     bot = Bot(cache_path=True)   #初始化机器人,选择扫码登录
     friend_all = bot.friends()   #获取微信好友信息

    运行登录代码会自动弹出一个二维码页面,打开如下图 1,用手机扫码同意后,进入微信
    并获取微信好友的相关信息。

    2、获取我的信息()

    (1)利用交互式获取

    in[2]:print(friend_all[0].raw)#friend_all[0]是我的微信昵称,.raw 则是获取我的全部信息
    {'UserName': '@8c0c266b8a6e26de8ac633c1b8e9da89bc28c2b8f2ea97084f66518d2b5280ba', 'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial': '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '',
    'EncryChatRoomId': '', 'Alias': '', 'Signature': '千帆过尽还是你',
    'NickName': '杨宇平', 'RemarkPYQuanPin': '',
    'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1697661224&username=@8c0c266b8a6e26de8ac633c1b8e9da89bc28c2b8f2ea97084f66518d2b5280ba&skey=@crypt_35dd26c8_6e6d15d86316931db6d7bbb2bfe9b2e8',
    'UniFriend': 0, 'Sex': 2, 'AppAccountFlag': 0, 'VerifyFlag': 0,
    'ChatRoomId': 0, 'HideInputBarFlag': 0, 'AttrStatus': 0, 'SnsFlag': 1, 'MemberCount': 0, 'OwnerUin': 0, 'ContactFlag': 0, 'Uin': 548324490, 'StarFriend': 0, 'Statues': 0, 'MemberList': [], 'WebWxPluginSwitch': 0, 'HeadImgFlag': 1}

    (2)文件式获取

    (在原来的三行代码上加上最后一行即可)

    from wxpy import *
    bot=Bot(cache_path=True)
    friend_all = bot.friends()
    print(friend_all[0].raw)#friend_all[0]是我的微信昵称,.raw 则是获取我的全部信息

    显示效果:

    3、获取我的好友数量

    (在原先的代码上加入此行即可,直接放在交互式,文件式都可以)

    print(len(friend_all)) #好友的数量

    结果:(显示博主177个好友)

    4、把全部的好友信息转化为一个xlsx文件

    获取好友信息

    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)
        #小Flag
        list_0=[NickName, Sex, City, Province, Signature, HeadImgUrl, HeadImgFlag]
        #存为一维数组
        lis.append(list_0)
        #叠加数据

    并存为xlsx文件

    def lis2e17(filename,lis):#把数据存到表格中
        import openpyxl
        wb = openpyxl.Workbook()
        sheet = wb.active
        sheet.title = 'list2excel17'
        file_name = filename +'.xlsx'
        title=['NickName','Sex','City','Province','Signature','HeadImgUrl','HeadImgFlag']
        
        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("写入数据成功!")
    print(lis2e17('yyp',lis))

    结果:

    5、把好友的地区用词云统计

    (1)给原先的yyp.xlsl加上行标题,例如:nickname sex city province signature headImgUrl headImgFlag(因为下面的词云运用,要用到city索引,才能调用city那一列),另存为yyp_1.xlsx文件

    #对数据进行初步探索
    #方法一
    #粗略获取好友的统计信息
    Friends = bot.friends()
    data = Friends.stats_text(total=True, sex=True,top_provinces=30, top_cities=500)
    print(data)
    from pandas import read_excel 
    df = read_excel('yyp_1.xlsx',sheetname='list2excel17') #把yyp.xlsx加上列标题行,另存为yyp_1.xlsx,读取新的表格
    df.tail(5)
    df.city.count()
    df.city.describe()
    #把好友信息(地区)统计,词云
    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()

     (2)将词云图转为HTML的形

    这需要用到pyecharts库的0.5版本,anaconde3原先的是1.0版本的,需要删了这个,安装0.5版本

    具体操作可参考博文 https://www.jianshu.com/p/eaad92f6d9ee 

    代码实现如下:

    #利用 pyechart 做词云
    import pandas as pd
    #count = df.city.value_counts() #对 dataframe 进行全频率统计,排除了 nan
    city_list = df['city'].fillna('NAN').tolist()#将 dataframe 的列转化为 list,其中的 nan 用“NAN” 替换
    count_city = pd.value_counts(city_list)#对 list 进行全频率统计 
    from pyecharts.charts.wordcloud 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(r'D:Pythonwechatcloud.html')

    效果如下:

    6、把好友的地区转为地图形式

     要加入模块 import pandas as pd 在添加下面代码

    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=1300, height=700)
    map.add("", attr, value, maptype='china', is_visualmap=True,visual_text_color='#000',is_label_show = True)
    #显示地图上的省份
    map.show_config()
    map.render(r'D:PythonwechatProMap.html')

    显示效果如下:

    7、总代码:

    # -*- coding: utf-8 -*-
    """
    Created on Sun Jun  2 23:38:29 2019
    
    @author: yyp
    """
    from wxpy import *  
    import pandas as pd  #地图那要用到的模块
    bot=Bot(cache_path=True)
    friend_all = bot.friends()
    print(friend_all[0].raw)#friend_all[0]是我的微信昵称,.raw 则是获取我的全部信息
    a=len(friend_all)#输出好友个数
    print(a)
    lis=[]
    
    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)
    
    
    def lis2e17(filename,lis):#把数据存到表格中
        import openpyxl
        wb = openpyxl.Workbook()
        sheet = wb.active
        sheet.title = 'list2excel17'
        file_name = filename +'.xlsx'
        title=['NickName','Sex','City','Province','Signature','HeadImgUrl','HeadImgFlag']
        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("写入数据成功!")
    print(lis2e17('yyp',lis))
    
    
    #对数据进行初步探索
    #方法一
    #粗略获取好友的统计信息
    #另存文件
    Friends = bot.friends()
    data = Friends.stats_text(total=True, sex=True,top_provinces=30, top_cities=500)
    print(data)
    from pandas import read_excel 
    df = read_excel('yyp_1.xlsx',sheetname='list2excel17') #把yyp.xlsx加上列标题行,另存为yyp_1.xlsx,读取新的表格
    df.tail(5)
    df.city.count()
    df.city.describe()
    
    '''#把好友信息(籍贯)统计,词云(常规)
    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()'''
    
    '''#利用 pyechart 做词云(以HTML的形式显示)
    import pandas as pd
    #count = df.city.value_counts() #对 dataframe 进行全频率统计,排除了 nan
    city_list = df['city'].fillna('NAN').tolist()#将 dataframe 的列转化为 list,其中的 nan 用“NAN” 替换
    count_city = pd.value_counts(city_list)#对 list 进行全频率统计 
    from pyecharts.charts.wordcloud 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(r'D:Pythonwechatcloud.html')'''
    
    #把好友的地区显示在地图上(以地图的形式呈现)
    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=1300, height=700)
    map.add("", attr, value, maptype='china', is_visualmap=True,visual_text_color='#000',is_label_show = True)#显示地图上的省份
    map.show_config()
    map.render(r'D:PythonwechatProMap.html')
  • 相关阅读:
    451. Sort Characters By Frequency
    424. Longest Repeating Character Replacement
    68. Text Justification
    44. Wildcard Matching
    160. Intersection of Two Linked Lists
    24. Swap Nodes in Pairs
    93. 递归实现组合型枚举
    98. 分形之城
    97. 约数之和
    96. 奇怪的汉诺塔
  • 原文地址:https://www.cnblogs.com/yyp-20190107/p/10971319.html
Copyright © 2020-2023  润新知