有讀者叫樹根有空就要多更新公眾號(hào),樹根也在想要不要轉(zhuǎn)型,畢竟最近在自學(xué)Python。但是不管怎么樣,我都想把自己學(xué)到的覺得最有意思的,用自己的方式去呈現(xiàn)給大家看。
今天想給大家的文文是關(guān)于怎么用Python爬一爬自己的微信,本文是這個(gè)系列的第一篇。因?yàn)镻ython關(guān)于微信的工具庫itchat有很多好玩的功能,比如自動(dòng)回復(fù)和查看撤回消息等等,其他功能樹根會(huì)慢慢摸索,在日后會(huì)繼續(xù)教大家怎么用Python玩轉(zhuǎn)微信。
樹根會(huì)以自己的微信作為白老鼠,來展示給大家看。想自己動(dòng)手試試的讀者也可以自己用Python試試。
”itchat“是由@LittleCoder開發(fā)的,當(dāng)然Python關(guān)于微信的庫有很多,只是”itchat“較為簡(jiǎn)單和方便。接下來的文章內(nèi)容都是基于這個(gè)庫。
接下來,就是樹根微信大揭秘時(shí)間了
樹根已經(jīng)默認(rèn)大家安裝好Python了,還沒安裝的請(qǐng)看上一篇文文《回憶or寄望,制作一份屬于自己的云圖詞》。所有第一步肯定就是工具庫的安裝。打開cmd命令窗口,或者Anaconda Prompt,依次輸入以下命令安裝相關(guān)的工具庫:
pip install itchat
pip install pyecharts
然后我們?cè)赑ython中導(dǎo)入所需的工具庫:
#微信工具庫
import itchat
#畫圖的庫,Bar柱狀圖,Pie餅圖,Map地圖
from pyecharts import Pie,Map,Bar
#數(shù)據(jù)庫
import pymysql
然后我們可以執(zhí)行以下代碼登錄微信以及檢驗(yàn)是否登錄成功:
itchat.login()#生成二維碼,掃描登錄微信
itchat.send('樹根雖然長(zhǎng)得丑,但是很溫柔','filehelper')
執(zhí)行代碼以后會(huì)生成一個(gè)二維碼,用手機(jī)微信掃描以后就可以登錄微信了。然后第二行代碼是發(fā)送“'樹根雖然長(zhǎng)得丑,但是很溫柔'”到文件傳輸助手,那個(gè)“filehelper”就是文件傳輸助手。
我們來看看是否成功:
太好了,看到這里就證明是成功了,可以進(jìn)行接下來的事(什么,說我瞎說什么大實(shí)話???)。
統(tǒng)計(jì)微信男女好友比例并可視化
要統(tǒng)計(jì)微信好友的男女比例,首先當(dāng)然要獲取所有微信好友的數(shù)據(jù),itchat提供了get_friends這個(gè)方法來獲取好友的所有信息,我們直接看代碼:
#保持登錄
itchat.auto_login(hotReload=True)
itchat.dump_login_status()
#獲取好友信息
friends = itchat.get_friends(update=True)[:]
#總好友數(shù),減去自己
total = len(friends)-1
#爬取的各個(gè)參數(shù)
result=[('RemarkName','備注'),('NickName','微信昵稱'),
('Sex','性別'),('City','城市'),('Province','省份'),
('UserName','用戶名'),('Signature','個(gè)性簽名')]
every = []
for user in friends:
everys = {}
everys['remarkname'] = user.get('RemarkName')
everys['city'] = user.get('City')
everys['nickName'] = user.get('NickName')
everys['sex'] = user.get('Sex')
everys['province'] = user.get('Province')
everys['userName'] = user.get('UserName')
everys['signature'] = user.get('Signature')
every.append(everys)
for we in every:
remarkname = we['remarkname']
city = we['city']
nickName = we['nickName']
sex = we['sex']
province = we['province']
userName = we['userName']
signature = we['signature']
connection = pymysql.connect(
host='192.168.31.40', # 連接的是本地?cái)?shù)據(jù)庫,你自己的IP
user='acer', # mysql用戶名,自行輸入
passwd='*****', # 密碼,自行輸入
db='*****', # 數(shù)據(jù)庫的名字
charset='utf8mb4', # 默認(rèn)的編碼方式:
cursorclass=pymysql.cursors.DictCursor)
with connection.cursor() as cursor:
# 創(chuàng)建更新值的sql語句
sql = 'INSERT INTO wechat(remarkname,nickName,userName,sex,province,city,signature) VALUES (%s,%s,%s,%s,%s,%s,%s)'
cursor.execute(sql,(remarkname,nickName,userName,sex,province,city,signature))
# 提交本次插入的記錄
connection.commit()
connection.close()
print ('完成')
我們來看一下是否爬取成功:
以下是Python變量區(qū)的friends變量:
來對(duì)比一下樹根的微信好友個(gè)數(shù):
太好了,看到這里就證明又是成功了。
我們來執(zhí)行以下代碼print一下男女比例結(jié)果:
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
#計(jì)算朋友總數(shù)
total = len(friends[1:])
print('男性好友: %.2f%%' % (float(male)/total*100) + '\n' +
'女性好友: %.2f%%' % (float(female) / total * 100) + '\n' +
'不明性別好友: %.2f%%' % (float(other) / total * 100))
輸出結(jié)果為:
可視化呈現(xiàn):
pie = Pie('震驚!原來樹根的微信好友是這樣的')
pie.add(' ',['男' ,'女','外星人'],[(float(male)/total*100),(float(female) / total * 100),(float(other) / total * 100)])
pie.render()
bar = Bar('震驚!原來樹根的微信好友是這樣的')
bar.add(' ',['男' ,'女','外星人'],[(float(male)/total*100),(float(female) / total * 100),(float(other) / total * 100)])
bar.render()
執(zhí)行以上代碼會(huì)在默認(rèn)文件路徑生成名為render的html文件,打開即可得可視化結(jié)果:
還可以是柱狀圖:
啊,一不小心就暴露了自己女性朋友比較多的事實(shí)。。。
再仔細(xì)觀察friends列表,發(fā)現(xiàn)里面還包含了好友昵稱、省份、城市、個(gè)人簡(jiǎn)介等等的數(shù)據(jù),剛好可以用來分析好友城市分布,最好的方式是定義一個(gè)函數(shù)把數(shù)據(jù)都爬下來,存到數(shù)據(jù)框里,再進(jìn)行分析。
因此我們可以執(zhí)行以下代碼把數(shù)據(jù)導(dǎo)出到excel:
#定義一個(gè)函數(shù),用來爬取各個(gè)變量
def get_var(var):
variable = []
for i in friends:
value = i[var]
variable.append(value)
return variable
#調(diào)用函數(shù)得到各變量,并把數(shù)據(jù)存到csv文件中,保存到桌面
NickName = get_var('NickName')
Sex = get_var('Sex')
Province = get_var('Province')
City = get_var('City')
Signature = get_var('Signature')
from pandas import DataFrame
data = {'NickName': NickName, 'Sex': Sex, 'Province': Province,
'City': City, 'Signature': Signature}
frame = DataFrame(data)
frame.to_csv('C:/Users/acer/Desktop/data.csv', index=True)
執(zhí)行以后發(fā)現(xiàn)桌面多了一個(gè)csv格式的文件,打開發(fā)現(xiàn)里面就是friends中的數(shù)據(jù):
導(dǎo)出成功!
統(tǒng)計(jì)微信好友來自哪里
用excel進(jìn)行對(duì)廣東的好友進(jìn)行預(yù)處理和統(tǒng)計(jì)以后(樹根差點(diǎn)也想把MATLAB也用上),導(dǎo)入回Python,執(zhí)行以下代碼:
import pyecharts as p
#這些數(shù)據(jù)是經(jīng)過excel處理的
city_name = ['朝陽市', '潮州市', '東莞市', '佛山市', '廣州市', '河源市',
'惠州市', '汕頭市', '江門市', '揭陽市','茂名市','梅州市',
'清遠(yuǎn)市', '汕頭市','汕尾市', '韶關(guān)市', '深圳市', '肇慶市',
'湛江市', '云浮市', '中山市', '珠海市']
num = [2,9,27,24,86,3,7,10,22,30,9,9,5,22,2,1,7,44,13,14,
5,2]
cc = p.Map('樹根的微信好友分布(僅廣東)',width=1200,height=600)
cc.add('',city_name,num,maptype='廣東',is_visualmap=True,visual_text_color='#000')
cc.render()
同樣我們?cè)谀J(rèn)的路徑打開render的html文件,即可得可視化結(jié)果:
發(fā)現(xiàn)樹根的好友來自廣州的最多,有86個(gè),其次就是肇慶的好友,44個(gè),第三就是揭陽和潮州的好友,分別是30和27,由上面的可視化結(jié)果也可以大致看出(好友分布人數(shù)對(duì)應(yīng)左下角的顏色條)。
微信好友個(gè)性簽名的自定義詞云圖
好玩的來了。之前已經(jīng)爬下了每個(gè)好友的個(gè)性簽名,剛好可以分析一下大伙兒個(gè)性簽名時(shí)使用的高頻詞語是什么,用上上一篇文文的代碼(回憶or寄望,制作一份屬于自己的云圖詞)順便可以做個(gè)詞云圖。
先把原先爬下來的個(gè)性簽名(Signature)打印出來,發(fā)現(xiàn)有很多本來是表情的,變成了emoji、span、class等等這些無關(guān)緊要的詞,需要先替換掉,另外,還有類似<>/= 之類的符號(hào),也需要寫個(gè)簡(jiǎn)單的正則替換掉,再把所有拼起來,得到text字串。
以下是執(zhí)行代碼:
import re
siglist = []
for i in friends:
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)
接著就可以把JB,啊不,把結(jié)巴分詞這個(gè)包搞進(jìn)來分詞(搞不懂這個(gè)庫的名字怎么來的)。
import jieba
wordlist = jieba.cut(text, cut_all=True)
word_space_split = ' '.join(wordlist)
分詞成功以后,終于可以進(jìn)入畫圖階段了。可以根據(jù)自己想要的圖片、形狀、顏色畫出相似的圖形。樹根這次執(zhí)行的云圖詞代碼比上一篇的入門要高大上一點(diǎn),我們需要把matplotlib、wordcloud、numpy、PIL等包搞進(jìn)來:
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
import PIL.Image as Image
coloring = np.array(Image.open('C:/Users/acer/Desktop/timg.jpg'))
my_wordcloud = WordCloud(background_color='white', max_words=2000,
mask=coloring, max_font_size=40, random_state=42, scale=2,
font_path='C:/Users/acer/Desktop/msyh.ttc').generate(word_space_split)
image_colors = ImageColorGenerator(coloring)
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis('off')
plt.show()
我們來看看結(jié)果是怎么樣的:
能猜到是什么動(dòng)物嗎?沒錯(cuò)就是皮卡丘?。ㄊ裁茨憔尤徽f看不出???)
以下是原圖:
看來,在我的微信好友的個(gè)人簽名里,有人善于聆聽,有人強(qiáng)調(diào)善良,有人重視靈魂,有人凝視人生。一直在等待,不放棄尋找。歷盡曲折,不畏虛偽。真心如一,不能辜負(fù)。一步一生多努力,一起一切one more dream(樹根真編不下去了,其實(shí)樹根的好友簽名無非就是我不能沒有你你不能失去我哈哈哈哈)。
最后
以上是不是很有趣呢?是不是又打開了一扇新世界的大門呢?
我微信好友也不是太多,如果微信好友有幾千個(gè),可以得到幾千條數(shù)據(jù),分析一下還是很有價(jià)值的。
聯(lián)系客服