Python 을 사용 하여 위 챗 친구 에 대한 데이터 분석
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 떡 그림 의 원본 내용
그림 에서 왼쪽 은 데이터 이 고 오른쪽 은 나타 나 는 데이터 그림 을 볼 수 있 으 며 다른 형식의 그림 도 이런 좌우 구조 이다.왼쪽 데이터 보기:
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,친구 성별 비율
떡 그림 에 마 우 스 를 올 리 면 자세 한 데 이 터 를 볼 수 있 습 니 다.
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.친구 전국 분포 도
그림 에서 보 듯 이 나의 친 구 는 주로 베 이 징,허 베 이,광 둥 에 분포 되 어 있다.
재 미 있 는 것 은 지도 왼쪽 에 슬라이더 가 있 는데 지도 데이터 의 범 위 를 대표 합 니 다.우 리 는 위의 슬라이더 를 맨 아래로 끌 어 올 리 면 위 챗 친구 가 분포 되 어 있 지 않 은 성 을 볼 수 있 습 니 다.
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.배경 그림 과 단어 구름 그림 의 비교
단어 구름 그림 에서 친구 의 특징 을 분석 할 수 있다.
행동 파
•인생,생활-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 을 사용 하여 위 챗 친구 에 대한 데이터 분석 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.