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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Python 使用itchat 获取微信好友信息并解析(性别 区域 头像 签名等)

發布時間:2023/12/18 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 使用itchat 获取微信好友信息并解析(性别 区域 头像 签名等) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • Itchat簡介
    • 1. 登錄 獲取好友信息
    • 2. 好友性別統計
    • 3. 好友省份統計
    • 4. 好友城市統計
    • 5. 好友頭像獲取
    • 6. 好友簽名分析
    • 總結

Itchat簡介

itchat官網:https://itchat.readthedocs.io/zh/latest/
itchat是一個開源的微信個人號接口
使用這個接口可以完成獲取微信好友信息,發送信息,接收信息等操作
借此可以開發個人的微信機器人。
(目前發送信息等功能好像已被官方禁止)
現在我們只是用最基本的獲取好友信息功能 來得到微信好友信息 并進行初步的分析統計


1. 登錄 獲取好友信息

首先當然是要安裝這個開源包

pip install itchat

只需要一條命令就可以進行微信的掃碼登錄

import itchat itchat.auto_login()

掃碼后便會提示登陸了網頁版微信 (ps: 新的微信賬號貌似已經不支持網頁版登陸了。。。)
登錄之后便可以通過下面這條命令獲取最新的好友信息

itchat.get_friends(update=True)

這里的update參數是代表是否重新獲取最新信息 如果是False那么就會使用緩存信息
為了清楚地了解其內部數據結構 我們這里會將好友信息保存在本地 (效果同update=False一樣)
代碼如下:

if os.path.exists('friends.json') is False:with open("friends.json",'w') as f: itchat.auto_login()friends = itchat.get_friends(update=True) json.dump(friends,f)print("save friends info.") else:with open('friends.json','r') as lf:friends = json.load(lf)print('load friends info.')

此時我們將好友信息保存到了friends.json
我們可以查看一下里面的信息存儲結構:

根據上圖我們可以對好友的城市、省份、簽名、性別、頭像等進行統計分析

2. 好友性別統計

sex 代表著好友的性別 1:男 2:女 當然不能排除其它情況。。。0.0

def sex_analysis(friends):labels = ['男', '女', '其他']data = [0, 0, 0]# friends[0] 是自己的信息for friend in friends[1:]:sex = friend["Sex"]if sex == 1:data[0] += 1elif sex == 2:data[1] += 1else:data[2] += 1labels = [labels[i]+':'+str(data[i]) for i in range(len(labels))]plt.title("微信好友性別比例")plt.pie(data, labels=labels,autopct="%.2f%%")plt.savefig("sex.jpg")plt.show()

我們可以使用matplotlib根據這個統計結果生成一個餅狀圖

3. 好友省份統計

我們將各省擁有的好友個數進行統計 并排序 取top10
這里會有特殊的空(’’)省份需要去除

def prov_analysis(friends):prov_dict = defaultdict(int)for friend in friends[1:]:prov = friend['Province']prov_dict[prov] +=1prov_dict.pop('')prov_top10 = sorted(prov_dict.items(),key=lambda x:x[1],reverse=True)[:10]prov_name = [x[0] for x in prov_top10]prov_num = [x[1] for x in prov_top10]plt.bar(prov_name,prov_num,width=0.5,align='center',color='#87CEFA')for i in range(len(prov_num)):x = prov_name[i]y = prov_num[i]plt.text(x,y+1,'%s'%y,fontsize=10,ha='center')plt.ylabel("好友數量")plt.xlabel("省")plt.title("各省好友分布 TOP10")plt.savefig("province.jpg")plt.show()

同樣將結果使用plt呈現

根據這個明顯的省份分布 幾乎可以斷定。。該微信號是個浙江人

4. 好友城市統計

這個和省份統計基本一致

def city_analysis(friends):city_dict = defaultdict(int)for friend in friends[1:]:city = friend['City']city_dict[city] +=1city_dict.pop('')city_top10 = sorted(city_dict.items(),key=lambda x:x[1],reverse=True)[:10]city_name = [x[0] for x in city_top10]city_num = [x[1] for x in city_top10]plt.bar(city_name,city_num,width=0.5,align='center',color='#87CEFA')for i in range(len(city_num)):x = city_name[i]y = city_num[i]plt.text(x,y+1,'%s'%y,fontsize=10,ha='center')plt.ylabel("好友數量")plt.xlabel("城市")plt.title("各城市好友分布 TOP10")plt.savefig("city.jpg")plt.show()


分析上圖:
該微信號在杭紹兩城市 出生/工作
并在成都生活過一段時間

5. 好友頭像獲取

這個功能好像沒什么能分析的。。。看看好友的頭像是否非主流。。
這里需要注意
從緩存的friends.json好友信息中可以獲取頭像地址
但是下載頭像是需要重新登陸的
我們在這里繼續進行緩存 將頭像保存在 photos/文件夾內
get_photo:下載好友頭像圖片
photo_merge: 拼接好友頭像 生成一張大圖

def get_photo(path):itchat.auto_login()friends = itchat.get_friends(update=True)[0:]num=0for i in friends:img = itchat.get_head_img(userName=i["UserName"])imgpath = path+str(num)+'.jpg'try:with open(imgpath,'wb') as imgf:imgf.write(img)except Exception as e:print("get err:",e)num+=1def photo_merge(friends):path='photos/' if os.path.exists(path) is False:os.mkdir(path)flist = os.listdir(path)if len(flist)==0:get_photo(path)flist = os.listdir(path)line = int(math.sqrt(len(flist)))each_size = int(640/line)image= Image.new('RGB',(line*each_size,int(len(flist)/line)*each_size))x,y=0,0poslist = list(range(len(flist)))random.shuffle(poslist)for i in flist:try:pos = poslist.pop()img = Image.open(path+str(pos)+'.jpg')except IOError as e:passelse:img = img.resize((each_size,each_size),Image.ANTIALIAS)image.paste(img,(x*each_size,y*each_size))x+=1if x==line:x=0y+=1image.save("frinds_photo.jpg")img = plt.imread("frinds_photo.jpg")plt.imshow(img)plt.axis('off')plt.show()

注意: 為了讓拼接的圖片沒有黑邊 更加的好看
我們在拼接圖片時會舍棄掉一些圖片
假設我們有num張照片 sqrt(num) 取整 = n
我們會拼接n x n 大小的圖片 整張圖片大小為640x640 可以自由設定
每位好友的頭像大小(640/n x 640/n)
結果如下圖:

看上去挺壯觀。。。。

6. 好友簽名分析

這里我們會用到中文分詞工具 jieba:https://github.com/fxsjy/jieba
我們將每一個好友簽名 去除停用詞 (這里只是初步手動去除 不全面)
拼接后 使用結巴進行分詞
統計分詞后詞組的出現頻率
使用詞云(wordcloud)https://github.com/amueller/word_cloud 將這些詞組展現出來
頻率越高 詞越大

def sig_analysis(friends):text = ''rule = re.compile("1fd+w*|[<>/=]")for fri in friends:sig = fri['Signature'].strip()if len(sig)>0 and not sig.startswith('<span'):sig = sig.replace("span",'').replace("class",'').replace("emoji","").replace("\n","").replace("00","")sig = rule.sub("",sig)text += sig + ' 'jiebatext = list(jieba.cut(text,cut_all=True))jiebatext = [x for x in jiebatext if len(x)>1]wordDic = dict(Counter(jiebatext))bgimg = plt.imread('bk.jpg')mywordcloud = wordcloud.WordCloud(font_path='jdxs.TTF',background_color="white",mask=bgimg,width=1200,height=1200)mywordcloud.generate_from_frequencies(wordDic)plt.imshow(mywordcloud)plt.axis("off")plt.show()mywordcloud.to_file("sigimg.png")

結果如下圖

總結

雖然只是獲取了最基礎的微信好友信息
但我們已經能夠從這些不起眼的數據中獲取到一些有用的信息
好友數量 好友性別比例 用戶生活城市等等
細思極恐0.0
那些并未開放 獲取不到的信息里 是否已經將我們展示地一覽無余

總結

以上是生活随笔為你收集整理的Python 使用itchat 获取微信好友信息并解析(性别 区域 头像 签名等)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。