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实现LRU算法的2种方法
Jun 24 Python
python实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
Python实现Sqlite将字段当做索引进行查询的方法
Jul 21 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
flask-socketio实现WebSocket的方法
Jul 31 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
python变量的存储原理详解
Jul 10 Python
利用Python实现kNN算法的代码
Aug 16 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
Jan 09 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
python 发送get请求接口详解
Nov 17 Python
Python 数据科学 Matplotlib图库详解
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中的socket_read和socket_recv区别详解
2015/02/09 PHP
PHP goto语句用法实例
2019/08/06 PHP
jQuery 方法大全方便学习参考
2010/02/25 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
python 内置函数filter
2017/06/01 Python
不可错过的十本Python好书
2017/07/06 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
浅析python中while循环和for循环
2019/11/19 Python
python读取mysql数据绘制条形图
2020/03/25 Python
python如何写try语句
2020/07/14 Python
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
小学生家长评语集锦
2014/01/30 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
公司合作协议书范本
2014/04/18 职场文书
法人代表证明书
2014/09/18 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
工地材料员岗位职责
2015/04/11 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
理想国读书笔记
2015/06/25 职场文书
学习十八大的感悟
2015/08/11 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers
Matlab如何实现矩阵复制扩充
2021/06/02 Python