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实现搜索本地文件信息写入文件的方法
Feb 22 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 Python
python实现ID3决策树算法
Dec 20 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
对Python3 * 和 ** 运算符详解
Feb 16 Python
十行代码使用Python写一个USB病毒
Jun 21 Python
浅谈Python 参数与变量
Jun 20 Python
Django分页器的用法你都了解吗
May 26 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 Python
Python可视化神器pyecharts绘制地理图表
Jul 07 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顺序查找和二分查找示例
2014/03/27 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
深入认识javascript中的eval函数
2009/11/02 Javascript
ASP Json Parser修正版
2009/12/06 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
微信小程序调用后台service教程详解
2020/11/06 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
python list中append()与extend()用法分享
2013/03/24 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
Python Collatz序列实现过程解析
2019/10/12 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
Python Opencv图像处理基本操作代码详解
2020/08/31 Python
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
奥巴马就职演讲稿
2014/05/15 职场文书
公司授权委托书范文
2014/09/21 职场文书
免职证明样本
2014/10/23 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
毕业典礼邀请函
2015/01/31 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python