分享

微信大揭秘——用Python玩转微信(一)

 道2和 2018-01-20

    有读者叫树根有空就要多更新公众号,树根也在想要不要转型,毕竟最近在自学Python。但是不管怎么样,我都想把自己学到的觉得最有意思的,用自己的方式去呈现给大家看。

    今天想给大家的文文是关于怎么用Python爬一爬自己的微信,本文是这个系列的第一篇。因为Python关于微信的工具库itchat有很多好玩的功能,比如自动回复和查看撤回消息等等,其他功能树根会慢慢摸索,在日后会继续教大家怎么用Python玩转微信。

    树根会以自己的微信作为白老鼠,来展示给大家看。想自己动手试试的读者也可以自己用Python试试。


   ”itchat“是由@LittleCoder开发的,当然Python关于微信的库有很多,只是”itchat“较为简单和方便。接下来的文章内容都是基于这个库。


    接下来,就是树根微信大揭秘时间了


    树根已经默认大家安装好Python了,还没安装的请看上一篇文文《回忆or寄望,制作一份属于自己的云图词》。所有第一步肯定就是工具库的安装。打开cmd命令窗口,或者Anaconda Prompt,依次输入以下命令安装相关的工具库:


pip install itchat
pip install pyecharts


     然后我们在Python中导入所需的工具库:


#微信工具库
import itchat
#画图的库,Bar柱状图,Pie饼图,Map地图

from pyecharts import Pie,Map,Bar
#数据库

import pymysql 


     然后我们可以执行以下代码登录微信以及检验是否登录成功:


itchat.login()#生成二维码,扫描登录微信

itchat.send('树根虽然长得丑,但是很温柔','filehelper') 


    执行代码以后会生成一个二维码,用手机微信扫描以后就可以登录微信了。然后第二行代码是发送“'树根虽然长得丑,但是很温柔'”到文件传输助手,那个“filehelper”就是文件传输助手。

    我们来看看是否成功:

    

    太好了,看到这里就证明是成功了,可以进行接下来的事(什么,说我瞎说什么大实话???)。

    统计微信男女好友比例并可视化

    要统计微信好友的男女比例,首先当然要获取所有微信好友的数据,itchat提供了get_friends这个方法来获取好友的所有信息,我们直接看代码:


#保持登录
itchat.auto_login(hotReload=True)

itchat.dump_login_status()
#获取好友信息

friends = itchat.get_friends(update=True)[:]
#总好友数,减去自己

total = len(friends)-1
#爬取的各个参数

result=[('RemarkName','备注'),('NickName','微信昵称'),

        ('Sex','性别'),('City','城市'),('Province','省份'),

        ('UserName','用户名'),('Signature','个性签名')]

every = []

for user in friends:

    everys = {}

    everys['remarkname'] = user.get('RemarkName')

    everys['city'] = user.get('City')

    everys['nickName'] = user.get('NickName')

    everys['sex'] = user.get('Sex')

    everys['province'] = user.get('Province')

    everys['userName'] = user.get('UserName')

    everys['signature'] = user.get('Signature')

    every.append(everys)

for we in every:

    remarkname = we['remarkname']

    city = we['city']

    nickName = we['nickName']

    sex = we['sex']

    province = we['province']

    userName = we['userName']

    signature = we['signature']

    connection = pymysql.connect(

            host='192.168.31.40',  # 连接的是本地数据库,你自己的IP

            user='acer',        # mysql用户名,自行输入

            passwd='*****',  # 密码,自行输入

            db='*****',      # 数据库的名字

            charset='utf8mb4',     # 默认的编码方式:

            cursorclass=pymysql.cursors.DictCursor)

    

    with connection.cursor() as cursor:

        # 创建更新值的sql语句

        sql = 'INSERT INTO wechat(remarkname,nickName,userName,sex,province,city,signature) VALUES (%s,%s,%s,%s,%s,%s,%s)'

        cursor.execute(sql,(remarkname,nickName,userName,sex,province,city,signature))

        

        # 提交本次插入的记录

        connection.commit()   

    connection.close()

print ('完成')


    我们来看一下是否爬取成功:

    以下是Python变量区的friends变量:


来对比一下树根的微信好友个数:

    

    太好了,看到这里就证明又是成功了。


我们来执行以下代码print一下男女比例结果:


 

male = female = other = 0

for i in friends[1:]:

    sex = i['Sex']

    if sex == 1:

        male += 1

    elif sex == 2:

        female += 1

    else:

        other +=1


#计算朋友总数

total = len(friends[1:])

print('男性好友: %.2f%%' % (float(male)/total*100) + '\n' +

'女性好友: %.2f%%' % (float(female) / total * 100) + '\n' +

'不明性别好友: %.2f%%' % (float(other) / total * 100))


    输出结果为:

    可视化呈现:


pie = Pie('震惊!原来树根的微信好友是这样的')

pie.add(' ',['男' ,'女','外星人'],[(float(male)/total*100),(float(female) / total * 100),(float(other) / total * 100)])

pie.render()

bar = Bar('震惊!原来树根的微信好友是这样的')

bar.add(' ',['男' ,'女','外星人'],[(float(male)/total*100),(float(female) / total * 100),(float(other) / total * 100)])

bar.render()


    

    执行以上代码会在默认文件路径生成名为render的html文件,打开即可得可视化结果:

        

    还可以是柱状图:

    啊,一不小心就暴露了自己女性朋友比较多的事实。。。


    再仔细观察friends列表,发现里面还包含了好友昵称、省份、城市、个人简介等等的数据,刚好可以用来分析好友城市分布,最好的方式是定义一个函数把数据都爬下来,存到数据框里,再进行分析。


    因此我们可以执行以下代码把数据导出到excel:


#定义一个函数,用来爬取各个变量

def get_var(var):

    variable = []

    for i in friends:

        value = i[var]

        variable.append(value)

    return variable


#调用函数得到各变量,并把数据存到csv文件中,保存到桌面

NickName = get_var('NickName')

Sex = get_var('Sex')

Province = get_var('Province')

City = get_var('City')

Signature = get_var('Signature')


from pandas import DataFrame

data = {'NickName': NickName, 'Sex': Sex, 'Province': Province,

        'City': City, 'Signature': Signature}

frame = DataFrame(data)

frame.to_csv('C:/Users/acer/Desktop/data.csv', index=True)


    执行以后发现桌面多了一个csv格式的文件,打开发现里面就是friends中的数据:

   

     导出成功!

统计微信好友来自哪里


    用excel进行对广东的好友进行预处理和统计以后(树根差点也想把MATLAB也用上),导入回Python,执行以下代码:


import pyecharts as p

#这些数据是经过excel处理的

city_name = ['朝阳市', '潮州市', '东莞市', '佛山市', '广州市', '河源市',

       '惠州市', '汕头市', '江门市', '揭阳市','茂名市','梅州市',

      '清远市', '汕头市','汕尾市', '韶关市', '深圳市', '肇庆市',

      '湛江市', '云浮市', '中山市', '珠海市']

num = [2,9,27,24,86,3,7,10,22,30,9,9,5,22,2,1,7,44,13,14,

      5,2]


cc = p.Map('树根的微信好友分布(仅广东)',width=1200,height=600)

cc.add('',city_name,num,maptype='广东',is_visualmap=True,visual_text_color='#000')

cc.render()


    同样我们在默认的路径打开render的html文件,即可得可视化结果:

    发现树根的好友来自广州的最多,有86个,其次就是肇庆的好友,44个,第三就是揭阳和潮州的好友,分别是30和27,由上面的可视化结果也可以大致看出(好友分布人数对应左下角的颜色条)。

微信好友个性签名的自定义词云图


    好玩的来了。之前已经爬下了每个好友的个性签名,刚好可以分析一下大伙儿个性签名时使用的高频词语是什么,用上上一篇文文的代码(回忆or寄望,制作一份属于自己的云图词)顺便可以做个词云图。

    先把原先爬下来的个性签名(Signature)打印出来,发现有很多本来是表情的,变成了emoji、span、class等等这些无关紧要的词,需要先替换掉,另外,还有类似<>/= 之类的符号,也需要写个简单的正则替换掉,再把所有拼起来,得到text字串。

    以下是执行代码:


import re

siglist = []

for i in friends:

    signature = i['Signature'].strip().replace('span','').replace('class','').replace('emoji','')

    rep = re.compile('1f\d+\w*|[<>/=]')

    signature = rep.sub('', signature)

    siglist.append(signature)

text = ''.join(siglist)



    接着就可以把JB,啊不,把结巴分词这个包搞进来分词(搞不懂这个库的名字怎么来的)。



import jieba

wordlist = jieba.cut(text, cut_all=True)

word_space_split = ' '.join(wordlist)


    分词成功以后,终于可以进入画图阶段了。可以根据自己想要的图片、形状、颜色画出相似的图形。树根这次执行的云图词代码比上一篇的入门要高大上一点,我们需要把matplotlib、wordcloud、numpy、PIL等包搞进来:


import matplotlib.pyplot as plt

from wordcloud import WordCloud, ImageColorGenerator

import numpy as np

import PIL.Image as Image

coloring = np.array(Image.open('C:/Users/acer/Desktop/timg.jpg'))

my_wordcloud = WordCloud(background_color='white', max_words=2000,

                         mask=coloring, max_font_size=40, random_state=42, scale=2,

                         font_path='C:/Users/acer/Desktop/msyh.ttc').generate(word_space_split)


image_colors = ImageColorGenerator(coloring)

plt.imshow(my_wordcloud.recolor(color_func=image_colors))

plt.imshow(my_wordcloud)

plt.axis('off')

plt.show()


    我们来看看结果是怎么样的:

    能猜到是什么动物吗?没错就是皮卡丘!(什么你居然说看不出???)

以下是原图:


    看来,在我的微信好友的个人签名里,有人善于聆听,有人强调善良,有人重视灵魂,有人凝视人生。一直在等待,不放弃寻找。历尽曲折,不畏虚伪。真心如一,不能辜负。一步一生多努力,一起一切one more dream(树根真编不下去了,其实树根的好友签名无非就是我不能没有你你不能失去我哈哈哈哈)。

    

最后

    以上是不是很有趣呢?是不是又打开了一扇新世界的大门呢?

    我微信好友也不是太多,如果微信好友有几千个,可以得到几千条数据,分析一下还是很有价值的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多