Python爬虫实现“盗取”微信好友信息的方法分析
作者:Jonny工作室 发布时间:2023-01-16 09:37:33
标签:Python,爬虫,微信好友信息
本文实例讲述了Python爬虫实现“盗取”微信好友信息的方法。分享给大家供大家参考,具体如下:
刚起床,闲来无聊,找点事做,看了朋友圈一篇爬取微信好友信息的文章,突发奇想,偷偷看看女朋友微信有些啥。。。。于是就下手了。。。。[阴险]
1、准备工作:
运行平台:Windows
Python版本:Python3.6
IDE:Sublime Text
Python库:wxpy,
2、开发流程:(电脑没电了,要撑不住了啦~之后具体分析)
3、直接上代码:
# 微信好友信息爬取+数据可视化
# encoding=utf-8
__author__ = 'Jonny'
__location__ = '济南'
__date__ = '2018-06-02'
from wxpy import *
import re
import jieba
import numpy
import pandas as pd
import matplotlib.pyplot as plt
from scipy.misc import imread
from wordcloud import WordCloud,ImageColorGenerator
from matplotlib.patches import Polygon
from matplotlib.colors import rgb2hex
from mpl_toolkits.basemap import B
# 微信登录
def wx_login():
try:
#初始化机器人,扫码登录
bot = Bot()
#获取好友列表
frinds = bot.friends()
#wxpy.api.chats.chats.Chats对象是多个聊天对象的合集,
# 可用于搜索或统计,可以搜索和统计的信息包括sex(性别)、province(省份)、city(城市)和signature(个性签名)等
print(type(frinds))
#输出好友列表
for i in frinds:
print(i)
except Exception as e:
print(e.args)
wx_login()
return frinds
# 数据可视化
#统计男女性别信息
def wx_friend_sex_infor(friends):
sex_dict = {'male':0,'female':0,'other':0}
for friend in friends:
if friend.sex == 1:
sex_dict['male'] += 1
elif friend.sex == 2:
sex_dict['female'] += 1
else:
print(friend,'性别未标记!')
sex_dict['other'] += 1
print(sex_dict)
wx_show_sex_infor(sex_dict)
# pie(x, explode=None, labels=None,
# colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'),
# autopct=None, pctdistance=0.6, shadow=False,
# labeldistance=1.1, startangle=None, radius=None,
# counterclock=True, wedgeprops=None, textprops=None,
# center = (0, 0), frame = False )
# 参数说明
# x (每一块)的比例,如果sum(x) > 1会使用sum(x)归一化
# labels (每一块)饼图外侧显示的说明文字
# explode (每一块)离开中心距离
# startangle 起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起
# shadow 是否阴影
# labeldistance label绘制位置,相对于半径的比例, 如<1则绘制在饼图内侧
# autopct 控制饼图内百分比设置,可以使用format字符串或者format function
# '%1.1f'指小数点前后位数(没有用空格补齐)
# pctdistance 类似于labeldistance,指定autopct的位置刻度
# radius 控制饼图半径
# 返回值:
# 如果没有设置autopct,返回(patches, texts)
# 如果设置autopct,返回(patches, texts, autotexts)
def wx_show_sex_infor(data):
labers = ['男性','女性','未标记']
data = [data['male'],data['female'],data['other']]
plt.pie(data=data,labels=labers,autopct='%.2f',shadow=True)
plt.show()
plt.savefig('sex.jpg')
plt.close()
def wx_friend_location_infor(friends):
loction_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}
for friend in friends:
if friend.province in loction_dict.keys():
loction_dict[friend.province] += 1
#转成JSON格式:
loction_list = []
for key,value in loction_dict.items():
loction_list.append({'name':key,'sum':value})
print(loction_list)
def wx_show_location_infor():
pass
#显示好友个签信息
def wx_show_signature(friends):
#统计好友签名
for friend in friends:
#对数据进行清洗,排除标点信息的干扰
pattern = re.compile(r'[一-龥]+')
filterdata = re.findall(pattern,friend.signature)
with open('signature.txt','a',encoding='utf-8',newline='') as f:
f.write(str(friend)+''.join(filterdata)+'\n')
f.close()
# 读取文件数据
with open('signature.txt','r',encoding='utf-8',newline='') as f:
content = f.read()
f.close()
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='gb18030')
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('background.jpg')
wordcloud = WordCloud(font_path='simhei.ttf', #设置字体可以显示中文
background_color= 'white', #背景颜色是白色
max_words=1000, #设置词云显示的最大词数
mask=color_mask, #设置背景图片
max_font_size=400, #设置词云中字体的最大值
random_state=42,
width=500,height=430,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()
plt.close()
if __name__ == '__main__':
friends = wx_login()
print('~~~~~~~~~~~~~~~~~~~~1~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
wx_friend_sex_infor(friends)
print('~~~~~~~~~~~~~~~~~~~~~2~~~~~~~~~~~~~~~~~~~~~~~~~~~')
wx_friend_location_infor(friends)
print('~~~~~~~~~~~~~~~~~~~~~~3~~~~~~~~~~~~~~~~~~~~~~~~~~')
wx_show_signature(friends)
print('~~~~~~~~~~~~~~~~~~~~~~~4~~~~~~~~~~~~~~~~~~~~~~~~~')
希望本文所述对大家Python程序设计有所帮助。
来源:https://blog.csdn.net/m0_37338590/article/details/80553985


猜你喜欢
- 本文实例讲述了Python实现的生产者、消费者问题。分享给大家供大家参考,具体如下:生产者、消费者问题,经典的线程同步问题:假设有一个缓冲池
- 之前整理发表了《XMLHTTPRequest的属性和方法简介》,它ajax要使用的核心的技术之一,现在就来实际运用它。这个Ajax标签导航,
- 前言之前一直写不出来,这周周日花了一下午终于弄懂了, 顺便放博客里,方便以后忘记了再看看。 要实现的是输入一张 图,起点,终点,输出起点和终
- nonzero函数返回非零元素的目录。返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。 import
- 在本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下: 1. UNICODE (UTF8-16),C854;
- 基于上一篇文章,这篇文章是关于使用coverage来实现代码覆盖的操作实例,源代码在上一篇已经给出相应链接。本篇文章字用来实现代码覆盖的源代
- 简介 Closure 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分
- 这两天为了这个问题, Gitter 上问, Twitter 上问, GitHub 上问, 两天没反应原来写博客的 jlongster 不理我
- 检查 MySQL 数据库的启动时间Linux 系统中的 systemd 和 mysqld_safe 会在 mysqld 进程 crash 后
- 实验环境:tensorflow版本1.2.0,python2.7介绍depthwise_conv2d来源于深度可分离卷积:Xception:
- 装饰器信号与槽所谓装饰器信号与槽,就是通过装饰器的方法来定义信号与槽函数,具体的使用方法如下@PyQt5.QtCore.pyqtSlot(参
- vscode 中 python 提示警告错误,但是还是能跑起来代码:Import "playwright.sync_api&quo
- 我们在使用GPU资源进行训练的时候,可能会发生资源耗尽的情况,那么在在这种情况,我们需要对GPU的资源进行合理的安排,具体使用办法如下:框架
- 本文实例为大家分享了Pygame框架实现飞机大战的具体代码,供大家参考,具体内容如下飞机大战主游戏类"""项目
- messageboxtkinter.messagebox中封装了多种消息框,其输入参数统一为title, message以及其他参数。其中t
- 本文实例讲述了Django中实现点击图片链接强制直接下载的方法。分享给大家供大家参考。具体分析如下:当用户点击图片连接时,默认为在浏览器中直
- 1、变量的定义定义变量语法格式:variable_name = variable_namevariable_name表示变量名;variab
- Jupyter Notebook本身是默认使用一种Anaconda中root目录下的Python环境的,如果想使用其它的虚拟环境,还需要通过
- 1.数组的索引我用的是iloc函数。导入数据是data,索引data.iloc[i,j],i代表行,j代表列。如果要索引i行之后的所有行元素
- 单例模式Singleton Pattern是什么单例模式是一种创建型模式,它保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式的