前言

今天看到一篇好玩的文章,可以实现微信的内容爬取和聊天机器人的制作,所以尝试着实现一遍,本文记录了实现过程和一些探索的内容

来源: 痴海 链接:

https://mp.weixin.qq.com/s/oHc5bXKGMOTnb79XD8lKjQ

itchat安装

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



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

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

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

import itchat

itchat.auto_login()

itchat.send('Hello, filehelper', toUserName='filehelper')

自回复消息

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

import itchat

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

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

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



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

itchat.auto_login(hotReload=True)

2.微信聊天机器人制作

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

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

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

3.2 打印数据到文件中

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

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

3.3 安装画图软件

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

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

4. 爬取所有好友数据

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

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(结巴)是一个强大的分词库,完美支持中文分词

Python爬取微信好友的更多相关文章

  1. python 爬取微信好友列表和个性签名,绘制个性签名云图

    python爬取微信好友列表和个性签名,绘制个性签名云图 1. 简要介绍 本次实验主要用到下面几个库 : 1)itchat---用于微信接口,实现生成QR码,用于微信扫描登陆 2)re(正则化)--- ...

  2. 我用 Python 爬取微信好友,最后发现一个大秘密

    前言 你身处的环境是什么样,你就会成为什么样的人.现在人们日常生活基本上离不开微信,但微信不单单是一个即时通讯软件,微信更像是虚拟的现实世界.你所处的朋友圈是怎么样,慢慢你的思想也会变的怎么样.最近在 ...

  3. python itchat 爬取微信好友信息

    原文链接:https://mp.weixin.qq.com/s/4EXgR4GkriTnAzVxluJxmg 「itchat」一个开源的微信个人接口,今天我们就用itchat爬取微信好友信息,无图言虚 ...

  4. Python3 爬取微信好友基本信息,并进行数据清洗

    Python3 爬取微信好友基本信息,并进行数据清洗 1,登录获取好友基础信息: 好友的获取方法为get_friends,将会返回完整的好友列表. 其中每个好友为一个字典 列表的第一项为本人的账号信息 ...

  5. python爬取微信小程序(实战篇)

    python爬取微信小程序(实战篇) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90452656 展开 一.背景介绍 近期有需求需要抓 ...

  6. Python爬取微信小程序(Charles)

    Python爬取微信小程序(Charles) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90045204 一.前言 最近需要获取微信小 ...

  7. python爬取微信公众号

    爬取策略 1.需要安装python selenium模块包,通过selenium中的webdriver驱动浏览器获取Cookie的方法.来达到登录的效果 pip3 install selenium c ...

  8. 使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)

    前言 第一次写博客,主要内容是爬取微信公众号的文章,将文章以PDF格式保存在本地. 爬取微信公众号文章(使用wechatsogou) 1.安装 pip install wechatsogou --up ...

  9. 【Python还能干嘛】爬取微信好友头像完成马赛克拼图(千图成像)~

    马赛克拼图 何谓马赛克拼图(千图成像),简单来说就是将若干小图片平凑成为一张大图,如下图路飞一样,如果放大看你会发现里面都是一些海贼王里面的图片. Our Tragets 爬取所有微信好友的头像

随机推荐

  1. 【刷题】BZOJ 3295 [Cqoi2011]动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  2. 51nod 1785 数据流中的算法 | STL的应用

    51nod 1785 数据流中的算法 题面 动态求平均数.方差.中位数. 题解 这道题的坑: 平均数在答案中是向下取整输出并在后面添加".00" 方差:平方的平均数减去平均数的平方 ...

  3. Treat wchar_t as built-in type不一致导致的链接错误

    今天用VS2013新建了一个工程,生成时出现很多怪异的链接错误,比如: error LNK2019: unresolved external symbol "__declspec(dllim ...

  4. android:onClick="xxx"

    一般监听OnClickListener事件,我们都是通过Button button = (Button)findViewById(....); button.setOClickLisener....这 ...

  5. [USACO18OPEN]Talent Show

    题目描述 Farmer John要带着他的N头奶牛,方便起见编号为1…N,到农业展览会上去,参加每年的达牛秀!他的第iii头奶牛重量为wi,才艺水平为ti​,两者都是整数. 在到达时,Farmer J ...

  6. R读取excel文件

    2017.09.05 我一个下午的成果啊啊啊啊,看看失败 不禁感叹一声,失败的路真是多啊!!!! 一.安装xlsx包 下面具体讲一讲怎么弄的(太笨了,所以学得慢,需要一步一步的来) 用R读取excel ...

  7. Eloquent 条件查询——tucker-eric/eloquentfilter 笔记

    请阅读 https://github.com/Tucker-Eric/EloquentFilter , 里面有很全的文档和注释,以下仅列出关键部分. 1. 安装 composer require tu ...

  8. NATS_04:NATS协议详解

    NATS的协议是一个简单的.基于文本的发布/订阅风格的协议.客户端连接到 gnatsd(NATS服务器),并与 gnatsd 进行通信,通信基于普通的 TCP/IP 套接字,并定义了很小的操作集,换行 ...

  9. MESS-配置

    Author:KillerLegend From:http://www.cnblogs.com/killerlegend/p/3824989.html Date:2014.7.4 Part A 第一部 ...

  10. bzoj千题计划148:bzoj1537: [POI2005]Aut- The Bus

    http://www.lydsy.com/JudgeOnline/problem.php?id=1537 朴素的转移:dp[i][j]=max(dp[i][j-1],dp[i-1][j])+p[i][ ...