24

手把手教你对微信好友数据进行爬取分析,挖掘隐藏价值!附完整代码

 4 years ago
source link: https://www.tuicool.com/articles/bMb6z2m
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

VbI3aum.jpg!web

随着现代⼈的“⼿机依赖症”越来越深⼊⾻髓,微信⼀定是⼤家每天离不开的⼀款app。通讯,社交,⽀付……

⽽我们的python⼀如既往地强⼤。这篇⽂章就会⼿把⼿地拆解如何利⽤python来爬取微信好友的数据并对它们进⾏分析。

ba6jiu7.jpg!web

本⽂中使⽤到 的python第三⽅模块主要有:

·itchat 获取微信好友数据 

·pyecharts 绘图

·snownlp⽂本情感分析

·jieba 分词

·wordcloud 绘制词云

·百度 ⼈脸 api ⼈脸识别

话不多说,立刻开干!

获取数据

俗话说得好,巧妇难为⽆⽶之炊。因此⾸先我们需要爬取到微信好友的数据,这⾥使⽤到的是 itchat 模块。

itchat 是⼀个开源的微信个⼈号接⼝。安装 itchat ⼗分简单,⽼样⼦,在终端使⽤以下命令即可。

pip install itchat

⽹页爬⾍可能会写长长的代码,然⽽使⽤以下三⾏代码,即可爬取到微信好友数据,so easy。

import itchat
itchat.auto_login(hotReload=True)
friends =itchat.get_friends(update=True)

通过 itchat.get_friends ⽅法返回来完整的好友列表,其中每个好友为⼀个字典。先来看看它返 回的数据:

auI3Ijm.jpg!web

这样的数据形式实在是有点辣眼睛,我们再使⽤⼤名⿍⿍的 pandas 将所需要好友信息转化为数据 框的格式存储起来。

长舒⼀⼝⽓,瞬间顺眼了很多。

22e2qyA.jpg!web

好友地理位置分析

拿到数据后,我们对微信好友的地理位置进⾏分析。

为了更直观地展⽰数据,我们进⾏了如下的可视化。这⾥我使⽤的是 pyecharts 模块。 

pyecharts 的功能强⼤,⽽且作出的图⼗分美观,实在是可视化必备之良品。

from pyecharts import Map
provinces_count =data.groupby('province',as_index=True)['province'].coun t().sort_values()
attr=list(map(lambda x: x if x !=''else '未知',list(provinces_count.i ndex)))#未填写地址的改为未知
value = list(provinces_count)map_1=Map("微信好友位置分布图",title_pos="center",width=1000,height=500)
map_1.add('',attr,value,is_label_show=True,is_visualmap=True,visual_t ext_color='#000',visual_range=[0,120])
map_1.render(path='your own path/微信好友分布.html')

颜⾊越趋近于红⾊的地⽅说明好友越多。

可以看到我的好友主要集中在四川,北京,⼴东这三个省 份。

这正是⼩编出⽣,上学,⼯作的⼏个省份,完全契合了我的⽣活轨迹。

3uUBbqB.jpg!web

再来统计⼀下我的微信好友主要都分布在哪些城市。

from pyecharts import Bar
from collections import Counter
city_5=Counter(city).most_common(5)
bar=Bar('好友所在城市TOP5','',title_pos='center',width=800, height=500)attr,value=bar.cast(city_5)
bar.add('',attr,value,is_visualmap=True,visual_text_color='#fff',is_m ore_utils=True,is_label_show=True)
bar

jquaEf3.jpg!web

emmmm…… 排在第⼀位的是空⽩,也就是说有很多好友并没有标明⾃⼰所在的城市。

当然也许每个⼈的微信⾥都有⼏个位于“安道尔”,“阿布扎⽐”的好友,毕竟城市是⽤户随便填的⽽不是微信定位来的。

排在后⾯的分别为成都,朝阳,海淀,深圳。与上⾯的地图也可以对得上号。

但是微信为何将朝阳和海淀定义为城市⽽不是地区。我不由得陷⼊沉思。

好友性别分析

对好友的性别进⾏分析,来看看我的微信好友男⼥⽐例为多少。同样地这⾥使⽤到了 pyecharts 中的饼图。

from pyecharts import Pie
sexs=list(map(lambda x:x['Sex'],friends[1:])) #提取好友性别
value =[sexs.count(1),sexs.count(2),sexs.count(0)]#对性别进⾏计数
sex_attr=['male','female','unknown']
pie=Pie('好友性别⽐例','好友总⼈数:%d'% len(sex),title_pos='center')
pie.add('',sex_attr,value,radius=[30,75],rosetype='area',is_label_show=True,is_legend_show=True,legend_top='bottom')
pie

如下图所⽰,⼩编的男性好友为51.68%,⼥性好友43.17%,还有少部分没有填写性别的,基本上 算是⼀半⼀半,可以说是⼗分均衡了。

ZzIFnuf.jpg!web

好友签名分析

好友签名是我们获取到的数据中最为丰富的⽂本信息。

毕竟,我们⼤部分⼈都会通过签名来装个⽂艺,提升⼀下逼格,⽐如“缟仙扶醉跨残虹” 

或者来个搞笑的,⽐如说“⼤家好,我是性感的贝贝”。

当然也少不了秀恩爱的,⽐如“爱你,只在你在⾝边都是幸福”

对好友签名进⾏分析,这⾥主要使⽤了 jieba , snownlp , wordcloud 等python包。 

⾸先,对签名⽂本进⾏清洗,因为签名⽂本中含有emoji表情以及其他⼀些不能识别的字符,因此先 去掉emoji,span等字符。

然后,使⽤ jieba 对个性签名进⾏分词,使⽤ snownlp 进⾏词性的情感 分析。

signatures='' 
emotions=[]
for friend in friends:
   signature=friend['Signature']
   if signature != None:
     signature=signature.strip().replace("span","").replace("class", "").replace("emoji","")#去除⽆关数据
     signature=re.sub(r'1f(\d.+)',"",signature)

   if len(signature)>0:
     nlp=snownlp.SnowNLP(signature)
     emotions.append(nlp.sentiments)
     signatures +="".join(jieba.analyse.extract_tags(signature,5))# 关键字提取

然后开始绘制词云

back_coloring=np.array(Image.open("1.jpg"))#图⽚可替换你⾃⼰的图⽚
word_cloud2=WordCloud(font_path ='zt.ttf',background_color ='white',max_words=1200,mask=back_coloring,margin=15)
word_cloud2.generate(signatures)
image_colors=ImageColorGenerator(back_coloring)
plt.figure(figsize=(6,5),dpi=160)
plt.imshow(word_cloud2.recolor(color_func=image_colors))
plt.axis("off")
plt.show()
word_cloud2.to_file("signatures.jpg")

可以看到,词云中⽐较明显的包括“努⼒”,“⼈⽣”,“幸福”等等。

正可谓是物以类聚⼈以群分,正能量的我也拥有正能量的朋友(⼤误)。

BjqAziy.jpg!web

再来看看 snownlp 分析好友签名中的情感倾向。代码如下:

count_positive=len(list(filter(lambda x:x>0.66,emotions)))#⼤于0.66为积极
count_negative=len(list(filter(lambda x:x<0.33,emotions)))#⼩于0.33为消极
count_neutral=len(list(filter(lambda x:x>=0.33 and x<=0.66,emotions)))
value=[count_positive,count_negative,count_neutral]
att_attr=['积极','消极','中性']
bar=Bar('个性签名情感分析',title_pos='center',width=800,height=500)
bar.add('',att_attr,value,visual_range=[0,200],is_visualmap=True,is_ label_show=True)
bar

其中积极和中性的占据了⼤部分,消极的只占据了⼀部分,这个分析结果跟词云给我们的印象也是 吻合的。

7feuyua.jpg!web

好友头像分析

itchat 返回的数据中包括好友头像的url,我们可以通过url将好友头像下载下来,再进⾏分析。

使⽤如下代码可以下载所有的好友头像保存到本地。

basePath=os.path.abspath('.')
baseFolder=basePath+'\\HeadImages\\' 
if(os.path.exists(baseFolder)== False):
 os.makedirs(baseFolder)
image_tags = ''
for index in range(1,2):
 friend = friends[index]
 imgFile = baseFolder + '\\Image%s.jpg' % str(index)
 imgData = itchat.get_head_img(userName =
 friend['UserName'])
 if(os.path.exists(imgFile) == False):
 with open(imgFile,'wb') as file:
 file.write(imgData)

下载完所有的好友头像后,我们就能够对头像图⽚进⾏分析了。 

由于这种图像分析涉及到了⼈脸识别等内容。为了⽅便起见,我们这⾥直接使⽤造好的轮⼦——百度⼈脸识别。

⾸先需要安装百度⼈脸识别sdk,直接输⼊以下命令即可:

pip install baidu-aip

然后,需要在百度应⽤⾥申请开发者账号并创建应⽤,拿到APP_ID, API_KEY以及SECRET_KEY。

接下来就可以在python中调别百度⼈脸识别的服务了。

为了隐私起见,⼩编在这⾥就不⽤微信好友头像来做演⽰了,⽽是使⽤⼀张明星合影来展⽰,原图如下:

Z3IRnqN.jpg!web

百度⼈脸识别服务可以识别出图中的⼈脸,并返回相应的⼈脸信息。代码如下:

from aip import AipFace
import base64
APP_ID ="your app_id" 
API_KEY ="your api_key" 
SECRET_KEY="your secret_key" 
client =AipFace(APP_ID,API_KEY,SECRET_KEY)#初始化aipface对象
filepath="your own filepath" 
with open(filepath,"rb") as fp:
   base64_data=base64.b64encode(fp.read())
image=str(base64_data,'utf-8')
imageType="BASE64" options={}
options["face_field"]="age,gender,beauty,expression" 
options["max_face_num"] =10 
options["face_type"]="LIVE" 
result =client.detect(image,imageType,options)

通过以上代码,我们就能够识别出图⽚中的⼈脸位置,还可以根据 option 选项,可以选择识别返 回⼈脸的年龄,性别,颜值,表情,⼈种等⽅⾯的信息。

我们先来根据返回的⼈脸位置信息,⽤opencv模块作图标识出⼈脸位置:

uY7vuyr.jpg!web

返回的信息中,即 result 中的信息,⼩编选取了年龄,性别,颜值,和表情这四个维度。

其中, 年龄和颜值都是确定的值,表情和性别均为⼀个值以及对应的概率。

nYzIryu.jpg!web

虽然粉丝经常为idol们的颜值⾼低battle到天荒地⽼,也有⼈说“各花⼊各眼”,不过可以看到,在五位⼥明星中,百度⼈脸识别对李冰冰的颜值作出了最⾼评分。

另外expression的判定上,所有⼈的表情均为none,并且概率都为1,果然是时尚杂志都偏爱⾯⽆表情的⾼冷范⼉么。

VZVJzym.jpg!web

最后

⽤python对微信好友进⾏数据分析就告⼀段落。

事实上 itchat 有趣的应⽤还不只这⼀些,还可以利⽤它做聊天机器⼈,⽂件的定时发送等等。

同样的,⽂中所使⽤的其他包都有强⼤应⽤。希望这篇⽂章能给⼤家⼀些⼩⼩的启发,⽐芯〜:heartpulse:

资源下载

最后,以上所有的代码我们已经为大家打包完毕! 需要的可以按照以下方式获取

1.扫描下方二维码关注   " Datawhale " 公众号

2.公众号后台回复关键词: 微信

a2AjU3y.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK