Python爬虫实现“盗取”微信好友信息的方法分析

所属分类: 脚本专栏 / python 阅读数: 152
收藏 0 赞 0 分享

本文实例讲述了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相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总

希望本文所述对大家Python程序设计有所帮助。

更多精彩内容其他人还在看

深入浅析python3中的unicode和bytes问题

在python3中,有两种字符串类型,默认的就是str,即unicode,也叫做文本类型。这篇文章主要介绍了python3中的unicode和bytes问题,需要的朋友可以参考下
收藏 0 赞 0 分享

python3 自动识别usb连接状态,即对usb重连的判断方法

今天小编就为大家分享一篇python3 自动识别usb连接状态,即对usb重连的判断方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

python二进制文件的转译详解

这篇文章主要介绍了python二进制文件的转译详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

python字符串中匹配数字的正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。这篇文章主要介绍了python字符串中匹配数字的正则表达式 ,需要的朋友可以参考下
收藏 0 赞 0 分享

在Python中COM口的调用方法

今天小编就为大家分享一篇在Python中COM口的调用方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Python read函数按字节(字符)读取文件的实现

这篇文章主要介绍了Python read函数按字节(字符)读取文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

python读取图片的方式,以及将图片以三维数组的形式输出方法

今天小编就为大家分享一篇python读取图片的方式,以及将图片以三维数组的形式输出方法,具有好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

在python中利用numpy求解多项式以及多项式拟合的方法

今天小编就为大家分享一篇在python中利用numpy求解多项式以及多项式拟合的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Python正则表达式匹配数字和小数的方法

这篇文章主要介绍了Python正则匹配数字和小数的方法,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

python读写配置文件操作示例

这篇文章主要介绍了python读写配置文件操作,结合实例形式分析了Python针对ini配置文件的读取、解析、写入等相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多