博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python爬取微信好友
阅读量:2069 次
发布时间:2019-04-29

本文共 5099 字,大约阅读时间需要 16 分钟。

itchat安装

对微信的控制可以使用itchat来实现,我们找到itchart的官网下查看相关帮助: 

 
我这里使用的是Python2.7,所以直接按照说明pip 安装itchat即可 

1.实现给文件助手发消息

安装itchat后,使用如下的代码,即可给文件助手发一条消息,登陆时同样使用扫码登陆

import itchatitchat.auto_login()itchat.send('Hello, filehelper', toUserName='filehelper')

自回复消息

按照帮助说明,使用如下的示例代码可以实现消息的自动回复

import itchat@itchat.msg_register(itchat.content.TEXT)def text_reply(msg):    return msg.textitchat.auto_login()itchat.run()

用老婆大人的号测试了一下,可以实现信息的发送和直接回复

需要注意的是,使用同一个微信给自己发消息不起作用

 

这里为了方便多次运行,可以设置hotReload=True 变量,从而记录登陆的账号

itchat.auto_login(hotReload=True)

2.微信聊天机器人制作

官网教程还有微信机器人,所以照着教程做了一遍。试用后,发现图灵机器人的智商捉鸡,而且比较凶悍

# -*- coding: utf-8 -*-#想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载!import requestsimport itchatKEY = '71f28bf79c820df10d39b4074345ef8c'def get_response(msg):    # 这里我们就像在“3. 实现最简单的与图灵机器人的交互”中做的一样    # 构造了要发送给服务器的数据    apiUrl = 'http://www.tuling123.com/openapi/api'    data = {        'key'    : KEY,        'info'   : msg,        'userid' : 'wechat-robot',    }    try:        r = requests.post(apiUrl, data=data).json()        # 字典的get方法在字典没有'text'值的时候会返回None而不会抛出异常        return r.get('text')    # 为了防止服务器没有正常响应导致程序异常退出,这里用try-except捕获了异常    # 如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return    except:        # 将会返回一个None        return# 这里是我们在“1. 实现微信消息的获取”中已经用到过的同样的注册方法@itchat.msg_register(itchat.content.TEXT)def tuling_reply(msg):    # 为了保证在图灵Key出现问题的时候仍旧可以回复,这里设置一个默认回复    defaultReply = 'I received: ' + msg['Text']    # 如果图灵Key出现问题,那么reply将会是None    reply = get_response(msg['Text'])    # a or b的意思是,如果a有内容,那么返回a,否则返回b    # 有内容一般就是指非空或者非None,你可以用`if a: print('True')`来测试    return reply or defaultReply# 为了让实验过程更加方便(修改程序不用多次扫码),我们使用热启动itchat.auto_login(hotReload=True)itchat.run()

下面是我的实际测试截图 

3.爬取一个好友

机器人是官网的教程,微信文章中使用的是对好友数据分布的统计,所以我先尝试实现爬取一个好友的功能

3.1 获取一个好友信息

# -*- coding: utf-8 -*-import itchatitchat.auto_login(hotReload=True)#爬取自己好友相关信息, 返回一个json文件friends = itchat.search_friends(name='Elton')print friends

可以看到拿到的数据是一个List 

3.2 打印数据到文件中

通过open函数,可以将获取到的数据写入到txt中去

# -*- coding: utf-8 -*-import itchatitchat.auto_login(hotReload=True)#爬取自己好友相关信息, 返回一个json文件friends = itchat.search_friends(name='Elton')f = open("out.txt", "w")print >> f, friendsf.close()

3.3 安装画图软件

为了把统计出来的柱状图绘制出来,安装matplotlib的库 

至此,基本上准备条件已经完成

4. 爬取所有好友数据

爬取好友的功能如下,通过将爬取的数据存储到字典中,对性别做统计处理,可以获取总人数和性别分类的数量

'''想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载!'''def parse_friedns():    text = dict()    friedns = itchat.get_friends(update=True)[0:]    #(friedns)    male = "male"    female = "female"    other = "other"    for i in friedns[1:]:        sex = i['Sex']        if sex == 1:            text[male] = text.get(male, 0) + 1        elif sex == 2:            text[female] = text.get(female, 0) + 1        else:            text[other] = text.get(other, 0) + 1    total = len(friedns[1:])    print('好友数量:%.2f'%total)    print("男性好友: %.2f%%" % (float(text[male]) / total * 100) + "\n" +          "女性好友: %.2f%%" % (float(text[female]) / total * 100) + "\n" +          "不明性别好友: %.2f%%" % (float(text[other]) / total * 100))    draw_plot(text,u'朋友圈男女比例_')

使用了plt函数来绘制曲线

# 绘制柱状图def draw_plot(datas,tag=''):    for key in datas.keys():        plt.bar(key, datas[key])    plt.legend()    plt.xlabel('sex')    plt.ylabel('rate')    plt.title("Gender of Alfred's friends")    if tag=='':        plt.savefig(OUTPUT+USER_NAME+'_'+u'柱状图.png')        else:        plt.savefig(OUTPUT+USER_NAME+'_'+tag+u'柱状图.png')

运行程序,爬取所有的好友数据,发现我好友一共515位,其中男性的好友占据了73%,男女比例差异有点大.... 

好友个性签名词云

通过使用get_friends可以爬取微信的好朋友数据,存储在'signature.txt'文件中

def parse_signature():    siglist = []    SIGNATURE_PATH='signature.txt'    friedns = itchat.get_friends(update=True)[1:]    for i in friedns:        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)    with io.open(SIGNATURE_PATH, 'w', encoding='utf-8') as f:        wordlist = jieba.cut(text, cut_all=True)        word_space_split = " ".join(wordlist)        f.write(word_space_split)        f.close()    draw_wordcloud(SIGNATURE_PATH,tag=u'朋友圈签名')

通过对文件的解析,可以将词云绘制出来

#绘制词云def draw_wordcloud(path,tag=''):    f = open(path,'r').read()    cut_text="".join(jieba.cut(f))    coloring = np.array(Image.open('.\\Pic\\wechat.jpg'))    wordcloud = WordCloud(font_path='./font/simhei.ttf',background_color="white",max_words=2000,mask=coloring, scale=2).generate(cut_text)    image_colors = ImageColorGenerator(coloring)    #plt.imshow(wordcloud.recolor(color_func=image_colors))    plt.imshow(wordcloud)    plt.axis("off")    if tag=='':        wordcloud.to_file(OUTPUT+USER_NAME+'_'+u'词云.png')       else:        wordcloud.to_file(OUTPUT+USER_NAME+'_'+tag+u'词云.png')

下图是解析出来的词云,可以看到朋友圈的人大部分还是以自己努力生活为目标~ 

同理,我也爬取了一下朋友圈的城市分布,发现大部分的人都在北京,还有上过学的哈尔滨,南京的同事~ 

结论

微信还有很多很好玩的信息可以提取,等下一篇有时间可以继续优化这段代码,github地址如下:

https://github.com/ablo120/PythonLearn.git

附录

import itchat

导入爬取微信记录的包

import re

导入python中的正则表达式(re模块)

import io

导入文件读取的包

import matplotlib.pyplot as plt

导入柱状图绘制的包

import jieba

jieba(结巴)是一个强大的分词库,完美支持中文分词

 

转载地址:http://rinmf.baihongyu.com/

你可能感兴趣的文章
前端程序员必知的30个Chrome扩展
查看>>
memcached分布式实现原理
查看>>
怎么成为架构师
查看>>
40个重要的HTML 5面试问题及答案
查看>>
在Java中如何高效判断数组中是否包含某个元素
查看>>
设计模式总结
查看>>
什么时候可以使用Ehcache缓存
查看>>
Java核心知识点-JVM结构和工作方式
查看>>
Java编程中“为了性能”一些尽量做到的地方
查看>>
Java并发编程:线程池的使用
查看>>
redis单机及其集群的搭建
查看>>
Java多线程学习
查看>>
检查Linux服务器性能
查看>>
Java 8新的时间日期库
查看>>
Chrome开发者工具
查看>>
Java工程师成神之路
查看>>
如何在 Linux 上自动设置 JAVA_HOME 环境变量
查看>>
MSSQL复习笔记
查看>>
Spring基础知识汇总
查看>>
Chrome扩展插件
查看>>