zoukankan      html  css  js  c++  java
  • 我的第一个微信好友分析

    主要介绍利用网页端微信获取数据,实现个人微信好友数据的获取,并进行一些简单的数据分析。

    一、所需要的七个第三方库及其安装

    1、Pillow

    PIL:Python Imaging Library,已经是 Python 平台事实上的图像处理标准库。PIL功能非常强大,但API却非常简单易用。

    如果安装了Anaconda,Pillow就已经可用了。否则,需要在命令行下通过pip安装:

    pip install pillow

    如果遇到Permission denied安装失败,请加上sudo重试。

    2、Pyecharts

    是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。使用pyecharts可以生成独立的网页,也可以在flask、django中集成使用。

    可在命令行通过pip安装:

    pip install pyecharts 

    3、Itchat

    itchat 是一个开源的微信个人号接口,使用 python 调用微信从未如此简单。

    可在在命令行通过pip安装:

    pip install itchat

    4、Jieba

    Jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,下面是三种模式的特点。

    精确模式:试图将语句最精确的切分,不存在冗余数据,适合做文本分析

    全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据

    搜索引擎模式:在精确模式的基础上,对长词再次进行切分

    可在在命令行通过pip安装:

    pip install jieba

    5、Numpy

    NumPy 是一个 Python 的第三方库,代表 “Numeric Python”,主要用于数学/科学计算。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。

    使用 Numpy 我们可以轻松进行如下等计算:

    • 数组的算数和逻辑运算。
    • 傅立叶变换和用于图形操作的例程。
    • 与线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。

    可在在命令行通过pip安装:

    pip install Numpy

    6、Pandas

    Pandas 是基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas 提

    供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使 Python 成为强大而高效的数据分析环境的重要因素之一。

    可在在命令行通过pip安装:

    pip install Pandas

    7、wxpy

    wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。

    可在在命令行通过pip安装:

    pip install wxpy

    8、安装地图数据包:

    pip install echarts-china-provinces-pypkg
    pip install echarts-countries-pypkg

    二、开始分析

    1、首先登录自己的微信

    from wxpy import *
    #初始化机器人,选择缓存模式(扫码)登录
    bot = Bot(cache_path=True)
    #获取我的所有微信好友信息
    friend_all = bot.friends()

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

    print(friend_all[0].raw)#获取自己的全部信息
    print(len(friend_all))#输出自己的微信好友人数

    为了获取好友信息中需要的部分,我们对信息需要进行处理。从上面的获取信息全字段来看,我们获取的每位好友的信息都是一个字典,字典里只有'City'、'Province'、'Signature'、
    'NickName'、'HeadImgUrl'、'Sex'是我们需要的。下面我们就对这几个 key 进行提取。

    lis=[]
    infoTitle=['NickName', 'RemarkName', 'Sex', 'Province', 'City']
    def getmessage():                       #获取好友的全部信息
        for a_friend in friend_all:
            NickName = a_friend.raw.get(infoTitle[0], None) #昵称
            RemarkName = a_friend.raw.get(infoTitle[1], None)#备注
            Sex = {1:"男", 2:"女", 0:"保密"}.get(a_friend.raw.get(infoTitle[2], None), None)#性别
            Province = a_friend.raw.get(infoTitle[3], None)#省份
            City = a_friend.raw.get(infoTitle[4], None)#城市
            list_0 = [NickName, RemarkName, Sex, Province, City]
            lis.append(list_0)

     将 lis 列表能够保存到 excel 中:

    def savemessage():
        workbook = openpyxl.Workbook()
        sheet = workbook.active
        sheet.title = '微信好友信息'
        for k in range(len(infoTitle)):
            sheet.cell(row=1, column=k+1, value=infoTitle[k])
        for i in range(FriNum):
            for j in range(len(infoTitle)):
                sheet.cell(row=i+2, column=j+1, value=str(lis[i][j]))
        workbook.save('C:\Users\Administrator\Desktop\wxfx.xlsx')

    运行后结果如图:

    对数据进行简单的分析:

    Friends = bot.friends()
    data = Friends.stats_text(total=True, sex=True,top_provinces=30, top_cities=500)
    print(data)

    结果如图:

    将好友所在的城市用词云图显示:

    def creatcity():
        cityStr = ""
        for i in range(FriNum):
            if lis[i][4] not in cityStr:
                cityStr += " " +lis[i][4]
        wordlist = jieba.lcut(cityStr)
        cityStr = ' '.join(wordlist)
        wc = WordCloud(
            background_color = 'white',
            max_words = 50,
            font_path = 'simhei.ttf',
            height = 400,
            width = 400,
            max_font_size = 100,
            random_state = 50,
            )
        myword = wc.generate(cityStr)
        plt.imshow(myword)
        plt.axis('off')
        plt.show()
        wc.to_file('C:\Users\Administrator\Desktop\city.jpg')

    运行结果如图:

     

    生成微信好友在广东省分布的城市图:

    def creatcitymap():
        CityList=[]
        CityNum = []
        for i in range(FriNum):
            if lis[i][4] not in CityList:
                CityList.append(lis[i][4])
                CityNum.append(0)
        for i in range(FriNum):
            for j in range(len(CityList)):
                if lis[i][4] == CityList[j]:
                    CityNum[j] += 1
        for i in range(len(CityList)):
            CityList[i] += ''
        map=Map(width=1000, height=1000)
        map.add("", CityList, CityNum, maptype="广东", is_visualmap=True, visual_text_color='#000')
        map.render('C:\Users\Administrator\Desktop\citymap.html')

    结果如图:

     这就是对微信的一些简单的数据分析。

    完整代码如下:

    from wxpy import Bot
    import openpyxl
    from pyecharts import Map
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    import jieba
    #初始化机器人,选择缓存模式(扫码)登录
    bot = Bot(cache_path=True)
    #获取我的所有微信好友信息
    friend_all = bot.friends()                                  #self.allFriends_Info = self.bot.friends()
    FriNum=len(friend_all)                                      #self.allFriends_Num = len(self.allFriends_Info)
    lis=[]
    infoTitle=['NickName', 'RemarkName', 'Sex', 'Province', 'City']
    def getmessage():                       #获取好友的全部信息
        for a_friend in friend_all:
            NickName = a_friend.raw.get(infoTitle[0], None) #昵称
            RemarkName = a_friend.raw.get(infoTitle[1], None)#备注
            Sex = {1:"", 2:"", 0:"保密"}.get(a_friend.raw.get(infoTitle[2], None), None)#性别
            Province = a_friend.raw.get(infoTitle[3], None)#省份
            City = a_friend.raw.get(infoTitle[4], None)#城市
            list_0 = [NickName, RemarkName, Sex, Province, City]
            lis.append(list_0)
    def savemessage():
        workbook = openpyxl.Workbook()
        sheet = workbook.active
        sheet.title = '微信好友信息'
        for k in range(len(infoTitle)):
            sheet.cell(row=1, column=k+1, value=infoTitle[k])
        for i in range(FriNum):
            for j in range(len(infoTitle)):
                sheet.cell(row=i+2, column=j+1, value=str(lis[i][j]))
        workbook.save('C:\Users\Administrator\Desktop\wxfx.xlsx')
    
    
    def creatcity():
        cityStr = ""
        for i in range(FriNum):
            if lis[i][4] not in cityStr:
                cityStr += " " +lis[i][4]
        wordlist = jieba.lcut(cityStr)
        cityStr = ' '.join(wordlist)
        wc = WordCloud(
            background_color = 'white',
            max_words = 50,
            font_path = 'simhei.ttf',
            height = 400,
            width = 400,
            max_font_size = 100,
            random_state = 50,
            )
        myword = wc.generate(cityStr)
        plt.imshow(myword)
        plt.axis('off')
        plt.show()
        wc.to_file('C:\Users\Administrator\Desktop\city.jpg')
    
    def creatcitymap():
        CityList=[]
        CityNum = []
        for i in range(FriNum):
            if lis[i][4] not in CityList:
                CityList.append(lis[i][4])
                CityNum.append(0)
        for i in range(FriNum):
            for j in range(len(CityList)):
                if lis[i][4] == CityList[j]:
                    CityNum[j] += 1
        for i in range(len(CityList)):
            CityList[i] += ''
        map=Map(width=1000, height=1000)
        map.add("", CityList, CityNum, maptype="广东", is_visualmap=True, visual_text_color='#000')
        map.render('C:\Users\Administrator\Desktop\citymap.html')
    
    def main():
        getmessage()
        savemessage()
        creatcity()
        creatcitymap()
    main()
  • 相关阅读:
    Python正则表达式指南
    Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)
    Python中的urlparse、urllib抓取和解析网页(一)
    __name__ = '__main__'
    odoo context
    Python xlwt模块
    python中使用xlrd、xlwt操作excel
    odoo 下 get_object_reference 函数
    Python运算符
    jQuery实现contains方法不区分大小写的方法教程
  • 原文地址:https://www.cnblogs.com/guangshixiaoshuaiqiang/p/10962010.html
Copyright © 2011-2022 走看看