前言
今天看到一篇好玩的文章,可以實現微信的內容爬取和聊天機器人的制作,所以嘗試着實現一遍,本文記錄了實現過程和一些探索的內容
來源: 痴海 鏈接:
https://mp.weixin.qq.com/s/oHc5bXKGMOTnb79XD8lKjQ
itchat安裝
對微信的控制可以使用itchat來實現,我們找到itchart的官網下查看相關幫助:http://itchat.readthedocs.io/zh/latest/
我這里使用的是Python2.7,所以直接按照說明pip 安裝itchat即可

1.實現給文件助手發消息
安裝itchat后,使用如下的代碼,即可給文件助手發一條消息,登陸時同樣使用掃碼登陸
import itchat
itchat.auto_login()
itchat.send('Hello, filehelper', toUserName='filehelper')
自回復消息
按照幫助說明,使用如下的示例代碼可以實現消息的自動回復
import itchat
@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
return msg.text
itchat.auto_login()
itchat.run()
用老婆大人的號測試了一下,可以實現信息的發送和直接回復
需要注意的是,使用同一個微信給自己發消息不起作用
這里為了方便多次運行,可以設置hotReload=True 變量,從而記錄登陸的賬號
itchat.auto_login(hotReload=True)
2.微信聊天機器人制作
官網教程還有微信機器人,所以照着教程做了一遍。試用后,發現圖靈機器人的智商捉雞,而且比較凶悍
# -*- coding: utf-8 -*-
import requests
import itchat
KEY = '71f28bf79c820df10d39b4074345ef8c'
def get_response(msg):
# 這里我們就像在“3. 實現最簡單的與圖靈機器人的交互”中做的一樣
# 構造了要發送給服務器的數據
apiUrl = 'http://www.tuling123.com/openapi/api'
data = {
'key' : KEY,
'info' : msg,
'userid' : 'wechat-robot',
}
try:
r = requests.post(apiUrl, data=data).json()
# 字典的get方法在字典沒有'text'值的時候會返回None而不會拋出異常
return r.get('text')
# 為了防止服務器沒有正常響應導致程序異常退出,這里用try-except捕獲了異常
# 如果服務器沒能正常交互(返回非json或無法連接),那么就會進入下面的return
except:
# 將會返回一個None
return
# 這里是我們在“1. 實現微信消息的獲取”中已經用到過的同樣的注冊方法
@itchat.msg_register(itchat.content.TEXT)
def tuling_reply(msg):
# 為了保證在圖靈Key出現問題的時候仍舊可以回復,這里設置一個默認回復
defaultReply = 'I received: ' + msg['Text']
# 如果圖靈Key出現問題,那么reply將會是None
reply = get_response(msg['Text'])
# a or b的意思是,如果a有內容,那么返回a,否則返回b
# 有內容一般就是指非空或者非None,你可以用`if a: print('True')`來測試
return reply or defaultReply
# 為了讓實驗過程更加方便(修改程序不用多次掃碼),我們使用熱啟動
itchat.auto_login(hotReload=True)
itchat.run()
下面是我的實際測試截圖

3.爬取一個好友
機器人是官網的教程,微信文章中使用的是對好友數據分布的統計,所以我先嘗試實現爬取一個好友的功能
3.1 獲取一個好友信息
# -*- coding: utf-8 -*-
import itchat
itchat.auto_login(hotReload=True)
#爬取自己好友相關信息, 返回一個json文件
friends = itchat.search_friends(name='Elton')
print friends
可以看到拿到的數據是一個List

3.2 打印數據到文件中
通過open函數,可以將獲取到的數據寫入到txt中去
# -*- coding: utf-8 -*-
import itchat
itchat.auto_login(hotReload=True)
#爬取自己好友相關信息, 返回一個json文件
friends = itchat.search_friends(name='Elton')
f = open("out.txt", "w")
print >> f, friends
f.close()
3.3 安裝畫圖軟件
為了把統計出來的柱狀圖繪制出來,安裝matplotlib的庫

至此,基本上准備條件已經完成
4. 爬取所有好友數據
爬取好友的功能如下,通過將爬取的數據存儲到字典中,對性別做統計處理,可以獲取總人數和性別分類的數量
def parse_friedns():
text = dict()
friedns = itchat.get_friends(update=True)[0:]
#(friedns)
male = "male"
female = "female"
other = "other"
for i in friedns[1:]:
sex = i['Sex']
if sex == 1:
text[male] = text.get(male, 0) + 1
elif sex == 2:
text[female] = text.get(female, 0) + 1
else:
text[other] = text.get(other, 0) + 1
total = len(friedns[1:])
print('好友數量:%.2f'%total)
print("男性好友: %.2f%%" % (float(text[male]) / total * 100) + "\n" +
"女性好友: %.2f%%" % (float(text[female]) / total * 100) + "\n" +
"不明性別好友: %.2f%%" % (float(text[other]) / total * 100))
draw_plot(text,u'朋友圈男女比例_')
使用了plt函數來繪制曲線
# 繪制柱狀圖
def draw_plot(datas,tag=''):
for key in datas.keys():
plt.bar(key, datas[key])
plt.legend()
plt.xlabel('sex')
plt.ylabel('rate')
plt.title("Gender of Alfred's friends")
if tag=='':
plt.savefig(OUTPUT+USER_NAME+'_'+u'柱狀圖.png')
else:
plt.savefig(OUTPUT+USER_NAME+'_'+tag+u'柱狀圖.png')
運行程序,爬取所有的好友數據,發現我好友一共515位,其中男性的好友占據了73%,男女比例差異有點大....

好友個性簽名詞雲
通過使用get_friends可以爬取微信的好朋友數據,存儲在'signature.txt'文件中
def parse_signature():
siglist = []
SIGNATURE_PATH='signature.txt'
friedns = itchat.get_friends(update=True)[1:]
for i in friedns:
signature = i["Signature"].strip().replace("span", "").replace("class", "").replace("emoji", "")
rep = re.compile("1f\d+\w*|[<>/=]")
signature = rep.sub("", signature)
siglist.append(signature)
text = "".join(siglist)
with io.open(SIGNATURE_PATH, 'w', encoding='utf-8') as f:
wordlist = jieba.cut(text, cut_all=True)
word_space_split = " ".join(wordlist)
f.write(word_space_split)
f.close()
draw_wordcloud(SIGNATURE_PATH,tag=u'朋友圈簽名')
通過對文件的解析,可以將詞雲繪制出來
#繪制詞雲
def draw_wordcloud(path,tag=''):
f = open(path,'r').read()
cut_text="".join(jieba.cut(f))
coloring = np.array(Image.open('.\\Pic\\wechat.jpg'))
wordcloud = WordCloud(font_path='./font/simhei.ttf',background_color="white",max_words=2000,mask=coloring, scale=2).generate(cut_text)
image_colors = ImageColorGenerator(coloring)
#plt.imshow(wordcloud.recolor(color_func=image_colors))
plt.imshow(wordcloud)
plt.axis("off")
if tag=='':
wordcloud.to_file(OUTPUT+USER_NAME+'_'+u'詞雲.png')
else:
wordcloud.to_file(OUTPUT+USER_NAME+'_'+tag+u'詞雲.png')
下圖是解析出來的詞雲,可以看到朋友圈的人大部分還是以自己努力生活為目標~

同理,我也爬取了一下朋友圈的城市分布,發現大部分的人都在北京,還有上過學的哈爾濱,南京的同事~

結論
微信還有很多很好玩的信息可以提取,等下一篇有時間可以繼續優化這段代碼,github地址如下:
https://github.com/ablo120/PythonLearn.git
附錄
import itchat
導入爬取微信記錄的包
import re
導入python中的正則表達式(re模塊)
import io
導入文件讀取的包
import matplotlib.pyplot as plt
導入柱狀圖繪制的包
import jieba
jieba(結巴)是一個強大的分詞庫,完美支持中文分詞
