有讀者叫樹根有空就要多更新公眾號,,樹根也在想要不要轉(zhuǎn)型,,畢竟最近在自學(xué)Python。但是不管怎么樣,,我都想把自己學(xué)到的覺得最有意思的,,用自己的方式去呈現(xiàn)給大家看。 今天想給大家的文文是關(guān)于怎么用Python爬一爬自己的微信,,本文是這個系列的第一篇,。因?yàn)镻ython關(guān)于微信的工具庫itchat有很多好玩的功能,比如自動回復(fù)和查看撤回消息等等,,其他功能樹根會慢慢摸索,,在日后會繼續(xù)教大家怎么用Python玩轉(zhuǎn)微信。 樹根會以自己的微信作為白老鼠,,來展示給大家看,。想自己動手試試的讀者也可以自己用Python試試。
接下來,,就是樹根微信大揭秘時間了 樹根已經(jīng)默認(rèn)大家安裝好Python了,,還沒安裝的請看上一篇文文《回憶or寄望,制作一份屬于自己的云圖詞》,。所有第一步肯定就是工具庫的安裝,。打開cmd命令窗口,或者Anaconda Prompt,,依次輸入以下命令安裝相關(guān)的工具庫:
然后我們在Python中導(dǎo)入所需的工具庫:
from pyecharts import Pie,Map,Bar import pymysql 然后我們可以執(zhí)行以下代碼登錄微信以及檢驗(yàn)是否登錄成功:
itchat.send('樹根雖然長得丑,但是很溫柔','filehelper') 執(zhí)行代碼以后會生成一個二維碼,,用手機(jī)微信掃描以后就可以登錄微信了,。然后第二行代碼是發(fā)送“'樹根雖然長得丑,但是很溫柔'”到文件傳輸助手,,那個“filehelper”就是文件傳輸助手,。 我們來看看是否成功:
太好了,看到這里就證明是成功了,,可以進(jìn)行接下來的事(什么,,說我瞎說什么大實(shí)話?,?,?)。 統(tǒng)計(jì)微信男女好友比例并可視化 要統(tǒng)計(jì)微信好友的男女比例,,首先當(dāng)然要獲取所有微信好友的數(shù)據(jù),,itchat提供了get_friends這個方法來獲取好友的所有信息,我們直接看代碼:
itchat.dump_login_status() friends = itchat.get_friends(update=True)[:] total = len(friends)-1 result=[('RemarkName','備注'),('NickName','微信昵稱'), ('Sex','性別'),('City','城市'),('Province','省份'), ('UserName','用戶名'),('Signature','個性簽名')] 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變量: 來對比一下樹根的微信好友個數(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.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í)行以上代碼會在默認(rèn)文件路徑生成名為render的html文件,,打開即可得可視化結(jié)果:
還可以是柱狀圖: 啊,,一不小心就暴露了自己女性朋友比較多的事實(shí)。。,。 再仔細(xì)觀察friends列表,,發(fā)現(xiàn)里面還包含了好友昵稱、省份,、城市,、個人簡介等等的數(shù)據(jù),剛好可以用來分析好友城市分布,,最好的方式是定義一個函數(shù)把數(shù)據(jù)都爬下來,,存到數(shù)據(jù)框里,再進(jìn)行分析,。 因此我們可以執(zhí)行以下代碼把數(shù)據(jù)導(dǎo)出到excel:
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)桌面多了一個csv格式的文件,,打開發(fā)現(xiàn)里面就是friends中的數(shù)據(jù):
導(dǎo)出成功! 統(tǒng)計(jì)微信好友來自哪里 用excel進(jìn)行對廣東的好友進(jìn)行預(yù)處理和統(tǒng)計(jì)以后(樹根差點(diǎn)也想把MATLAB也用上),,導(dǎo)入回Python,,執(zhí)行以下代碼:
#這些數(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() 同樣我們在默認(rèn)的路徑打開render的html文件,即可得可視化結(jié)果: 發(fā)現(xiàn)樹根的好友來自廣州的最多,,有86個,,其次就是肇慶的好友,44個,,第三就是揭陽和潮州的好友,,分別是30和27,由上面的可視化結(jié)果也可以大致看出(好友分布人數(shù)對應(yīng)左下角的顏色條),。 微信好友個性簽名的自定義詞云圖 好玩的來了,。之前已經(jīng)爬下了每個好友的個性簽名,剛好可以分析一下大伙兒個性簽名時使用的高頻詞語是什么,,用上上一篇文文的代碼(回憶or寄望,,制作一份屬于自己的云圖詞)順便可以做個詞云圖。 先把原先爬下來的個性簽名(Signature)打印出來,,發(fā)現(xiàn)有很多本來是表情的,,變成了emoji、span,、class等等這些無關(guān)緊要的詞,,需要先替換掉,另外,,還有類似<>/= 之類的符號,,也需要寫個簡單的正則替換掉,,再把所有拼起來,得到text字串,。 以下是執(zhí)行代碼:
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é)巴分詞這個包搞進(jìn)來分詞(搞不懂這個庫的名字怎么來的),。
wordlist = jieba.cut(text, cut_all=True) word_space_split = ' '.join(wordlist) 分詞成功以后,,終于可以進(jìn)入畫圖階段了??梢愿鶕?jù)自己想要的圖片,、形狀、顏色畫出相似的圖形,。樹根這次執(zhí)行的云圖詞代碼比上一篇的入門要高大上一點(diǎn),,我們需要把matplotlib、wordcloud,、numpy,、PIL等包搞進(jìn)來:
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é)果是怎么樣的: 能猜到是什么動物嗎?沒錯就是皮卡丘?。ㄊ裁茨憔尤徽f看不出,??,?) 以下是原圖: 看來,,在我的微信好友的個人簽名里,有人善于聆聽,,有人強(qiáng)調(diào)善良,,有人重視靈魂,有人凝視人生,。一直在等待,,不放棄尋找。歷盡曲折,,不畏虛偽,。真心如一,不能辜負(fù),。一步一生多努力,,一起一切one more dream(樹根真編不下去了,其實(shí)樹根的好友簽名無非就是我不能沒有你你不能失去我哈哈哈哈),。 最后 以上是不是很有趣呢,?是不是又打開了一扇新世界的大門呢? 我微信好友也不是太多,,如果微信好友有幾千個,,可以得到幾千條數(shù)據(jù),,分析一下還是很有價值的。 |
|