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简单程序读取串口信息的方法
Mar 13 Python
Python使用multiprocessing创建进程的方法
Jun 04 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
对Python+opencv将图片生成视频的实例详解
Jan 08 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
python3使用matplotlib绘制散点图
Mar 19 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
python读取当前目录下的CSV文件数据
Mar 11 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 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
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
javascript 必知必会之closure
2009/09/21 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
js轮播图代码分享
2016/07/14 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
pyside写ui界面入门示例
2014/01/22 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python实现的科学计算器功能示例
2017/08/04 Python
Python实现图片拼接的代码
2018/07/02 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
python实现加密的方式总结
2020/01/19 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
婚礼新郎父母答谢词
2014/01/16 职场文书
就业协议书样本
2014/08/20 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
原告离婚代理词
2015/05/23 职场文书
婚宴主持词
2015/06/30 职场文书
初中信息技术教学反思
2016/02/16 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
高二英语教学反思
2016/03/03 职场文书
对讲机知识
2022/04/07 无线电