Python3 爬取微信好友基本信息,並進行數據清洗


Python3 爬取微信好友基本信息,並進行數據清洗

1,登錄獲取好友基礎信息:

  好友的獲取方法為get_friends,將會返回完整的好友列表。

  • 其中每個好友為一個字典
  • 列表的第一項為本人的賬號信息
  • 傳入update鍵為True將可以更新好友列表並返回
'''
微信:
Date:20180918
Author:lizm
Description:爬取微信好友、公眾號、群聊基本信息,並進行數據清洗
'''
import itchat
from pandas import DataFrame
import pandas as pd
import re

#1,登錄(每次登錄都要掃二維碼)
itchat.login()
#登錄(只需要掃碼一次,第二次運行手機微信會彈出確認框)
#itchat.auto_login(hotReload=True)

#爬取自己好友相關信息, 返回一個json文件
friends = itchat.get_friends(update=True)[0:]
#print(friends)

2,統計性別並圖形展示(pyecharts)

#2,統計性別
#初始化計數器
male = female = other = 0
#friends[0]是自己的信息,所以要從friends[1]開始
for i in friends[1:]:
    sex = i["Sex"]
    if sex == 1:
        male += 1
    elif sex == 2:
        female += 1
    else:
        other +=1
#計算朋友總數
total = len(friends[1:])
#打印出自己的好友性別比例
print("男性好友: %.2f%%" % (float(male)/total*100) + "\n" +
"女性好友: %.2f%%" % (float(female) / total * 100) + "\n" +
"不明性別好友: %.2f%%" % (float(other) / total * 100))

#pyecharts圖形
from pyecharts import Bar
bar =Bar("性別比例圖", "微信好友")
bar.add("性別", ["", "", "未知"], [male, female, other])
bar.show_config()
bar.render()

3,將基本信息保存到csv

#3,將基本信息保存到csv
def filter_emoji(desstr,restr=''):  
    #過濾表情   
    try:  
        co = re.compile(u'[\U00010000-\U0010ffff]')  
    except re.error:  
        co = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')  
    return co.sub(restr, desstr)  

#定義一個函數,用來爬取各個變量
import emoji
def get_var(var):
    variable = []
    for friend in friends:
        value = friend[var]
        if isinstance(value,str):
            value = value.strip()
            #value = emoji.demojize(value)
            value = filter_emoji(value,'')
            rep = re.compile("1f\d+\w*|[<>/=]")
            value = rep.sub("", value)
            rep1 = re.compile("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+")
            value = rep1.sub('',value)
            print("爬取數據[%s]>>>>:%s" %(var,value))
        else:
            pass
        variable.append(value)
    return variable

#調用函數得到各變量,並把數據存到csv文件中,保存到桌面
NickName = get_var("NickName")
Sex = get_var('Sex')
Province = get_var('Province')
City = get_var('City')
Signature = get_var('Signature')

data = {'NickName': NickName, 'Sex': Sex, 'Province': Province,
        'City': City, 'Signature': Signature}
frame = DataFrame(data)
#windows下運行,需要轉碼,系統默認是gbk,需要手動設置;注意:utf-8還是亂碼,得設置為utf-8-sig
frame.to_csv('data.csv', index=True,encoding='utf_8_sig')

4,利用簽名繪制詞雲

#4,繪制詞雲
#4.1 替換簽名中的emoji、span、class、類似<>/= 之類的符號等等
siglist = []
for i in friends:
    signature = i["Signature"].strip().replace("span","").replace("class","").replace("emoji","")
    rep = re.compile("1f\d+\w*|[<>/=]")
    signature = rep.sub("", signature)
    siglist.append(signature)
text = "".join(siglist)

#4.2 把結巴分詞這個包搞進來分詞
import jieba
wordlist = jieba.cut(text, cut_all=True)
word_space_split = " ".join(wordlist)

#4.3 進入畫圖階段,根據自己想要的圖片、形狀、顏色畫出相似的圖形
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
import PIL.Image as Image
coloring = np.array(Image.open("101.jpg"))
my_wordcloud = WordCloud(background_color="white", max_words=2000,
                         mask=coloring, max_font_size=60, random_state=42, scale=2,
                         font_path="STXINWEI.TTF").generate(word_space_split)

image_colors = ImageColorGenerator(coloring)
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()

5,ggplot圖形展示

#5, ggplot圖形展示
import matplotlib.pyplot as plt
#獲取csv內容
df = pd.read_csv('data.csv')
#配置圖
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist(df['Sex'], bins=7)
#標題
plt.title('Sex distribution')
#X軸標題
plt.xlabel('Sex')  
#Y軸標題
plt.ylabel('people')
plt.show()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM