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


Posted in Python onSeptember 16, 2019

本文实例讲述了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程序设计有所帮助。

Python 相关文章推荐
使用Python编写Linux系统守护进程实例
Feb 03 Python
Python中用Decorator来简化元编程的教程
Apr 13 Python
使用python加密自己的密码
Aug 04 Python
使用python实现生成用户信息
Mar 20 Python
Python爬取网易云音乐热门评论
Mar 31 Python
Python的时间模块datetime详解
Apr 17 Python
Python爬虫DNS解析缓存方法实例分析
Jun 02 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
Python中optparser库用法实例详解
Jan 26 Python
对pandas进行数据预处理的实例讲解
Apr 20 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
python 字符串常用方法汇总详解
Sep 16 #Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 #Python
python tkinter组件使用详解
Sep 16 #Python
python tkinter组件摆放方式详解
Sep 16 #Python
python动态视频下载器的实现方法
Sep 16 #Python
python tkinter基本属性详解
Sep 16 #Python
Django之使用内置函数和celery发邮件的方法示例
Sep 16 #Python
You might like
php select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
php7性能提升的原因详解
2019/10/13 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
关于跨站脚本攻击问题
2011/12/22 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
python实现360皮肤按钮控件示例
2014/02/21 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
Python向excel中写入数据的方法
2019/05/05 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
创先争优一句话承诺
2014/05/29 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
员工升职自荐信
2015/03/27 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang