Python 을 사용 하여 위 챗 친구 에 대한 데이터 분석

1.준비 작업
1.1 라 이브 러 리 소개
위 챗 에 로그 인해 야만 위 챗 친구 의 정 보 를 얻 을 수 있 습 니 다.본 고 는 wxpy 라 는 제3자 라 이브 러 리 를 이용 하여 위 챗 의 로그 인 과 정 보 를 얻 을 수 있 습 니 다.
wxpy 는 itchat 를 바탕 으로 대량의 인 터 페 이 스 를 통 해 모듈 의 용이 성 을 최적화 시 키 고 풍부 한 기능 확장 을 진행 했다.
wxpy 에서 흔히 볼 수 있 는 장면 들:
•공유 기,스마트 홈 등 개방 인터페이스 가 있 는 놀이
•스 크 립 트 를 실행 할 때 자동 으로 로 그 를 위 챗 으로 보 냅 니 다.
•군 주 를 친구 로 추가 하여,자동 으로 군 속으로 끌 어 들 인 다.
•크로스 번호 또는 크로스 그룹 전송 메시지
•자동 채 팅
웃기다
한 마디 로 각종 위 챗 개인 번호 의 자동화 작업 을 실현 할 수 있다.
1.2 wxpy 라 이브 러 리 설치
wxpy 는 Python 3.4-3.6 및 2.7 버 전 을 지원 합 니 다.
아래 명령 의"pip"을"pip 3"또는"pip 2"로 바 꾸 면 해당 하 는 Python 버 전에 설치 할 수 있 습 니 다.
1.PYPI 공식 소스 에서 다운로드 하여 설치(국내 에서 느 리 거나 불안정 할 수 있 음):
pip install -U wxpy1
1.콩짜개 PYPI 미 러 소스 에서 다운로드 하여 설치(국내 사용자 추천):
pip install -U wxpy -i " https://pypi.doubanio.com/simple/"1
1.3 위 챗 로그 인
wxpy 에 로봇 대상 이 있 는데 로봇 Bot 대상 은 웹 위 챗 클 라 이언 트 로 이해 할 수 있 습 니 다.Bot 는 초기 화 할 때 로그 인 작업 을 수행 하기 때문에 핸드폰 스 캔 로그 인 이 필요 합 니 다.
로봇 대상 Bot 의 chats(),friends(),groups(),mps()방법 을 통 해 현재 로봇 의 모든 채 팅 대상,친구,단체 채 팅,그리고 공중 번호 목록 을 얻 을 수 있 습 니 다.
본 고 는 주로 friends()를 통 해 모든 친구 정 보 를 얻 은 다음 에 데이터 처 리 를 한다.

from wxpy import *
#       ,    
bot = Bot()
#       
my_friends = bot.friends()
print(type(my_friends))
다음은 출력 메시지:
Getting uuid of QR code.
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Loading the contact, this may take a little while.
<로그 인 성공 적 으로 왕 강?>

wxpy.api.chats.chats 대상 은 여러 채 팅 대상 의 집합 으로 검색 이나 통계 에 사용 할 수 있 으 며,검색 과 통 계 를 할 수 있 는 정 보 는 sex(성별),province(성),city(도시)와 signature(개성 서명)등 을 포함한다.
2.위 챗 친구 남녀 비율
2.1 데이터 통계
사전 1 개 사용 하기 sexdict 는 친구 중 남성 과 여성의 수 를 통계 합 니 다.

#                   
sex_dict = {'male': 0, 'female': 0}
for friend in my_friends:
 #     
 if friend.sex == 1:
 sex_dict['male'] += 1
 elif friend.sex == 2:
 sex_dict['female'] += 1
print(sex_dict)
다음은 출력 결과:
{'male': 255, 'female': 104}
2.2 데이터 구현
본 고 는 ECharts 떡 그림 으로 데 이 터 를 나타 내 고 링크 를 엽 니 다http://echarts.baidu.com/echarts2/doc/example/pie1.html다음 과 같은 내용 을 볼 수 있 습 니 다.
1、echarts饼图原始内容
1.echarts 떡 그림 의 원본 내용
그림 에서 왼쪽 은 데이터 이 고 오른쪽 은 나타 나 는 데이터 그림 을 볼 수 있 으 며 다른 형식의 그림 도 이런 좌우 구조 이다.왼쪽 데이터 보기:

option = {
 title : {
 text: '         ',
 subtext: '    ',
 x:'center'
 },
 tooltip : {
 trigger: 'item',
 formatter: "{a} <br/>{b} : {c} ({d}%)"
 },
 legend: {
 orient : 'vertical',
 x : 'left',
 data:['    ','    ','    ','    ','    ']
 },
 toolbox: {
 show : true,
 feature : {
 mark : {show: true},
 dataView : {show: true, readOnly: false},
 magicType : {
 show: true, 
 type: ['pie', 'funnel'],
 option: {
  funnel: {
  x: '25%',
  width: '50%',
  funnelAlign: 'left',
  max: 1548
  }
 }
 },
 restore : {show: true},
 saveAsImage : {show: true}
 }
 },
 calculable : true,
 series : [
 {
 name:'    ',
 type:'pie',
 radius : '55%',
 center: ['50%', '60%'],
 data:[
 {value:335, name:'    '},
 {value:310, name:'    '},
 {value:234, name:'    '},
 {value:135, name:'    '},
 {value:1548, name:'    '}
 ]
 }
 ]
}; 
option=뒤의 대괄호 안에 JSON 형식의 데 이 터 를 볼 수 있 습 니 다.다음은 각 데 이 터 를 분석 해 보 겠 습 니 다.
제목
•text:제목 내용
하위 제목
•x:제목 위치
•tooltip:힌트,떡 모양 그림 에 마 우 스 를 올 리 면 힌트 를 볼 수 있 습 니 다.
•legend:그림
방향
•x:그림 위치
•data:그림 내용
•toolbox:공구 상자,떡 모양 그림 오른쪽 위 에 가로로 배 열 된 아이콘
•mark:보조 선 스위치
•dataView:데이터 보기,클릭 하면 떡 모양 그림 데 이 터 를 볼 수 있 습 니 다.
•magic Type:떡 그림(pie)전환 과 깔때기 그림(funnel)전환
•복원:복원
•saveasImage:그림 으로 저장
•calculable:그것 이 무슨 소 용이 있 는 지 잠시 모 르 겠 습 니 다.
•series:주요 데이터
•data:나타 난 데이터
다른 유형의 그림 데이터 형식 은 유사 하 며,이후 에는 더 이상 상세 하 게 분석 하지 않 습 니 다.data,l**egend->data**,series->data 만 수정 하면 됩 니 다.수 정 된 데 이 터 는:

option = {
 title : {
 text: '        ',
 subtext: '    ',
 x:'center'
 },
 tooltip : {
 trigger: 'item',
 formatter: "{a} <br/>{b} : {c} ({d}%)"
 },
 legend: {
 orient : 'vertical',
 x : 'left',
 data:['  ','  ']
 },
 toolbox: {
 show : true,
 feature : {
 mark : {show: true},
 dataView : {show: true, readOnly: false},
 magicType : {
 show: true, 
 type: ['pie', 'funnel'],
 option: {
  funnel: {
  x: '25%',
  width: '50%',
  funnelAlign: 'left',
  max: 1548
  }
 }
 },
 restore : {show: true},
 saveAsImage : {show: true}
 }
 },
 calculable : true,
 series : [
 {
 name:'    ',
 type:'pie',
 radius : '55%',
 center: ['50%', '60%'],
 data:[
 {value:255, name:'  '},
 {value:104, name:'  '}
 ]
 }
 ]
}; 
데이터 수정 이 완료 되면 페이지 의 녹색 새로 고침 단 추 를 누 르 면 떡 그림 을 다음 과 같이 얻 을 수 있 습 니 다(자신의 취향 에 따라 테 마 를 수정 할 수 있 습 니 다).
2、好友性别比例
2,친구 성별 비율
떡 그림 에 마 우 스 를 올 리 면 자세 한 데 이 터 를 볼 수 있 습 니 다.
3、好友性别比例查看数据
3.친구 성별 비율 보기 데이터
3.위 챗 친구 전국 분포 도
3.1 데이터 통계

#               
province_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 my_friends:
 if friend.province in province_dict.keys():
 province_dict[friend.province] += 1
#          ,  JSON Array    
data = []
for key, value in province_dict.items():
 data.append({'name': key, 'value': value})
print(data)
다음은 출력 결과:
'이름':'북경','value':91},{'이름':'상하 이','value':12},{'이름':'이름':'천진','value':15},{'이름':'충 칭','value':1},{'이름':'하북','value':53},{'이름':'산 서','value':2},{'이름':'길 림','value'값':1},{'이름','값':1},{'이름':'랴오닝','값':1},{'값'값':1},{'이름','이름','값':53},{'이름',{'이름','이름','이름','이름','이름','섬서성','value':3},{'name':'감숙성','value':0},{'name':'청해','value':0},{'name':'산동','value':7},{'이름':'복 건','value':3},{'이름':'절강','value':4},{'이름':'대만','value':0},{'이름',{'이름':'하남','value':1},{'이름','value'값':1},{'이름','호 북','value'값':4},{'이름'이름':'호 남','value':4},'value':4},{'이름'이름'4},{'이름'이름'이름':','이름'이름':','이름':'},{'name':'강소성','value':9},{'name':'이름':'안휘','value':2},{'name':'광 둥','value':63},{'name':'이름':'하 이 난','value':0},{'이름':'사천','value':2},{'이름':'귀주','value':0},{'이름':'운남','value':1},{'이름':'내몽골','value','value'값':0},{'이름'값':0},{'이름':'이름':'신장',','value':2},{'이름':'이름':'영하','값','값'값','값'값':0},{'이름'이름':'광서','value':1},{'name':'티베트','value':0},{'name':'홍콩','value':0},{'name':'마카오','value':0}]
친구 가 가장 많은 성 은 베 이 징 임 을 알 수 있다.그렇다면 문제 가 생 겼 다.왜 데 이 터 를 이런 형식 으로 재 구성 해 야 합 니까?ECharts 의 지 도 는 이런 형식의 데이터 가 필요 하기 때문이다.
3.2 데이터 구현
ECharts 지도 로 친구 분포 데 이 터 를 보 여 줍 니 다.이 사이트 주 소 를 열 고 왼쪽 데 이 터 를 다음 으로 변경 합 니 다.

option = {
 title : {
 text: '         ',
 subtext: '    ',
 x:'center'
 },
 tooltip : {
 trigger: 'item'
 },
 legend: {
 orient: 'vertical',
 x:'left',
 data:['    ']
 },
 dataRange: {
 min: 0,
 max: 100,
 x: 'left',
 y: 'bottom',
 text:[' ',' '], //   ,       
 calculable : true
 },
 toolbox: {
 show: true,
 orient : 'vertical',
 x: 'right',
 y: 'center',
 feature : {
 mark : {show: true},
 dataView : {show: true, readOnly: false},
 restore : {show: true},
 saveAsImage : {show: true}
 }
 },
 roamController: {
 show: true,
 x: 'right',
 mapTypeControl: {
 'china': true
 }
 },
 series : [
 {
 name: '    ',
 type: 'map',
 mapType: 'china',
 roam: false,
 itemStyle:{
 normal:{label:{show:true}},
 emphasis:{label:{show:true}}
 },
 data:[
 {'name': '  ', 'value': 91},
 {'name': '  ', 'value': 12},
 {'name': '  ', 'value': 15}, 
 {'name': '  ', 'value': 1}, 
 {'name': '  ', 'value': 53},
 {'name': '  ', 'value': 2}, 
 {'name': '  ', 'value': 1},
 {'name': '  ', 'value': 1}, 
 {'name': '   ', 'value': 2},
 {'name': '  ', 'value': 3},
 {'name': '  ', 'value': 0},
 {'name': '  ', 'value': 0}, 
 {'name': '  ', 'value': 7},
 {'name': '  ', 'value': 3}, 
 {'name': '  ', 'value': 4},
 {'name': '  ', 'value': 0},
 {'name': '  ', 'value': 1},
 {'name': '  ', 'value': 4}, 
 {'name': '  ', 'value': 4},
 {'name': '  ', 'value': 4},
 {'name': '  ', 'value': 9},
 {'name': '  ', 'value': 2},
 {'name': '  ', 'value': 63}, 
 {'name': '  ', 'value': 0},
 {'name': '  ', 'value': 2},
 {'name': '  ', 'value': 0}, 
 {'name': '  ', 'value': 1},
 {'name': '   ', 'value': 0},
 {'name': '  ', 'value': 2}, 
 {'name': '  ', 'value': 0},
 {'name': '  ', 'value': 1},
 {'name': '  ', 'value': 0},
 {'name': '  ', 'value': 0},
 {'name': '  ', 'value': 0}
 ]
 }
 ]
};  
두 가지 주의:
•dataRange->max 통계 데이터 에 따라 적 절 히 조정
•series->data 의 데이터 형식
리 셋 버튼 을 클릭 하면 아래 맵 을 생 성 할 수 있 습 니 다:
4、好友全国分布图
4.친구 전국 분포 도
그림 에서 보 듯 이 나의 친 구 는 주로 베 이 징,허 베 이,광 둥 에 분포 되 어 있다.
재 미 있 는 것 은 지도 왼쪽 에 슬라이더 가 있 는데 지도 데이터 의 범 위 를 대표 합 니 다.우 리 는 위의 슬라이더 를 맨 아래로 끌 어 올 리 면 위 챗 친구 가 분포 되 어 있 지 않 은 성 을 볼 수 있 습 니 다.
5.위 챗 친구 가 없 는 성
5、没有微信好友的省份
이 사고방식 에 따라 우 리 는 지도 에서 정확 한 수량의 친구 분포 성 을 볼 수 있 고 독자 들 이 직접 해 볼 수 있다.
4.친구 서명 통계
4.1 데이터 통계

def write_txt_file(path, txt):
 '''
   txt  
 '''
 with open(path, 'a', encoding='gb18030', newline='') as f:
 f.write(txt) 
#     
for friend in my_friends:
 #        ,                    
 pattern = re.compile(r'[ -]+')
 filterdata = re.findall(pattern, friend.signature)
 write_txt_file('signatures.txt', ''.join(filterdata))
위의 코드 는 친구 의 서명 을 세척 하고 저장 하 는 기능 을 실현 합 니 다.실행 이 완료 되면 현재 디 렉 터 리 에 signatures.txt 파일 을 생 성 합 니 다.
4.2 데이터 표현
데 이 터 는 주파수 통계 와 어 운 전 시 를 통 해 위 챗 친구 의 생활 태 도 를 알 수 있다.
주파수 통 계 는 jieba,numpy,pandas,scipy,wordcloud 라 이브 러 리 를 사용 했다.컴퓨터 에 이 라 이브 러 리 가 없 으 면 설치 명령 을 실행 합 니 다.
•pip install jieba
•pip install pandas
•pip install numpy
•pip install scipy
•pip install wordcloud
4.2.1 txt 파일 읽 기
앞 에 친구 서명 을 txt 파일 에 저 장 했 습 니 다.이 제 는 읽 겠 습 니 다.

def read_txt_file(path):
 '''
   txt  
 '''
 with open(path, 'r', encoding='gb18030', newline='') as f:
 return f.read()
4.2.2 stop word
다음은 하나의 개념 을 도입 한다.stop word 는 사이트 에 대량의 상용 어가 존재 한다.예 를 들 어'재','안','도','의','그것','위'등 단 어 는 모두 정지 어 이다.이 단어 들 은 사용 빈도 가 너무 높 아 거의 모든 웹 페이지 에 존재 하기 때문에 검색엔진 개발 자 들 은 이런 단 어 를 모두 무시 했다.만약 우리 사이트 에 이런 단어 가 대량으로 존재 한다 면,많은 자원 을 낭비 한 셈 이다.
바 이 두 에서 stpowords.txt 를 검색 하여 다운로드 하여 py 파일 동급 디 렉 터 리 에 넣 습 니 다.

content = read_txt_file(txt_filename)
segment = jieba.lcut(content)
words_df=pd.DataFrame({'segment':segment})
stopwords=pd.read_csv("stopwords.txt",index_col=False,quoting=3,sep=" ",names=['stopword'],encoding='utf-8')
words_df=words_df[~words_df.segment.isin(stopwords.stopword)]
4.2.3 단어의 빈도 통계
중요 한 장면 이 왔 습 니 다.주파수 통 계 는 numpy 를 사용 합 니 다.

import numpy
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"  ":numpy.size})
 words_stat = words_stat.reset_index().sort_values(by=["  "],ascending=False)
4.2.4 단어의 주파수 시각 화:어휘 구름
단어의 주파수 통계 가 나 왔 지만 순 위 를 알 수 있 지만 완벽 하지 않다.그 다음 에 우 리 는 그것 을 시각 화 할 것 이다.워드 클 라 우 드 라 이브 러 리 에 사용 합 니 다.github 를 자세히 소개 합 니 다.

from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator
#       
color_mask = imread('background.jfif')
wordcloud = WordCloud(font_path="simhei.ttf", #           
 background_color="white", #     
 max_words=100,  #          
 mask=color_mask, #       
 max_font_size=100, #      
 random_state=42,
 width=1000, height=860, margin=2,#          ,            ,    #                   ,margin       
 )
#     ,    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()

실행 효과 그림 은 다음 과 같 습 니 다(왼쪽 그림 은 배경 그림 이 고 오른쪽 그림 은 단어 구름 그림 입 니 다).
6、背景图和词云图对比
6.배경 그림 과 단어 구름 그림 의 비교
단어 구름 그림 에서 친구 의 특징 을 분석 할 수 있다.
행동 파
•인생,생활-C 생활 을 사랑 합 니 다.
즐겁다
선택
전공
사랑
5.총화
이로써 위 챗 친구 의 분석 작업 은 이미 완성 되 었 습 니 다.wxpy 의 기능 은 아직도 많 습 니 다.예 를 들 어 채 팅,공중 번호 정보 조회 등 의도 적 인 독 자 는 스스로 공식 문 서 를 조회 하 십시오.
6.전체 코드
위의 코드 는 비교적 느슨 하 다.아래 에 보 여 준 전체 코드 는 내 가 각 기능 모듈 을 함수 로 봉 한다.

#-*- coding: utf-8 -*-
import re
from wxpy import *
import jieba
import numpy
import pandas as pd
import matplotlib.pyplot as plt
from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator
def write_txt_file(path, txt):
 '''
   txt  
 '''
 with open(path, 'a', encoding='gb18030', newline='') as f:
 f.write(txt)
def read_txt_file(path):
 '''
   txt  
 '''
 with open(path, 'r', encoding='gb18030', newline='') as f:
 return f.read()
def login():
 #       ,    
 bot = Bot()
 #       
 my_friends = bot.friends()
 print(type(my_friends))
 return my_friends
def show_sex_ratio(friends):
 #                   
 sex_dict = {'male': 0, 'female': 0}
 for friend in friends:
 #     
 if friend.sex == 1:
 sex_dict['male'] += 1
 elif friend.sex == 2:
 sex_dict['female'] += 1
 print(sex_dict)
def show_area_distribution(friends):
 #               
 province_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 province_dict.keys():
 province_dict[friend.province] += 1
 #          ,  JSON Array    
 data = []
 for key, value in province_dict.items():
 data.append({'name': key, 'value': value})
 print(data)
def show_signature(friends):
 #     
 for friend in friends:
 #        ,                    
 pattern = re.compile(r'[ -]+')
 filterdata = re.findall(pattern, friend.signature)
 write_txt_file('signatures.txt', ''.join(filterdata))
 #     
 content = read_txt_file('signatures.txt')
 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='utf-8')
 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.jfif')
 wordcloud = WordCloud(font_path="simhei.ttf", #           
  background_color="white", #     
  max_words=100,  #          
  mask=color_mask, #       
  max_font_size=100, #      
  random_state=42,
  width=1000, height=860, margin=2,#          ,            ,    #                   ,margin       
  )
 #     ,    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()
def main():
 friends = login()
 show_sex_ratio(friends)
 show_area_distribution(friends)
 show_signature(friends)
if __name__ == '__main__':
 main()
총결산
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 Python 을 사용 하여 위 챗 친구 에 대한 데이터 분석 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기