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程序设计有所帮助。