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()