当前位置: 首页 > 后端技术 > Python

用Python爬取微信好友,原来是这样的人...

时间:2023-03-26 17:36:12 Python

随着微信的普及,越来越多的人开始使用微信。微信已经从一个简单的社交软件逐渐变成了一种生活方式。人们日常交流需要微信,工作交流也需要微信。微信上的每一个好友都代表着人们在社会中扮演的不同角色。今天的文章将基于Python分析微信好友的数据。这里选择的维度主要包括:性别、头像、签名、所在地。结果主要以两种形式呈现:图表和词云。其中,文本信息会用到词频分析和情感分析两种方法。俗话说:工欲善其事,必先利其器。在本文正式开始之前,先简单介绍一下本文使用的第三方模块:itchat:微信网页版接口封装了Python版本,用于本文获取微信好友信息。jieba:结巴分词的Python版,本文使用它来处理文本信息的分词。matplotlib:Python中的图表绘制模块,本文用于绘制柱状图和饼图。snownlp:Python中的一个中文分词模块,在本文中用于对文本信息进行情感判断。PIL:Python中的一个图像处理模块,本文用来处理图像。numpy:Python中的一个数值计算模块,与本文的wordcloud模块配合使用。wordcloud:Python中的词云模块,本文用来绘制词云图。TencentYoutuyun:腾讯优图提供的Python版SDK,本文用于人脸识别和图像标签信息提取。以上模块可以通过pip安装。各个模块的详细使用说明请参考各自的文档。如果你也想学好Python,我最近整理了一套编程学习资料分享给大家。都是干货,包括教程视频、电子书、源码笔记、学习路线图、实战项目、面试题等,关注gzh【Python编程学习圈】即可免费获取,回复即可关键词【学习资料】,抓紧时间!01数据分析分析微信好友数据的前提是获取好友信息。通过使用itchat模块,这一切都会变得非常简单。我们可以通过下面两行代码来实现:itchat.auto_login(hotReload=True)friends=itchat.get_friends(update=True)和登录网页版微信一样。我们可以用手机扫描二维码登录。这里返回的friends对象是一个集合,第一个元素是当前用户。因此,在下面的数据分析过程中,我们始终以friends[1:]作为原始输入数据,集合中的每个元素都是一个字典结构。以我为例,大家可以注意到有Sex,City,Province,HeadImgUrl,Signature这四个字段。我们接下来的分析将从这四个字段入手:02好友性别要分析好友性别,我们首先需要获取所有好友的性别信息。这里我们将每个好友信息的Sex字段提取出来,然后分别统计Male、Female和Unkonw的数量。我们将这三个值组装成一个列表,然后使用matplotlib模块绘制饼图。代码实现如下:defanalyzeSex(firends):sexs=list(map(lambdax:x['Sex'],friends[1:]))counts=list(map(lambdax:x[1],Counter(sexs).items()))labels=['Unknow','Male','Female']colors=['red','yellowgreen','lightskyblue']plt.figure(figsize=(8,5),dpi=80)plt.axes(aspect=1)plt.pie(counts,#性别统计结果labels=labels,#性别显示标签colors=colors,#饼图区域配色labeldistance=1.1,#标签距离dotdistanceautopct='%3.1f%%',#饼图区域文字格式shadow=False,#饼图是否显示阴影startangle=90,#饼图起始角度pctdistance=0.6#饼图区域文字距离点)plt.legend(loc='右上',)plt.title(gendercompositionofu'%s'WeChatfriends'%friends[0]['NickName'])plt.show()这里简单解释一下这段代码,微信中的gender字段有3个值:Unkonw,Male和雌性物种,它们对应的值分别为0、1、2。通过Collection模块中的Counter()对这三个不同的值进行统计,其items()方法返回一组元组。元组的第一维元素表示key,即0,1,2,元组的第二维元素表示数,对元组的集合进行排序,即key按照顺序的0,1,2是按顺序排列的,所以这三个不同值的个数可以通过map()方法得到,我们可以传给matplotlib进行绘图。这三个不同值的百分比是通过matplotlib计算出来的。下图是matplotlib绘制的好友性别分布图:03好友头像分析从两个方面分析好友头像。第一,在这些朋友头像中,使用人脸头像的朋友比例是多少;第二,从这些好友头像中,可以从好友头像中提取出哪些有价值的关键词。这里需要根据HeadImgUrl字段将头像下载到本地,然后使用腾讯优图提供的人脸识别相关API接口检测头像图片中是否有人脸,提取图片中的标签。其中,前者是分类汇总,我们用饼图来呈现结果;后者是对文本进行分析,我们用词云来呈现结果。关键代码如下所示:defanalyseHeadImage(frineds):#InitPathbasePath=os.path.abspath('.')baseFolder=basePath+'\HeadImages\'if(os.path.exists(baseFolder)==False):os.makedirs(baseFolder)#分析图像faceApi=FaceAPI()use_face=0not_use_face=0image_tags=''forindexinrange(1,len(friends)):friend=friends[index]#保存头像imgFile=baseFolder+'\Image%s.jpg'%str(index)imgData=itchat.get_head_img(userName=friend['UserName'])if(os.path.exists(imgFile)==False):withopen(imgFile,'wb')asfile:file.write(imgData)#检测人脸time.sleep(1)result=faceApi.detectFace(imgFile)ifresult==True:use_face+=1else:not_use_face+=1#提取标签result=faceApi.extractTags(imgFile)image_tags+=','.join(list(map(lambdax:x['tag_name'],result)))labels=[u'使用人脸头像',u'不使用人脸头像']counts=[use_face,not_use_face]colors=['red','yellowgreen','lightskyblue']plt.figure(figsize=(8,5),dpi=80)plt.axes(aspect=1)plt.pie(counts,#性别统计结果labels=labels,#性别显示标签colors=colors,#饼图区域colormatchinglabeldistance=1.1,#label与圆点的距离autopct='%3.1f%%',#饼图区域的文字格式shadow=False,#饼图是否显示阴影startangle=90,#饼图起始角度pctdistance=0.6#饼图区域文字与圆点的距离)plt.legend(loc='右上',)plt.title(u'%s微信好友用脸avatars'%friends[0]['NickName'])plt.show()image_tags=image_tags.encode('iso8859-1').decode('utf-8')back_coloring=np.array(Image.open('face.jpg'))wordcloud=WordCloud(font_path='simfang.ttf',background_color="white",max_words=1200,mask=back_coloring,max_font_size=75,random_state=45,width=800,height=480,margin=15)字云。生成(图像标签)plt.imshow(wordcloud)plt.axis("off")plt.show()这里我们在当前目录下新建一个HeadImages目录,用来存放所有好友的头像,然后我们将使用了一个名为FaceApi的类,该类由腾讯优图SDK封装,这里分别调用了人脸检测和图片标签识别两个API接口,前者会统计“使用人脸头像”和“不使用人脸”Avatar”的朋友,后者会累积从每个头像中提取的标签r分析结果如下图所示:可以注意到,在所有微信好友中,约有1/4的微信好友使用人脸头像,近3/4的微信好友没有人脸头像,可见其中所有微信好友,对自己“颜值”有自信的人只占好友总数的25%,或者说75%的微信好友行事风格低调,不喜欢把人脸当微信个人资料图片。其次,考虑到腾讯优图无法真正识别“人脸”,我们再次提取好友头像中的标签,帮助我们了解微信好友头像中有哪些关键词。分析结果如图:通过词云我们可以发现,在微信好友的签名词云中,出现频率相对较高的关键词包括:女孩、树、房子、文字、截图、卡通、合影,天空,大海。由此可见,在我的微信好友中,好友选择的微信头像主要来自四个来源:日常生活、旅行、风景、截图。朋友选择的微信头像风格以卡通为主,朋友选择的微信头像中常见的元素有天空、大海、房屋、树木。通过观察我所有好友的头像,我发现我的微信好友中,有15人使用个人照片作为微信头像,53人使用网络图片作为微信头像,25人使用动漫图片作为微信头像,25人使用集体照。用图片做微信头像的有3人,用小孩照片做微信头像的有5人,用风景图片做微信头像的有13人,用女生照片做微信头像的有18人,基本一致与图像标签提取的分析结果。.04好友签名好友签名分析。签名是好友信息中最丰富的文字信息。按照人类使用的“标签”方法论,签名可以分析出某个人在某个时间段内的状态,就像人开心了就笑,伤心了就会哭,哭这两个标签和笑分别表示高兴和悲伤的状态。这里我们对签名做了两种处理。第一个是使用结巴分词生成词云。使用SnowNLP分析朋友签名中的情绪倾向,即朋友签名总体上是正面的、负面的还是中性的,各自所占的比例是多少。这里提取签名段即可,其核心代码如下:defanalyseSignature(friends):signatures=''emotions=[]pattern=re.compile("1f\d.+")对于朋友中的朋友:签名=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(signature)emotions.append(nlp.sentiments)signatures+=''.join(jieba.analyse.extract_tags(signature,5))withopen('signatures.txt','wt',encoding='utf-8')asfile:file.write(signatures)#SinatureWordCloudback_coloring=np.array(Image.open('花.jpg'))wordcloud=WordCloud(font_path='simfang.ttf',background_color="white",max_words=1200,mask=back_coloring,max_font_size=75,random_state=45,width=960,height=720,margin=15)wordcloud.generate(signatures)plt.imshow(wordcloud)plt.axis("关闭")plt.show()wordcloud.to_file('signatures.jpg')#签名情感判断count_good=len(list(filter(lambdax:x>0.66,emotions)))count_normal=len(list(filter(lambdax:x>=0.33andx<=0.66,emotions)))count_bad=len(list(filter(lambdax:x<0.33,emotions)))labels=[u'负面消极',u'中性',u'正面积极']values=(count_bad,count_normal,count_good)plt.rcParams['font.sans-serif']=['simHei']plt.rcParams['axes.unicode_minus']=Falseplt.xlabel(u'情判断断')plt.ylabel(u'视频数')plt.xticks(range(3),labels)plt.legend(loc='右上角',)plt.bar(range(3),values,color='rgb')plt.title(u'%s微信好友签名信息情感分析'%friends[0]['NickName'])plt.show()通过词云我们可以发现:在微信好友的签名信息中,出现频率比较高的关键词有:努力、成长、美丽、快乐、生活、幸福、生活、距离、时间、行走通过下面的柱状图,我们可以发现:在好友中签名信息中,正面和正面情绪判断占比约55.56%,中性情绪判断占比约32.10%,负面情绪判断占比约12.35%。这个结果和我们通过词云展示的结果基本一致,这表明微信好友的签名信息中,约有87.66%的人传达了积极的态度。05好友位置分析好友所在位置,主要是提取Province和City这两个字段。Python中的地图可视化主要是通过Basemap模块。该模块需要从国外网站下载地图信息,使用起来很不方便。百度的ECharts用在前端比较多。虽然社区提供了pyecharts项目,但是我注意到由于政策变化,Echarts不再支持导出图的功能。因此,地图定制仍然是一个问题。主流的技术方案是配置全国所有省市的JSON数据。这里我使用的是BDP个人版,这是一个零编程的解决方案。我们通过Python导出一个CSV文件,然后上传到BDP。您可以通过简单的拖放来创建可视化地图。它再简单不过了。这里我们只展示生成CSV部分的代码:defanalyzeLocation(friends):headers=['NickName','Province','City']withopen('location.csv','w',encoding='utf-8',newline='',)作为csvFile:writer=csv.DictWriter(csvFile,headers)writer.writeheader()forfriendinfriends[1:]:row={}row['NickName']=friend['NickName']row['Province']=friend['Province']row['City']=friend['City']writer.writerow(row)下图是BDP中生成的微信好友的地域分布,可以发现:我的微信好友主要集中在宁夏和陕西两省。06小结本文是对数据分析的又一次尝试。我从性别、头像、签名、位置四个维度对微信好友进行了简单的数据分析,主要是图表和词云的形式。展示结果。一句话,“数据可视化是手段而非目的”。重要的不是我们在这里拍了这些图,而是这些图所反映的现象。我们能得到什么本质的启示?希望这篇文章能够对大家有所启发。