用Python爬了一下我的微信好友,我開(kāi)始懷疑人生了···

最近留意到Python語(yǔ)言中有一個(gè)非常好玩的庫(kù):itchat,基于web 微信的開(kāi)放api做成的集成庫(kù),它:

是一個(gè)開(kāi)源的微信個(gè)人號(hào)接口,使用python調(diào)用微信從未如此簡(jiǎn)單。使用不到三十行的代碼,你就可以完成一個(gè)能夠處理所有信息的微信機(jī)器人。當(dāng)然,該api的使用遠(yuǎn)不止一個(gè)機(jī)器人,更多的功能等著你來(lái)發(fā)現(xiàn),比如實(shí)現(xiàn)微信自動(dòng)回復(fù),個(gè)人微信社交網(wǎng)絡(luò)屬性的數(shù)據(jù)分析。該接口與公眾號(hào)接口itchatmp共享類似的操作方式,學(xué)習(xí)一次掌握兩個(gè)工具。

目前此接口開(kāi)源于GitHub,傳送門(mén)在此。

本文簡(jiǎn)單的介紹了基于itchat,運(yùn)行一個(gè)簡(jiǎn)單的爬蟲(chóng)程序,來(lái)對(duì)我個(gè)人的朋友圈進(jìn)行地毯式偷窺,并試圖從我的朋友圈中挖出幾個(gè)變態(tài)。

環(huán)境

本實(shí)驗(yàn)基于Python3.5,IDE工具PyCharm,并依賴以下庫(kù):

  • itchat,一套開(kāi)源的微信號(hào)接口;
  • jieba, 分詞工具,用于將抓取到的個(gè)人簽名分詞,方便做高頻詞統(tǒng)計(jì);
  • wordcloud,詞云工具,可以將高頻詞做成詞云圖形;
  • numpy,數(shù)據(jù)圖表快速生成工具

以上庫(kù)均可以通過(guò)pip方式快速安裝,如:

pip install itchat

代碼

首先先把核心代碼放上來(lái):

#導(dǎo)入itchat包
import itchat

#獲取個(gè)人微信號(hào)好友信息
if __name__=="__main__":
    #登錄個(gè)人微信,掃碼登錄
    itchat.login()
    #爬取自己好友相關(guān)信息
    friends=itchat.get_friends(update=False)[0:]
    #設(shè)置需要爬取的信息字段
    result=[('RemarkName','備注'),('NickName','微信昵稱'),('Sex','性別'),('City','城市'),('Province','省份'),('ContactFlag','聯(lián)系標(biāo)識(shí)'),('UserName','用戶名'),('SnsFlag','渠道標(biāo)識(shí)'),('Signature','個(gè)性簽名')]
    for user in friends:
        with open('myFriends.txt','a',encoding='utf8') as fh:
            fh.write("-----------------------\n")
        for r in result:
            with open('myFriends.txt','a',encoding='utf8') as fh:
                fh.write(r[1]+":"+str(user.get(r[0]))+"\n")
    print("完成")

以上是本次實(shí)驗(yàn)的核心模塊,其作用是把個(gè)人微信號(hào)中的所有好友的昵稱、備注、個(gè)性簽名、性別、城市等等抓取下來(lái),并存成txt文件。

在程序運(yùn)行過(guò)程中,會(huì)彈出一個(gè)二維碼,需要掃碼登錄你的微信號(hào),然后就會(huì)開(kāi)始爬去這個(gè)號(hào)的朋友圈;

在此基礎(chǔ)上我們可以對(duì)這些數(shù)據(jù)動(dòng)刀子了:

import jieba
wordlist_jieba = jieba.cut(text, cut_all=True)
wl_space_split = " ".join(wordlist_jieba)
# wordcloud詞云
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import os
import numpy as np
import PIL.Image as Image
d= os.path.dirname(__file__)
alice_coloring = np.array(Image.open(os.path.join(d, "wechat.jpg")))
my_wordcloud = WordCloud(background_color="white", max_words=2000,mask=alice_coloring,max_font_size=40, random_state=42,font_path='/Users/sebastian/Library/Fonts/Arial Unicode.ttf').generate(wl_space_split)
image_colors = ImageColorGenerator(alice_coloring)
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
# 保存圖片 并發(fā)送到手機(jī)
my_wordcloud.to_file(os.path.join(d, "wechat_cloud.png"))
itchat.send_image("wechat_cloud.png", 'filehelper')

出來(lái)的效果圖如下:


嗯。。??吹轿业奈⑿藕糜讯歼@么正能量我就放心了····

其實(shí)基于這個(gè)接口我們可以統(tǒng)計(jì)到更多的數(shù)據(jù),比如統(tǒng)計(jì)一下我微信里面的男女比例:

import itchat
itchat.login()
friends = itchat.get_friends(update=True)[0:]
# 初始化計(jì)數(shù)器,有男有女
male = female = other = 0
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 (u"男:%.2f%%" % (float(male) / total * 100))
print (u"女:%.2f%%" % (float(female) / total * 100))
print (u"其他:%.2f%%" % (float(other) / total * 100))

最終打印出來(lái)的結(jié)果是:

男:45.23%
女:51.12%
其他:3.65%

我也不知道為什么我的微信里面妹子比較多···

但是我知道里面其實(shí)有很多大雕萌妹就對(duì)了····

更多玩法

我們可以設(shè)一些自動(dòng)回復(fù):

import itchat  
 
 
@itchat.msg_register(itchat.content.TEXT)  
def text_reply(msg):  
    message = msg['Text']  
    replay = u'Sir, 對(duì)方暫時(shí)無(wú)法進(jìn)行交流'  
    if u'在干嘛' in message:  
        replay = u'sorry,你所聯(lián)系的人正在思考人生不方便回你信息'  
    elif u'生氣' in message:  
        replay = u'忙完給你買好吃的吶(づ ̄3 ̄)づ'  
    elif u'好吧' in message:  
        replay = u'乖~'  
    return replay  
  #以上是一些例子,可以依樣多弄幾個(gè)判斷條件來(lái)實(shí)現(xiàn)更多很黃很暴力的聊天內(nèi)容
  
itchat.auto_login()  
itchat.run() 

還可以看看我的好友都來(lái)自哪里:

#這里省略了掃碼登錄和將抓取到的數(shù)據(jù)存到本地文件的代碼,如果忘記了,
可以查看上方代碼示例

Province = df_friends.Province
Province_count = Province.value_counts()
Province_count = Province_count[Province_count.index!=''] 
#有一些好友地理信息為空,過(guò)濾掉這一部分人。

統(tǒng)計(jì)結(jié)果完成后,我發(fā)現(xiàn)我的好友大多來(lái)自廣東(廢話,我是廣東人),上海和北京(我是用工作微信號(hào)做測(cè)試的,估計(jì)這部分好友都是客戶爸爸2333)

然后來(lái)看看,我那些來(lái)自廣東的好友們,都是哪個(gè)城市比較多:

City = df_friends.City #[(df_friends.Province=='廣東')]
City_count = City.value_counts()
pinrt '主要來(lái)自這些城市:%s(%d)、%s(%d)、%s(%d)、%s(%d)、%s(%d)和%s(%d)。'[(City_count[0],City_count.index[1],City_count[1],City_count.index[2],City_count[2],City_count.index[3],City_count[3],City_count.index[4],City_count[4],City_count.index[5],City_count[5]))']

最終打印出來(lái)的結(jié)果顯示,廣東的好友們最多來(lái)自于:

  1. 廣州:工作號(hào)加了一大堆廣州的同事,很合理;
  2. 云?。豪霞?,很正常;
  3. 深圳:加了一堆深圳分部的同事,以及一些大學(xué)的同學(xué)?
  4. 佛山:??????
  5. 湛江:·····不想說(shuō)話

懷疑人生,懷疑人生····

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容