参考文章:用Python更加了解微信好友

本实验参考网络上的代码,其中遇到很多错误,不过都顺利解决了,这其中的心酸可想而知。写这篇博文的目的也是记载一下这些出错的解决方法,至少在我的环境下解决了。

实验环境:UBUNTU14.04 LTS  + python3.4

有人说,废啥话赶紧上代码。。。好吧,I Tell You

#-*- coding: utf-8 -*-

import re
from wxpy import *
import jieba
import numpy
import pandas as pd

import matplotlib.pyplot as plt
from scipy.misc import imread
from wordcloud import WordCloud,ImageColorGenerator


def login():
	#初始化机器人
	bot = Bot()

	#获取所有好友
	my_friends = bot.friends()
	print(type(my_friends))
	return my_friends

def show_sex_ratio(friends):

	#使用一个字典统计好友男性和女性的数量
	sex_dict = {'male':0, 'female':0}

	for friend in friends:
		if friend.sex == 1:
			sex_dict['male'] += 1
		elif friend.sex == 2:
			sex_dict['female'] += 1
	print(sex_dict)

def show_area_distribution(friends):
	#使用一个字典统计各省好友数量
	province_dict = {u'北京':0, u'上海':0, u'天津':0, u'重庆':0, u'河北':0,
		u'山西':0, u'吉林':0, u'辽宁':0, u'黑龙江':0, u'陕西':0, u'甘肃':0,
		u'青海':0, u'山东':0, u'福建':0, u'浙江':0, u'台湾':0, u'河南':0, 
		u'湖北':0, u'湖南':0, u'江西':0, u'江苏':0, u'安徽':0, u'广东':0, 
		u'海南':0, u'四川':0, u'贵州':0, u'云南':0, u'内蒙古':0, u'新疆':0,
		u'宁夏':0, u'广西':0, u'西藏':0, u'香港':0, u'澳门':0}

	#统计省份
	for friend in friends:
		if friend.province in province_dict.keys():
			province_dict[friend.province] += 1
	#为方便统计数据,生成Json Array格式
	data = []
	for key,value in province_dict.items():
		data.append({'name':key, 'value':value})

	print(data)

def write_txt_file(path, txt):
	'''
	写入文本
	'''
	with open(path, 'a', encoding='utf-8', newline='')as f:
		f.write(txt)

def read_txt_file(path):
	'''
	读取文本
	'''
	with open(path, 'r', encoding='utf-8', newline='') as f:
		return f.read()

def show_signature(friends):
	#统计签名
	for friend in friends:
	#对数据进行清洗,将标点符号等对词频统计造成的因素清除
		pattern = re.compile(r'[一-龥]+') #从一到龥几乎所有汉字都包括
		filterdata = re.findall(pattern, friend.signature)
		write_txt_file('signatures.txt', ''.join(filterdata))
	#读取文件
	content = read_txt_file('signatures.txt')
	segment = jieba.lcut(content)
	words_df = pd.DataFrame({'segment':segment})
	#读取stopwords
	stopwords = pd.read_csv("stopwords.txt", index_col=False, quoting=3,
		 sep=" ", names=['stopword'],encoding='utf-8')
	words_df = words_df[~words_df.segment.isin(stopwords.stopword)]
	print(words_df)

	words_stat = words_df.groupby(by=['segment'])['segment'].agg(
		{"计数":numpy.size})
	words_stat = words_stat.reset_index().sort_values(by=["计数"],
		ascending=False)

	#设置词云属性
	color_mask = imread('wx.jpg')
	wordcloud = WordCloud(font_path="SimHei.ttf", #设置字体可以显示中文
					background_color = "White",   #背景颜色
					max_words = 100,			  #词云显示的最大词数
					mask=color_mask,			  #设置背景图片
					max_font_size=100,			  #字体最大值
					random_state=42,
					width=640,height=640,margin=2,#设置图片默认的大小
					)
	#生成词云,可以用generate输入全部文本
	#也可以计算好词频后使用generate_from_frequencies
	word_frequence = {x[0]:x[1] for x in words_stat.head(100).values}
	print(word_frequence)
	word_frequence_dict = {}
	for key in word_frequence:
		word_frequence_dict[key] = word_frequence[key]
	
	wordcloud.generate_from_frequencies(word_frequence_dict)
	#从背景图片生成颜色值
	image_colors = ImageColorGenerator(color_mask)
	#重新上色
	wordcloud.recolor(color_func=image_colors)
	#保存图片
	wordcloud.to_file('output.png')
	plt.imshow(wordcloud)
	plt.axis("off")
	plt.show()

def main():
	friends = login()
	show_sex_ratio(friends)
	show_area_distribution(friends)
	show_signature(friends)

if __name__ == '__main__':
	main()



代码给你了,然后你就迫不及待复制到电脑上运行看效果。。。。

我拉个去,什么库没找到。刚要生气,转念一想不就是个库没装吗,那就装上呗!

然后一顿操作猛如虎:

sudo pip3 install wxpy requests jieba numpy pandas matplotlib scipy imread wordcloud

好了,按照提示把缺少的库都安装齐全了。运行发现又是什么东西没找到,报了很多错误,仔细看看代码,好像词云属性里面有个ttf什么的,八度/古哥一下看看原理这是个字体文件,恩这个没有的话就应该有错误,因此网络上下载个字体文件到与代码文本相同的目录下。还有那个停止词,就是过滤掉一些频率高得词,这个网络上找到并下载stopwords.txt。再次运行,嘿这次出来个框框,里面没啥内容。什么鬼,绘不出来图。再一次请出八度/古哥两兄弟查查,不知道谁说,matplotlib需要另一个库的支持,缺什么cairocffi。那就安装呗:

sudo pip3 install cairocffi

发现始终安装不了,这又是什么意思。八度/古哥两位大哥别玩了,快把答案告诉俺。。。不知道,好吧!只能慢慢搜结果了。网络上的大神真的很多,别放弃。。。终于找到了大神某年月的一个回答,先装sudo apt-get install libffi-dev,然后它会安装相关的依赖库,再次安装cairocffi就能成功了。再次运行代码,终于看到久违的词云了。哈哈哈......


python 实现微信支付平台的 签名 python个性签名_背景图片


参考文章:用Python更加了解微信好友