有读者叫树根有空就要多更新公众号,树根也在想要不要转型,毕竟最近在自学Python。但是不管怎么样,我都想把自己学到的觉得最有意思的,用自己的方式去呈现给大家看。 今天想给大家的文文是关于怎么用Python爬一爬自己的微信,本文是这个系列的第一篇。因为Python关于微信的工具库itchat有很多好玩的功能,比如自动回复和查看撤回消息等等,其他功能树根会慢慢摸索,在日后会继续教大家怎么用Python玩转微信。 树根会以自己的微信作为白老鼠,来展示给大家看。想自己动手试试的读者也可以自己用Python试试。
接下来,就是树根微信大揭秘时间了 树根已经默认大家安装好Python了,还没安装的请看上一篇文文《回忆or寄望,制作一份属于自己的云图词》。所有第一步肯定就是工具库的安装。打开cmd命令窗口,或者Anaconda Prompt,依次输入以下命令安装相关的工具库:
然后我们在Python中导入所需的工具库:
from pyecharts import Pie,Map,Bar import pymysql 然后我们可以执行以下代码登录微信以及检验是否登录成功:
itchat.send('树根虽然长得丑,但是很温柔','filehelper') 执行代码以后会生成一个二维码,用手机微信扫描以后就可以登录微信了。然后第二行代码是发送“'树根虽然长得丑,但是很温柔'”到文件传输助手,那个“filehelper”就是文件传输助手。 我们来看看是否成功:
太好了,看到这里就证明是成功了,可以进行接下来的事(什么,说我瞎说什么大实话???)。 统计微信男女好友比例并可视化 要统计微信好友的男女比例,首先当然要获取所有微信好友的数据,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', # 连接的是本地数据库,你自己的IP user='acer', # mysql用户名,自行输入 passwd='*****', # 密码,自行输入 db='*****', # 数据库的名字 charset='utf8mb4', # 默认的编码方式: cursorclass=pymysql.cursors.DictCursor)
with connection.cursor() as cursor: # 创建更新值的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变量区的friends变量: 来对比一下树根的微信好友个数:
太好了,看到这里就证明又是成功了。 我们来执行以下代码print一下男女比例结果:
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 #计算朋友总数 total = len(friends[1:]) print('男性好友: %.2f%%' % (float(male)/total*100) + '\n' + '女性好友: %.2f%%' % (float(female) / total * 100) + '\n' + '不明性别好友: %.2f%%' % (float(other) / total * 100)) 输出结果为: 可视化呈现:
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()
执行以上代码会在默认文件路径生成名为render的html文件,打开即可得可视化结果:
还可以是柱状图: 啊,一不小心就暴露了自己女性朋友比较多的事实。。。 再仔细观察friends列表,发现里面还包含了好友昵称、省份、城市、个人简介等等的数据,刚好可以用来分析好友城市分布,最好的方式是定义一个函数把数据都爬下来,存到数据框里,再进行分析。 因此我们可以执行以下代码把数据导出到excel:
def get_var(var): variable = [] for i in friends: value = i[var] variable.append(value) return variable #调用函数得到各变量,并把数据存到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) 执行以后发现桌面多了一个csv格式的文件,打开发现里面就是friends中的数据:
导出成功! 统计微信好友来自哪里 用excel进行对广东的好友进行预处理和统计以后(树根差点也想把MATLAB也用上),导入回Python,执行以下代码:
#这些数据是经过excel处理的 city_name = ['朝阳市', '潮州市', '东莞市', '佛山市', '广州市', '河源市', '惠州市', '汕头市', '江门市', '揭阳市','茂名市','梅州市', '清远市', '汕头市','汕尾市', '韶关市', '深圳市', '肇庆市', '湛江市', '云浮市', '中山市', '珠海市'] 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() 同样我们在默认的路径打开render的html文件,即可得可视化结果: 发现树根的好友来自广州的最多,有86个,其次就是肇庆的好友,44个,第三就是揭阳和潮州的好友,分别是30和27,由上面的可视化结果也可以大致看出(好友分布人数对应左下角的颜色条)。 微信好友个性签名的自定义词云图 好玩的来了。之前已经爬下了每个好友的个性签名,刚好可以分析一下大伙儿个性签名时使用的高频词语是什么,用上上一篇文文的代码(回忆or寄望,制作一份属于自己的云图词)顺便可以做个词云图。 先把原先爬下来的个性签名(Signature)打印出来,发现有很多本来是表情的,变成了emoji、span、class等等这些无关紧要的词,需要先替换掉,另外,还有类似<>/= 之类的符号,也需要写个简单的正则替换掉,再把所有拼起来,得到text字串。 以下是执行代码:
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,啊不,把结巴分词这个包搞进来分词(搞不懂这个库的名字怎么来的)。
wordlist = jieba.cut(text, cut_all=True) word_space_split = ' '.join(wordlist) 分词成功以后,终于可以进入画图阶段了。可以根据自己想要的图片、形状、颜色画出相似的图形。树根这次执行的云图词代码比上一篇的入门要高大上一点,我们需要把matplotlib、wordcloud、numpy、PIL等包搞进来:
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() 我们来看看结果是怎么样的: 能猜到是什么动物吗?没错就是皮卡丘!(什么你居然说看不出???) 以下是原图: 看来,在我的微信好友的个人签名里,有人善于聆听,有人强调善良,有人重视灵魂,有人凝视人生。一直在等待,不放弃寻找。历尽曲折,不畏虚伪。真心如一,不能辜负。一步一生多努力,一起一切one more dream(树根真编不下去了,其实树根的好友签名无非就是我不能没有你你不能失去我哈哈哈哈)。 最后 以上是不是很有趣呢?是不是又打开了一扇新世界的大门呢? 我微信好友也不是太多,如果微信好友有几千个,可以得到几千条数据,分析一下还是很有价值的。 |
|