手把手教你用itchat統(tǒng)計好友信息,了解一下曹仗?

初學(xué)Python的時候榨汤,就寫過一篇利用Python的第三方庫進行好友頭像拼接,itchat itchat庫初探--微信好友全頭像的拼接怎茫,最近又研究了下itchat和matplotlib收壕,目前實現(xiàn)了對微信好友頭像、性別轨蛤、區(qū)域蜜宪、個性簽名的采集及展示。

本文就來詳細(xì)介紹一下這個庫的用法和一些核心邏輯實現(xiàn)祥山。

1.微信登錄

  • 三行代碼實現(xiàn)登錄圃验,為了避免我們頻繁掃描二維碼登錄,這里我們加入hotReload=True
import itchat

itchat.auto_login(hotReload=True)
itchat.dump_login_status()
  • 好友信息獲取
we_friend = itchat.get_friends(update=True)[:]

這里的we_friend是好友的信息的列表缝呕,每一個好友字典的 key 如下表

key 備注
UserName 微信系統(tǒng)內(nèi)的用戶編碼標(biāo)識
NickName 好友昵稱
Sex 性別
Province 省份
City 城市
HeadImgUrl 微信系統(tǒng)內(nèi)的頭像URL
RemarkName 好友的備注名
Signature 個性簽名

有了key對應(yīng)的值澳窑,我們就好處理了。

2.好友性別

這里順便提一下:如果sex=1則代表男性供常,sex=2代表女性

total = len(we_friend[1:])
for fri_info in we_friend[1:]:
    sex = fri_info['sex']
    # 如果sex=1 代表男性 sex=2代表女性
    if sex == 1:
        man += 1
    elif sex == 2:
        woman += 1
    else:
        other += 1

統(tǒng)計出男生摊聋、女生的以及總?cè)藬?shù)后,占比自然而然就出來了栈暇,為了更好的展示男女比例麻裁,我們以餅圖展示。

  • 繪制餅圖
man_ratio = int(man)/total * 100
woman_ratio = int(woman)/total * 100
other_ratio = int(other)/total * 100

plt.rcParams['font.sans-serif'] = ['SimHei']    # 用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負(fù)號
plt.figure(figsize=(5, 5))  # 繪制的圖片為正圓
sex_li = ['男', '女', '其他']
radius = [0.01, 0.01, 0.01]  # 設(shè)定各項距離圓心n個半徑
colors = ['red', 'yellowgreen', 'lightskyblue']
proportion = [man_ratio, woman_ratio, other_ratio]

plt.pie(proportion, explode=radius, labels=sex_li, colors=colors, autopct='%.2f%%')   # 繪制餅圖

# 加入圖例 loc =  'upper right' 位于右上角 bbox_to_anchor=[0.5, 0.5] # 外邊距 上邊 右邊 borderaxespad = 0.3圖例的內(nèi)邊距
plt.legend(loc="upper right", fontsize=10, bbox_to_anchor=(1.1, 1.1), borderaxespad=0.3)

# 繪制標(biāo)題
plt.title('微信好友性別比例')    

# 展示
plt.show()
微信好友性別比例

作為一個碼農(nóng)源祈、程序猿煎源,還能有這么多女性好友實屬不易啊。敏感的我香缺,看了這個比例深深地感覺到了不安手销,(此圖女朋友不可見)另外,怎么還有一些未知生物的存在...


友情提醒:matplotlib中文亂碼這個問題一直存在赫悄,這里記錄下如何解決matplotlib中文亂碼

  • 準(zhǔn)備好想要使用的中文字體原献,這里我用的是SimHei馏慨,附下載地址:中文字體下載
  • 找到matplotlib的文件位置
import matplotlib
print(matplotlib.matplotlib_fname())    # 查看路徑
  • 進入上方打印的路徑

  • 把剛才下載的字體文件解壓放入/usr/local/lib/python3.5/dist-packages/matplotlib/mpl-data/fonts/ttf 目錄

  • 返回上級目錄埂淮,修改matplotlibrc文件,取消相關(guān)注釋写隶,并在font.serif加入剛才下載的字體

font.family        : sans-serif
font.serif         : SimHei, DejaVu Serif, Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
  • 刪除matplotlib緩存倔撞。
在terminal中:cd ~/.cache/matplotlib

把.cache下面的matplotlib文件夾刪除。

$ rm -rf matplotlib

3.微信好友頭像

這里其實看過我之前文章的應(yīng)該知道慕趴,其實頭像的拼接主要分為兩部分

  • 1.采集所有好友頭像保存本地痪蝇,
import os

num = 0
pwd_path = os.path.abspath(os.path.dirname(os.getcwd()))
desc_photos = os.path.join(pwd_path, 'res/photos')
for i in friends:
    img = itchat.get_head_img(userName=i["UserName"])
    file_image = open(desc_photos + "/" + str(num) + ".jpg", 'wb')
    file_image.write(img)
    file_image.close()
    num += 1
  • 2.對所有頭像進行拼接
ls = os.listdir(desc_photos)
each_size = int(math.sqrt(float(640 * 640) / len(ls)))  # 算出每張圖片的大小多少合適
lines = int(640 / each_size)
image = Image.new('RGBA', (640, 640))   # 創(chuàng)建640*640px的大圖
x = 0
y = 0

for i in range(0, len(ls) + 1):
    try:
        img = Image.open(desc_photos + "/" + str(i) + ".jpg")
    except IOError:
        print("Error")
    else:
        img = img.resize((each_size, each_size), Image.ANTIALIAS)
        image.paste(img, (x * each_size, y * each_size))    # 粘貼位置
        x += 1
        if x == lines:  # 換行
              x = 0
              y += 1

image.save(desc_full + "/好友頭像拼接圖.jpg")

密集恐懼癥患者請忽略!!!

好友頭像拼接

4.微信好友地區(qū)分布

-- 獲取區(qū)域及城市

prov_dict, city_dict = {}, {}
for fri_info in we_friend[1:]:
    prov = fri_info['province']
    city = fri_info['city']
    if prov and prov not in prov_dict.keys():
        prov_dict[prov] = 1
    elif prov:
        prov_dict[prov] += 1
    if city and city not in city_dict.keys():
        city_dict[city] = 1
    elif city:
        city_dict[city] += 1

由于城市太多鄙陡,我們?nèi)『糜褦?shù)量排名前十的城市及區(qū)域進行展示,感興趣的可以稍微改下代碼躏啰,就可以展示所有區(qū)域人數(shù)趁矾。

排序這里我用了Python的sorted()函數(shù),列表的每個元素都為二維元組给僵,key參數(shù)傳入了一個lambda函數(shù)毫捣,其x就代表列表里的每一個元素,然后分別利用索引返回元素內(nèi)的第一個和第二個元素帝际,這就代表了sorted()函數(shù)利用哪一個元素進行排列蔓同。而reverse決定是正序還是倒序,默認(rèn)為False蹲诀。

# 區(qū)域Top10
prov_dict_top10 = sorted(prov_dict.items(), key=lambda x: x[1], reverse=True)[0:10]
# 城市Top10
city_dict_top10 = sorted(city_dict.items(), key=lambda y: y[1], reverse=True)[0:10]
  • 區(qū)域斑粱、城市柱形圖展示,由于思路代碼是一致的脯爪,所以這里只展示區(qū)域的代碼
prov_nm, prov_num = [], []  # 省會名 + 數(shù)量
for prov_data in prov_dict_top10:
    prov_nm.append(prov_data[0])
    prov_num.append(prov_data[1])

pwd_path = os.path.abspath(os.path.dirname(os.getcwd()))
desc_full = os.path.join(pwd_path, 'res')
colors = ['#00FFFF', '#7FFFD4', '#F08080', '#90EE90', '#AFEEEE',
          '#98FB98', '#B0E0E6', '#00FF7F', '#FFFF00', '#9ACD32']
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負(fù)號

index = range(len(prov_num))
plt.bar(index, prov_num, color=colors, width=0.5, align='center')

plt.xticks(range(len(prov_nm)), prov_nm)  # 橫坐軸標(biāo)簽
for x, y in enumerate(prov_num):
    # 在柱子上方1.2處標(biāo)注值
    plt.text(x, y + 1.2, '%s' % y, ha='center', fontsize=10)
plt.ylabel('省會好友人數(shù)')  # 設(shè)置縱坐標(biāo)標(biāo)簽
prov_title = '微信好友區(qū)域Top10'
plt.title(prov_title)    # 設(shè)置標(biāo)題
plt.savefig(desc_full + '/微信好友區(qū)域Top10')  # 保存圖片
微信好友區(qū)域Top10
微信好友城市Top10

通過柱形圖展示则北,可以清晰看到我的好友主要分布在河南和上海,借此不難推測出我的工作地址以及戶籍所在地痕慢。

5.微信好友個性簽名情感分析及詞云圖展示

這里使用了常用的中文分詞庫jieba咒锻,詞云圖的背景采用了萌萌大小豬佩奇(′??_??)

  • 分詞
sign_li = []
rule = re.compile("1f\d+\w*|[<>/=]")    # 定義正則規(guī)則
for fri_info in we_friend[1:]:
    signature = fri_info['signature']
    if signature:
        sign_deal = signature.replace('\n', '').replace('\t', '').replace(' ', '')\
            .replace("span", "").replace("class", "").replace("emoji", "")
        sign = rule.sub("", sign_deal)
        sign_li.append(sign)
  • 制作詞云圖
pwd_path = os.path.abspath(os.path.dirname(os.getcwd()))
conf_path = os.path.join(pwd_path, 'conf/')
comment_txt = ''
back_img = plt.imread(conf_path + '/peiqi.jpg')
cloud = WordCloud(font_path=conf_path + '/simhei.ttf',  # 若是有中文的話,這句代碼必須添加守屉,不然會出現(xiàn)方框惑艇,不出現(xiàn)漢字
                  background_color="white",  # 背景顏色
                  max_words=5000,  # 詞云顯示的最大詞數(shù)
                  mask=back_img,  # 設(shè)置背景圖片
                  max_font_size=100,  # 字體最大值
                  random_state=42,
                  width=360, height=591, margin=2,  # 設(shè)置圖片默認(rèn)的大小,但是如果使用背景圖片的話,保存的圖片大小將會按照其大小保存,margin為詞語邊緣距離
                  )
for li in comment:
    comment_txt += ' '.join(jieba.cut(li, cut_all=False))
wc = cloud.generate(comment_txt)
image_colors = ImageColorGenerator(back_img)
plt.figure("wordc")
plt.imshow(wc.recolor(color_func=image_colors))
wc.to_file(res_full + '好友個性簽名詞云圖.png')
好友個性簽名詞云圖

最初,只想做一個簡單的詞云圖拇泛,但是看到這個詞云圖中夢想滨巴、努力、專注俺叭、尊重恭取、希望這個幾個詞以后,感覺到我的好友生活態(tài)度還是蠻積極向上的熄守,就想不如再做一個簡單的情感分析蜈垮,說干就干。

sentimentslist = []
for li in comment:
    if len(li) > 0:
        s = SnowNLP(li)
        print(li, s.sentiments)
        sentimentslist.append(s.sentiments)
fig1 = plt.figure("sentiment")
plt.hist(sentimentslist, bins=np.arange(0, 1, 0.02))
plt.savefig(res_full + '好友簽名情感分析')
plt.show()
好友簽名情感分析

從圖中可以看出裕照,正向情感要遠遠多于負(fù)向情感的數(shù)據(jù)攒发,積極樂觀的人往往都在一個圈子,果然是物以類聚晋南,人以群分啊惠猿。

完整代碼以上傳Github,期待您的Star负间。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偶妖,一起剝皮案震驚了整個濱河市姜凄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趾访,老刑警劉巖态秧,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扼鞋,居然都是意外死亡屿聋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門藏鹊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來润讥,“玉大人,你說我怎么就攤上這事盘寡〕睿” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵竿痰,是天一觀的道長脆粥。 經(jīng)常有香客問我,道長影涉,這世上最難降的妖魔是什么变隔? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蟹倾,結(jié)果婚禮上匣缘,老公的妹妹穿的比我還像新娘。我一直安慰自己鲜棠,他們只是感情好肌厨,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豁陆,像睡著了一般柑爸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盒音,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天表鳍,我揣著相機與錄音,去河邊找鬼祥诽。 笑死譬圣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的原押。 我是一名探鬼主播胁镐,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诸衔!你這毒婦竟也來了盯漂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤笨农,失蹤者是張志新(化名)和其女友劉穎就缆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谒亦,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡竭宰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了份招。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片切揭。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锁摔,靈堂內(nèi)的尸體忽然破棺而出廓旬,到底是詐尸還是另有隱情,我是刑警寧澤谐腰,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布孕豹,位于F島的核電站,受9級特大地震影響十气,放射性物質(zhì)發(fā)生泄漏励背。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一砸西、第九天 我趴在偏房一處隱蔽的房頂上張望叶眉。 院中可真熱鬧,春花似錦芹枷、人聲如沸竟闪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炼蛤。三九已至,卻和暖如春蝶涩,著一層夾襖步出監(jiān)牢的瞬間理朋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工绿聘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嗽上,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓熄攘,卻偏偏與公主長得像兽愤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容