「itchat」一個開源的微信個人介面,今天我們就用itchat爬取微信好友資訊,無圖言虛空
三張圖分別是「微信好友頭像拼接圖」、「性別統計圖」、「個性簽名統計圖」
「微信好友頭像拼接圖」
「性別統計圖」
「個性簽名統計圖」
安裝
pip3 install itchat
複製程式碼
主要用到的方法:
itchat.login()
微信掃描二維碼登入
itchat.get_friends()
返回完整的好友列表,每個好友為一個字典, 其中第一項為本人的賬號資訊,傳入update=True
, 將更新好友列表並返回, get_friends(update=True)
itchat.get_head_img(userName="")
根據userName
獲取好友頭像
微信好友頭像拼接圖
獲取好友資訊,get_head_img
拿到每個好友的頭像,儲存檔案,將頭像縮小拼接至一張大圖。
先獲取好友頭像:
def headImg():
itchat.login()
friends = itchat.get_friends(update=True)
# itchat.get_head_img() 獲取到頭像二進位制,並寫入檔案,儲存每張頭像
for count, f in enumerate(friends):
# 根據userName獲取頭像
img = itchat.get_head_img(userName=f["UserName"])
imgFile = open("img/" + str(count) + ".jpg", "wb")
imgFile.write(img)
imgFile.close()
複製程式碼
這裡需要提前在同目錄下新建了資料夾img
,否則會報No such file or directory
錯誤,img
用於儲存頭像圖片,遍歷好友列表,根據下標count
命名頭像,到這裡可以看到資料夾裡已經儲存了所有好友的頭像。
接下來就是對頭像進行拼接
遍歷資料夾的圖片,random.shuffle(imgs)
將圖片順序打亂
用640*640的大圖來平均分每一張頭像,計算出每張正方形小圖的長寬,壓縮頭像,拼接圖片,一行排滿,換行拼接,好友頭像多的話,可以適當增加大圖的面積,具體程式碼如下:
def createImg():
x = 0
y = 0
imgs = os.listdir("img")
random.shuffle(imgs)
# 建立640*640的圖片用於填充各小圖片
newImg = Image.new('RGBA', (640, 640))
# 以640*640來拼接圖片,math.sqrt()開平方根計算每張小圖片的寬高,
width = int(math.sqrt(640 * 640 / len(imgs)))
# 每行圖片數
numLine = int(640 / width)
for i in imgs:
img = Image.open("img/" + i)
# 縮小圖片
img = img.resize((width, width), Image.ANTIALIAS)
# 拼接圖片,一行排滿,換行拼接
newImg.paste(img, (x * width, y * width))
x += 1
if x >= numLine:
x = 0
y += 1
newImg.save("all.png")
複製程式碼
好友頭像圖成型,頭像是隨機打亂拼接的
性別統計圖
同樣itchat.login()
登入獲取好友資訊,根據Sex
欄位判斷性別,1 代表男性(man),2 代表女性(women),3 未知(unknown)
def getSex():
itchat.login()
friends = itchat.get_friends(update=True)
sex = dict()
for f in friends:
if f["Sex"] == 1: #男
sex["man"] = sex.get("man", 0) + 1
elif f["Sex"] == 2: #女
sex["women"] = sex.get("women", 0) + 1
else: #未知
sex["unknown"] = sex.get("unknown", 0) + 1
# 柱狀圖展示
for i, key in enumerate(sex):
plt.bar(key, sex[key])
plt.show()
複製程式碼
性別統計柱狀圖
個性簽名統計圖
獲取好友資訊,Signature
欄位是好友的簽名,將個性簽名儲存到.txt檔案,部分簽名裡有表情之類的會變成emoji 類的詞,將這些還有特殊符號的替換掉。
def getSignature():
itchat.login()
friends = itchat.get_friends(update=True)
file = open('sign.txt', 'a', encoding='utf-8')
for f in friends:
signature = f["Signature"].strip().replace("emoji", "").replace("span", "").replace("class", "")
# 正則匹配
rec = re.compile("1f\d+\w*|[<>/=]")
signature = rec.sub("", signature)
file.write(signature + "\n")
複製程式碼
sign.txt
檔案裡寫入了所有好友的個性簽名,使用wordcloud包生成詞雲圖,pip install wordcloud
同樣可以採用jieba
分詞生成詞圖,不使用分詞的話就是句子展示,使用jieba
分詞的話可以適當把max_font_size
屬性調大,比如100。
需要注意的是執行不要在虛擬環境下,deactivate
退出虛擬環境再跑,詳細程式碼如下:
# 生成詞雲圖
def create_word_cloud(filename):
# 讀取檔案內容
text = open("{}.txt".format(filename), encoding='utf-8').read()
# 註釋部分採用結巴分詞
# wordlist = jieba.cut(text, cut_all=True)
# wl = " ".join(wordlist)
# 設定詞雲
wc = WordCloud(
# 設定背景顏色
background_color="white",
# 設定最大顯示的詞雲數
max_words=2000,
# 這種字型都在電腦字型中,window在C:\Windows\Fonts\下,mac下可選/System/Library/Fonts/PingFang.ttc 字型
font_path='C:\\Windows\\Fonts\\simfang.ttf',
height=500,
width=500,
# 設定字型最大值
max_font_size=60,
# 設定有多少種隨機生成狀態,即有多少種配色方案
random_state=30,
)
myword = wc.generate(text) # 生成詞雲 如果用結巴分詞的話,使用wl 取代 text, 生成詞雲圖
# 展示詞雲圖
plt.imshow(myword)
plt.axis("off")
plt.show()
wc.to_file('signature.png') # 把詞雲儲存下
複製程式碼
句子圖
使用jieba
分詞產生的詞雲圖
看來,「努力」 「生活」 還是很重要的
itchat 除了以上的資訊,還有省市區等等資訊都可以抓取,另外還可以實現機器人自動聊天等功能,這裡就不一一概述了。
最後附上github地址:github.com/taixiang/it…
歡迎關注我的部落格:blog.manjiexiang.cn/
歡迎關注微訊號:春風十里不如認識你