Python爬虫实现“盗取”微信好友信息的方法分析
本文实例讲述了Python爬虫实现“盗取”微信好友信息的方法。分享给大家供大家参考,具体如下:
刚起床,闲来无聊,找点事做,看了朋友圈一篇爬取微信好友信息的文章,突发奇想,偷偷看看女朋友微信有些啥。。。。于是就下手了。。。。[阴险]
1、准备工作:
运行平台:Windows
Python版本:Python3.6
IDE:SublimeText
Python库:wxpy,
2、开发流程:(电脑没电了,要撑不住了啦~之后具体分析)
3、直接上代码:
#微信好友信息爬取+数据可视化
#encoding=utf-8
__author__='Jonny'
__location__='济南'
__date__='2018-06-02'
fromwxpyimport*
importre
importjieba
importnumpy
importpandasaspd
importmatplotlib.pyplotasplt
fromscipy.miscimportimread
fromwordcloudimportWordCloud,ImageColorGenerator
frommatplotlib.patchesimportPolygon
frommatplotlib.colorsimportrgb2hex
frommpl_toolkits.basemapimportB
#微信登录
defwx_login():
try:
#初始化机器人,扫码登录
bot=Bot()
#获取好友列表
frinds=bot.friends()
#wxpy.api.chats.chats.Chats对象是多个聊天对象的合集,
#可用于搜索或统计,可以搜索和统计的信息包括sex(性别)、province(省份)、city(城市)和signature(个性签名)等
print(type(frinds))
#输出好友列表
foriinfrinds:
print(i)
exceptExceptionase:
print(e.args)
wx_login()
returnfrinds
#数据可视化
#统计男女性别信息
defwx_friend_sex_infor(friends):
sex_dict={'male':0,'female':0,'other':0}
forfriendinfriends:
iffriend.sex==1:
sex_dict['male']+=1
eliffriend.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是否阴影
#labeldistancelabel绘制位置,相对于半径的比例,如<1则绘制在饼图内侧
#autopct控制饼图内百分比设置,可以使用format字符串或者formatfunction
#'%1.1f'指小数点前后位数(没有用空格补齐)
#pctdistance类似于labeldistance,指定autopct的位置刻度
#radius控制饼图半径
#返回值:
#如果没有设置autopct,返回(patches,texts)
#如果设置autopct,返回(patches,texts,autotexts)
defwx_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()
defwx_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}
forfriendinfriends:
iffriend.provinceinloction_dict.keys():
loction_dict[friend.province]+=1
#转成JSON格式:
loction_list=[]
forkey,valueinloction_dict.items():
loction_list.append({'name':key,'sum':value})
print(loction_list)
defwx_show_location_infor():
pass
#显示好友个签信息
defwx_show_signature(friends):
#统计好友签名
forfriendinfriends:
#对数据进行清洗,排除标点信息的干扰
pattern=re.compile(r'[一-龥]+')
filterdata=re.findall(pattern,friend.signature)
withopen('signature.txt','a',encoding='utf-8',newline='')asf:
f.write(str(friend)+''.join(filterdata)+'\n')
f.close()
#读取文件数据
withopen('signature.txt','r',encoding='utf-8',newline='')asf:
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]forxinwords_stat.head(100).values}
print(word_frequence)
word_frequence_dict={}
forkeyinword_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相关内容可查看本站专题:《PythonSocket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。