最近想学python,因此就在网上找了点关于python有趣的例子来学学,本文的代码很多都是copy,我只是想总结一下 ^-^
以下展示一个用户日志的json格式数据
[{
'UserName': '@8fdbd07d46ecc1f46891684b46281227488b5b7d4459a156ac84b7beda00a603',
'City': '',
'DisplayName': '',
'PYQuanPin': 'Gedeon',
'RemarkPYInitial': '',
'Province': '',
'KeyWord': '',
'RemarkName': '',
'PYInitial': 'GEDEON',
'EncryChatRoomId': '',
'Alias': '',
'Signature': '',
'NickName': 'Gedeon',
'RemarkPYQuanPin': '',
'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=620790952&username=@8fdbd07d46ecc1f46891684b46281227488b5b7d4459a156ac84b7beda00a603&skey=@crypt_ba50f405_373f914b6b682da1b402322602fc8617',
'UniFriend': 0,
'Sex': 1,
'AppAccountFlag': 0,
'VerifyFlag': 0,
'ChatRoomId': 0,
'HideInputBarFlag': 0,
'AttrStatus': 105381,
'SnsFlag': 17,
'MemberCount': 0,
'OwnerUin': 0,
'ContactFlag': 1,
'Uin': 680213541,
'StarFriend': 0,
'Statues': 0,
'MemberList': [],
'WebWxPluginSwitch': 0,
'HeadImgFlag': 1,
'IsOwner': 0
},
本部分主要爬去用户的性别信息,然后分析比例,最后会用饼图的形式进行展示。
def parse_friedns():
# 扫码登录
itchat.login()
text = dict()
# 获取所有的好友信息
friedns = itchat.get_friends(update=True)[0:]
# 打印所有好友信息,即为上面的json格式数据
print(friedns)
male = "male"
female = "female"
other = "other"
# 其中 标志位为1表示为男,标志位为2表示女。还有未知的。。。
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%%" % (float(text[male]) / total * 100) + "\n" +
"女性好友: %.2f%%" % (float(text[female]) / total * 100) + "\n" +
"不明性别好友: %.2f%%" % (float(text[other]) / total * 100))
print(text)
# 调用画图 方法
draw(text)
def draw(datas):
l =[]
for key in datas.keys():
l.append(datas[key])
# 定义饼图的标签
names = ['male','female','unkonw']
# 模拟饼图数值
num = [134, 93, 6]
# 第二块离开圆心0.06
exp =[0,0.06,0]
fig = plt.figure()
plt.pie(l,explode=exp,labels=names,autopct='%1.2f%%')
# 设置标签格式
plt.title('Gedeon\'s sex analyze', bbox={'facecolor': '0.8', 'pad': 5})
plt.show()
男性好友: 56.60%
女性好友: 40.85%
不明性别好友: 2.55%
{'female': 96, 'male': 133, 'other': 6}
地域分析中,我网上查找资料,参考使用了echarts,即程序输出的结果定义为json格式,符合echarts的数据输入格式
def map():
#爬取好友地域分析,并使用地图格式来显示
# 使用一个字典统计各省好友数量
province_dict = {'北京': 0, '上海': 0, '天津': 0, '重庆': 0,
'河北': 0, '山西': 0, '吉林': 0, '辽宁': 0, '黑龙江': 0,
'陕西': 0, '甘肃': 0, '青海': 0, '山东': 0, '福建': 0,
'浙江': 0, '台湾': 0, '河南': 0, '湖北': 0, '湖南': 0,
'江西': 0, '江苏': 0, '安徽': 0, '广东': 0, '海南': 0,
'四川': 0, '贵州': 0, '云南': 0,
'内蒙古': 0, '新疆': 0, '宁夏': 0, '广西': 0, '西藏': 0,
'香港': 0, '澳门': 0}
# 统计省份
bot = Bot()
my_friends = bot.friends()
for friend in my_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)
[{
'name': '北京',
'value': 19
}, {
'name': '上海',
'value': 3
}, {
'name': '天津',
'value': 34
}, {
'name': '重庆',
'value': 3
}, {
'name': '河北',
'value': 2
}, {
'name': '山西',
'value': 1
}, {
'name': '吉林',
'value': 0
}, {
'name': '辽宁',
'value': 1
}, {
'name': '黑龙江',
'value': 0
}, {
'name': '陕西',
'value': 1
}, {
'name': '甘肃',
'value': 1
}, {
'name': '青海',
'value': 2
}, {
'name': '山东',
'value': 2
}, {
'name': '福建',
'value': 2
}, {
'name': '浙江',
'value': 13
}, {
'name': '台湾',
'value': 0
}, {
'name': '河南',
'value': 58
}, {
'name': '湖北',
'value': 1
}]
然后点击echarts 复制上面的结果,替换 页面中左边的var data
中的值
本部分主要通过python爬去用户的个性化签名,然后使用结巴分词对个性化签名进行分词。按照词频会在词云中显示不一样的大小,具体结巴分词的使用可以看这里
# 爬取好友个性签名
def parse_signature():
# 扫码登录
itchat.login()
siglist = []
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('text.txt', 'a', encoding='utf-8') as f:
wordlist = jieba.cut(text, cut_all=True)
word_space_split = " ".join(wordlist)
f.write(word_space_split)
f.close()
#根据爬取的好友个性签名绘制词云
def draw_signature():
text = open(u'text.txt', encoding='utf-8').read()
#词云的背景图,一般背景图的地板要纯白色
coloring = np.array(Image.open('shade.jpg'))
#绘制词云,词云图片的北京为黑色,尺寸等,字体样式为 simhei.ttf
my_wordcloud = WordCloud(background_color="black",
mask=coloring, max_font_size=60, random_state=42, scale=2,
font_path="simhei.ttf").generate(text)
image_colors = ImageColorGenerator(coloring)
# plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
# 存储为图片
plt.savefig("demo.jpg",dpi=200)
plt.show()
爬去好友头像,然后拼接成一张图片
itchat.login()
friends = itchat.get_friends(update=True)[0:]
user = friends[0]["UserName"]
os.mkdir(user)
num = 0
# 通过循环获取好友的头像
for i in friends:
img = itchat.get_head_img(userName=i["UserName"])
fileImage = open(user + "/" + str(num) + ".jpg",'wb')
fileImage.write(img)
fileImage.close()
num += 1
pics = listdir(user)
numPic = len(pics)
print(numPic)
# 通过好友数量来计算每行和每列要展示的图片数量
eachsize = int(math.sqrt(float(640 * 640) / numPic))
print(eachsize)
numline = int(640 / eachsize)
# 创建一个新的图像
toImage = Image.new('RGB', (618, 657))
print(numline)
x = 0
y = 0
for i in pics:
try:
#打开图片
img = Image.open(user + "/" + i)
except IOError:
print("Error: 没有找到文件或读取文件失败")
else:
#缩小图片
img = img.resize((eachsize, eachsize), Image.ANTIALIAS)
#拼接图片
toImage.paste(img, (x * eachsize, y * eachsize))
x += 1
if x == numline:
x = 0
y += 1
toImage.save(user + ".jpg")
首先 去图灵 申请你得专属机器人,然后你在机器人设置找到一个 API key 。 本程序启动后会 对所有收到的信息自动回复,包括群里的消息,所以慎重
#向图灵机器人申请,然后会获得一个 API KEY 请替换为你得
key ="f4f4cafaac86464082acebd30b153b94"
def get_response(msg):
# 构造了要发送给服务器的接口
#使用图灵机器人提供的接口
apiUrl = 'http://www.tuling123.com/openapi/api'
# 一个发动的api的数据
data={
'key' :key,
'info':msg,
'userid':'wechat-robot'
}
try:
# 使用post方法去请求
r=requests.post(apiUrl,data=data).json()
# 字典的get方法在字典没有'text'值的时候会返回None而不会抛出异常
return r.get('text')
# 为了防止服务器没有正常响应导致程序异常退出,这里用try-except捕获了异常
# 如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return
except:
return
# 使用装饰器
@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()