日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

用 Python 分析了所有微信好友,发现了一个秘密...

發(fā)布時間:2023/12/14 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用 Python 分析了所有微信好友,发现了一个秘密... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方“何俊林”,馬上關(guān)注,每天早上8:50準時推送

真愛,請置頂或星標

Illustrations by?Evgenij Kungur?文/ Python攻城獅

最近研究了一下itchat和matplotlib,目前實現(xiàn)了對微信好友頭像、性別、區(qū)域、個性簽名的采集及展示。

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

1.微信登錄

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

import?itchatitchat.auto_login(hotReload=True) itchat.dump_login_status()
  • 好友信息獲取

we_friend?=?itchat.get_friends(update=True)[:]

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

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

有了key對應的值,我們就好處理了。

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?+=?1elif?sex?==?2:woman?+=?1else:other?+=?1

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

  • 繪制餅圖

man_ratio?=?int(man)/total?*?100 woman_ratio?=?int(woman)/total?*?100 other_ratio?=?int(other)/total?*?100plt.rcParams['font.sans-serif']?=?['SimHei']????#?用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']?=?False??#?用來正常顯示負號 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)#?繪制標題 plt.title('微信好友性別比例')????#?展示 plt.show() 微信好友性別比例

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


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

  • 準備好想要使用的中文字體,這里我用的是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.微信好友頭像

這里其實看過我之前文章的應該知道,其實頭像的拼接主要分為兩部分

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

import?osnum?=?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?=?0for?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?+=?1if?x?==?lines:??#?換行x?=?0y?+=?1image.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]?=?1elif?prov:prov_dict[prov]?+=?1if?city?and?city?not?in?city_dict.keys():city_dict[city]?=?1elif?city:city_dict[city]?+=?1

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

排序這里我用了Python的sorted()函數(shù),列表的每個元素都為二維元組,key參數(shù)傳入了一個lambda函數(shù),其x就代表列表里的每一個元素,然后分別利用索引返回元素內(nèi)的第一個和第二個元素,這就代表了sorted()函數(shù)利用哪一個元素進行排列。而reverse決定是正序還是倒序,默認為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']??#?用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']?=?False??#?用來正常顯示負號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)??#?橫坐軸標簽 for?x,?y?in?enumerate(prov_num):#?在柱子上方1.2處標注值plt.text(x,?y?+?1.2,?'%s'?%?y,?ha='center',?fontsize=10) plt.ylabel('省會好友人數(shù)')??#?設(shè)置縱坐標標簽 prov_title?=?'微信好友區(qū)域Top10' plt.title(prov_title)????#?設(shè)置標題 plt.savefig(desc_full?+?'/微信好友區(qū)域Top10')??#?保存圖片 微信好友區(qū)域Top10微信好友城市Top10

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

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

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

  • 分詞

sign_li?=?[] rule?=?re.compile("1fd+w*|[<>/=]")????#?定義正則規(guī)則 for?fri_info?in?we_friend[1:]:signature?=?fri_info['signature']if?signature:sign_deal?=?signature.replace(' ',?'').replace(' ',?'').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è)置圖片默認的大小,但是如果使用背景圖片的話,保存的圖片大小將會按照其大小保存,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() 好友簽名情感分析

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

本文完整源碼

長按掃描下方二維碼后回復"微信好友"獲取

End

說句題外話,有不少人想加魚哥微信,魚哥姑且放出來,但是坑位有限哦

?推薦閱讀

作為程序員,要保持工作和家庭平衡,就那么難么?

刷抖音上癮后,決定探究如果做一款類似抖音短視頻app

屌絲的眼淚,因為錯過的初戀,才搞清楚PNG圖片壓縮原理

我用Python爬了點你們需要的電影,這些電影真的很不錯~

喜歡就點個在看吧

總結(jié)

以上是生活随笔為你收集整理的用 Python 分析了所有微信好友,发现了一个秘密...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。