小蛇學(xué)python(3)兩百行代碼實(shí)現(xiàn)微信好友數(shù)據(jù)爬取與可視化

前段時(shí)間發(fā)現(xiàn)了一個(gè)好玩的東西残家,一個(gè)python的第三方庫(kù)itchat泣港,它的功能很強(qiáng)大兽间。只要你掃一下它所生成的二維碼即可模擬登陸你的微信號(hào)历葛,然后可以實(shí)現(xiàn)自動(dòng)回復(fù),爬取微信列表好友信息等功能嘀略⌒羧埽基于這個(gè)第三方庫(kù),寫了個(gè)兩百行的代碼屎鳍。

廢話不多說宏娄,先貼代碼。這份代碼復(fù)制粘貼就可以用逮壁,不過要注意改一下代碼中所設(shè)置的文件路徑孵坚。

python3+mysql+pycharm開發(fā)環(huán)境粮宛。

代碼

#!/usr/bin/env python3
#_*_ coding:utf-8 _*_
#__author__='跌跌撞撞小紅豆'
#__date__ = '2018-03-18'
import itchat
import pymysql.cursors
from matplotlib import pyplot as plt
import numpy as np
import ch
import jieba.analyse

Nickname1 = []
Remarkname1 = []
Sex1 = []
Province1 = []
Signature1 = []
province_distribution = []

db = 'new_schema'

Province_dict = {'北京': 0, '上海': 0, '天津': 0, '重慶': 0, '黑龍江': 0, '吉林': 0, '遼寧': 0, '內(nèi)蒙古': 0, '河北': 0,
                 '山東':0, '河南':0, '安徽':0,'江蘇':0, '浙江':0, '福建':0, '廣東':0, '湖南':0, '湖北':0, '江西':0,
                 '寧夏':0, '甘肅':0, '新疆':0, '西藏':0, '青海':0, '四川':0,'云南':0, '貴州':0, '廣西':0, '山西':0,
                 '陜西':0, '海南':0, '臺(tái)灣':0 }
Province_tuple = ['北京', '上海', '天津', '重慶', '黑龍江', '吉林', '遼寧', '內(nèi)蒙古', '河北',
                 '山東', '河南', '安徽','江蘇', '浙江', '福建', '廣東', '湖南', '湖北', '江西',
                 '寧夏', '甘肅', '新疆', '西藏', '青海', '四川','云南', '貴州', '廣西', '山西',
                 '陜西', '海南', '臺(tái)灣']


def login():
    itchat.auto_login()

def crawl():
    male = 0
    female = 0
    unknow = 0


    for friend in itchat.get_friends(update=True)[0:]:
        #可以用此句print查看好友的微信名、備注名卖宠、性別巍杈、省份、個(gè)性簽名(1:男 2:女 0:性別不詳)
        print(friend['NickName'],friend['RemarkName'],  friend['Sex'],   friend['Province'],   friend['Signature'])

        Nickname1.append(friend['NickName'])
        Remarkname1.append(friend['RemarkName'])
        Sex1.append(friend['Sex'])
        Province1.append(friend['Province'])
        Signature1.append(friend['Signature'])

        img = itchat.get_head_img(userName=friend["UserName"])
        path = "C:/HeadImages_zyh/"+friend['NickName']+"("+friend['RemarkName']+").jpg"
        try:
            with open(path,'wb') as f:
                f.write(img)
        except Exception as e:
            print(repr(e))

        if friend['Sex'] == 1:
            male += 1
        else:
            if friend['Sex'] == 2:
                female += 1
            else:
                unknow += 1

    print('您的微信賬號(hào)里有男性:' + str(male) + '  女性:' + str(female) + '  性別不知者: ' + str(unknow))

def store_mysql():
    print('~~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
    connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db=db,
                                 charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
    # 通過cursor創(chuàng)建游標(biāo)
    cursor = connection.cursor()
    print('~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)成功扛伍!正在寫入數(shù)據(jù)筷畦,請(qǐng)等待~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')

    for i in range(len(Remarkname1)):
        sql = '''INSERT INTO `my_friends` (`Nickname`, `Remarkname`, `Sex`, `Province`, `Signature`) VALUES ("%s", "%s", "%d", "%s", "%s")''' % (Nickname1[i],Remarkname1[i],Sex1[i],Province1[i],Signature1[i])
        cursor.execute(sql)

    # 提交SQL
    connection.commit()
    cursor.close()
    connection.close()

def select_sex():
    print('~~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
    connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db=db,
                                 charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
    # 通過cursor創(chuàng)建游標(biāo)
    cursor = connection.cursor()
    print('~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)成功!正在提取數(shù)據(jù)刺洒,請(qǐng)等待~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')

    sql = "select (id) from `my_friends`"
    cursor.execute(sql)
    sum = len(cursor.fetchall())
    print("共計(jì)數(shù)據(jù)" + str(sum) + "條")
    global man, woman, unknown
    man = woman = unknown = 0
    for i in range(sum):
        sql = "select Sex from `my_friends` where id =" + str(i+1)
        cursor.execute(sql)
        dict = cursor.fetchone()
        print(dict)

        if dict['Sex'] == 1:
            man  += 1
        if dict['Sex'] == 2:
            woman += 1
        if dict['Sex'] == 0:
            unknown += 1
    print(man,woman,unknown)
    print(1)


    connection.commit()
    cursor.close()
    connection.close()

def figure_sex():
    fig = plt.figure(1)
    ax1 = plt.subplot(111)
    data = np.array([man, woman, unknown])
    width = 0.5
    x_bar = np.arange(3)
    rect = ax1.bar(left=x_bar, height=data, width=width, color="lightblue")
    for rec in rect:
        x = rec.get_x()
        height = rec.get_height()
        ax1.text(x + 0.2, 1.02 * height, str(height))
    ax1.set_xticks(x_bar)
    ax1.set_xticklabels(("man", "woman", "unknown"))
    ax1.set_ylabel("number")
    ax1.set_title("your friend's sex distribution")
    ax1.grid(True)
    ax1.set_ylim(0, 200)
    plt.show()

def select_province():
    andso_on = 0
    overseas = 0
    total = 0
    print('~~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
    connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db=db,
                                 charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

    cursor = connection.cursor()
    print('~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)成功鳖宾!正在提取數(shù)據(jù),請(qǐng)等待~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')

    sql = "select (Province) from `my_friends`"
    cursor.execute(sql)
    sum = len(cursor.fetchall())
    print("共計(jì)數(shù)據(jù)" + str(sum) + "條")
    for i in range(sum):
        sql = "select Province from my_friends where id =" + str(i+1)
        cursor.execute(sql)
        dict = cursor.fetchone()

        province = dict['Province']

        if province in Province_tuple:
            Province_dict[province] += 1
        if province == '':
            overseas += 1
        if province != ''and province not in Province_tuple:
            andso_on += 1
    #print(Province_dict)    真沒想到可以如此簡(jiǎn)單的就成功計(jì)數(shù)好友在每個(gè)省的分布逆航,是自己寫程序無(wú)意中想到的鼎文,之前一直思考都沒有這個(gè)靈光閃現(xiàn)∫蚶可見有時(shí)候編代碼和做數(shù)學(xué)題一樣拇惋,不能只看,要邊動(dòng)手邊想Dㄊ!3盘!
    for i in range(32):
        province_distribution.append(Province_dict[Province_tuple[i]])

    province_distribution.append(overseas)
    province_distribution.append(andso_on)
    for i in range(len(province_distribution)-2):
        total = total + province_distribution[i]

    print(province_distribution)
    connection.commit()
    cursor.close()
    connection.close()

def figure_province():
    Province_tuple.append('unknow')
    Province_tuple.append('abroad')
    fig = plt.figure(1)
    ax1 = plt.subplot(111)
    data = province_distribution
    width = 0.5
    x_bar = np.arange(len(province_distribution))
    rect = ax1.bar(left=x_bar, height=data, width=width, color="lightblue")
    for rec in rect:
        x = rec.get_x()
        height = rec.get_height()
        ax1.text(x + 0.1, 1.02 * height, str(height))
    ax1.set_xticks(x_bar)
    ax1.set_xticklabels(Province_tuple)
    ax1.set_ylabel("number")
    ax1.set_title("my friend's location distribution")
    ax1.grid(True)
    ax1.set_ylim(0, 100)
    plt.show()

def judge_chinese(word):
    cout1 = 0
    for char in word:
        if ord(char) not in (97, 122) and ord(char) not in (65, 90):
            cout1 += 1
    if cout1 == len(word):
        return word

def jiebaSet(strs):

    tags = jieba.analyse.extract_tags(strs, topK=100, withWeight=True)
    for item in tags:
        print(item[0] + '\t' + str(int(item[1]*1000)))


def select_signature():
    cout = 0
    Sig = []
    strs = ''

    print('~~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
    connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db=db,
                                 charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

    cursor = connection.cursor()
    print('~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)成功澳眷!正在提取數(shù)據(jù)胡嘿,請(qǐng)等待~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')

    sql = "select (id) from `my_friends`"
    cursor.execute(sql)
    sum = len(cursor.fetchall())

    for i in range(sum):
        sql = "select Signature from `my_friends` where id =" + str(i + 1)
        cursor.execute(sql)
        dict = cursor.fetchone()
        if dict['Signature'] == '':
            cout += 1
        else:
            Sig.append(dict['Signature'])

    print('有' + str(cout) + '人沒有寫個(gè)性簽名')

    for word in Sig[0:]:
        judge_chinese(word)
        if judge_chinese(word) != None:
            print(judge_chinese(word))
            strs += word

    jiebaSet(strs)


login()
crawl()
itchat.run()
store_mysql()
select_sex()
figure_sex()
ch.set_ch()
select_province()
figure_province()
select_signature()


接下來(lái)我們開始一點(diǎn)點(diǎn)分析這些代碼,以及分享一下我寫代碼過程中遇到的困難钳踊,坑和感受

登陸

第一個(gè)函數(shù)login()沒有什么好說的灶平,這是itchat封裝好的,調(diào)用后可以直接生成一個(gè)二維碼箍土,這個(gè)二維碼其實(shí)就是你平時(shí)登陸web微信時(shí)候的二維碼,你用手機(jī)微信掃這個(gè)二維碼后罐监,程序會(huì)模擬成你登陸進(jìn)微信吴藻,進(jìn)而對(duì)微信進(jìn)行一系列操作。

爬取

crawl()所實(shí)現(xiàn)的功能是爬取你微信列表所有好友的信息弓柱,這些信息包括頭像沟堡,昵稱,備注矢空,性別航罗,所在地以及個(gè)性簽名(昵稱和個(gè)性簽名里有微信表情真的是讓人頭疼,這個(gè)后面再說)以及爬取后儲(chǔ)存頭像在指定路徑和可視化微信好友男女比例的功能屁药。


微信好友性別比例.png

唉粥血,沒想到我雖然是個(gè)漢子,好友列表里竟然女生比男生多,而且竟然還有這么多個(gè)不知道性別的复亏。

path = "C:/HeadImages_zyh/"+friend['NickName']+"("+friend['RemarkName']+").jpg"

這行代碼所描述的就是指定的存儲(chǔ)微信頭像的路徑趾娃。

因?yàn)轭l繁爬取微信會(huì)讓騰訊把你web端微信給封掉,所以我想把所爬取的數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)中缔御,這樣以后分析數(shù)據(jù)可以直接從數(shù)據(jù)庫(kù)里提取抬闷,而不需要一直現(xiàn)爬現(xiàn)分析。

鏈接數(shù)據(jù)庫(kù)

store_mysql()就是實(shí)現(xiàn)這樣一個(gè)功能耕突。只需要簡(jiǎn)單學(xué)習(xí)幾句sql語(yǔ)句就可以滿足本程序的使用笤成。

在這里給大家提供幾個(gè)常用的并且在這個(gè)程序中使用到了的sql語(yǔ)句,供大家查閱研究使用眷茁。

truncate table  表名炕泳;#刪除表中所有數(shù)據(jù)

create table  表名
(id int(10) not null primary key auto_increment) #給表增加索引,而且沒插入一條數(shù)據(jù)索引自增1

alter table 表名 add 字段名 字段類型 

數(shù)據(jù)庫(kù)操作是一門表面看起來(lái)簡(jiǎn)單蔼卡,其實(shí)很繁雜且容易出錯(cuò)的學(xué)問喊崖。舉個(gè)例子吧。

a='', b=' ', c=null

請(qǐng)問將這三個(gè)變量插入數(shù)據(jù)庫(kù)會(huì)有什么不同呢雇逞?答案告訴大家荤懂,c是不占內(nèi)存的,意味著什么也沒有塘砸,好比真空节仿。a呢,它是個(gè)空字符串掉蔬,但是它是有內(nèi)存地址的廊宪,只不過這個(gè)字符串是空的,好比我們生存空間里的空氣女轿,看不見摸不著箭启,其實(shí)它是占用空間的。b也是個(gè)字符串蛉迹,但它不是空的傅寡,而是只有一個(gè)空格字符的字符串。

是不是聽暈了北救?哈哈荐操,仔細(xì)體會(huì),編程中有許多這樣小的細(xì)節(jié)珍策,不注意區(qū)分就會(huì)產(chǎn)生你很難察覺的bug托启。

我在將信息插入數(shù)據(jù)庫(kù)的時(shí)候,卻遇到了一個(gè)大麻煩攘宙。mysql數(shù)據(jù)庫(kù)默認(rèn)編碼是utf8屯耸,然后我所要插入信息中的微信昵稱拐迁,微信個(gè)性簽名里存在的大量表情是由utf8mb4支持的,utf8mb4是utf8的一個(gè)超集肩民。所以我需要更改數(shù)據(jù)庫(kù)默認(rèn)編碼才行唠亚。

給大家科普一下我們?cè)诰幊踢^程中經(jīng)常遇到的編碼問題。到底經(jīng)常報(bào)錯(cuò)的utf8持痰,gb2312灶搜,unicode都是些什么東西呢?

最先美國(guó)人發(fā)明計(jì)算機(jī)時(shí)只把26個(gè)英文字母大小寫工窍,標(biāo)點(diǎn)符號(hào)割卖,數(shù)字等進(jìn)行了編碼,這就是大家C語(yǔ)言入門時(shí)都知道的ASCII碼患雏。后來(lái)計(jì)算機(jī)普及鹏溯,中國(guó)人為了能讓漢字可以表示,就改動(dòng)了ASCII碼淹仑,并加入了常用漢字?jǐn)?shù)千個(gè)丙挽,這就是GB2312。

再后來(lái)匀借,滿文颜阐,日文,藏文等等又不停的加入吓肋,一些不常用的漢字(后來(lái)發(fā)現(xiàn)必須加凳怨,因?yàn)楹芏嗝说拿侄际遣怀S玫臐h字等等情況)也加入了進(jìn)去,GB2312就發(fā)展成為了GB18030是鬼。

到了最后階段肤舞,信息時(shí)代來(lái)了,每個(gè)國(guó)家都知道要抓住機(jī)遇均蜜,大力發(fā)展互聯(lián)網(wǎng)李剖,因此每個(gè)國(guó)家對(duì)自己文字的編碼便應(yīng)運(yùn)而生。當(dāng)真時(shí)百花齊放百家爭(zhēng)鳴囤耳。我們?cè)诰幊讨泄馐怯h轉(zhuǎn)換就已經(jīng)夠煩的了杖爽,難道出差去埃薩俄比亞還要轉(zhuǎn)成埃薩俄比亞的編碼嘛?于是一個(gè)國(guó)際組織就把全世界所有已知的字符符號(hào)海納百川紫皇,全部包括進(jìn)一種編碼,這就是unicode腋寨。

以上這些從通信角度說都是信源編碼聪铺,而utf8和utf8bm4都是信道編碼。他們包含了一些壓縮編碼的規(guī)則以便在傳輸中最大限度的降低空間占用率萄窜。

接下來(lái)講述一下我在更改數(shù)據(jù)庫(kù)默認(rèn)編碼時(shí)候遇到的問題铃剔。從網(wǎng)上搜索撒桨,說是要更改一個(gè)叫做my.ini的文件,它涉及到數(shù)據(jù)庫(kù)剛剛啟動(dòng)時(shí)候的初始化键兜。結(jié)果我第一步就卡了很久凤类,就是我怎么也找不到這個(gè)文件。費(fèi)了很大勁才發(fā)現(xiàn)它原來(lái)在隱藏文件夾ProgramData中普气,至于如何讓隱藏文件夾出現(xiàn)谜疤,自行百度吧。

我是如何發(fā)現(xiàn)它在隱藏文件夾中的呢现诀?

控制面板->管理工具->服務(wù)里夷磕,找到你正在運(yùn)行的mysql服務(wù),右鍵點(diǎn)擊屬性仔沿,然后就會(huì)發(fā)現(xiàn)一個(gè)路徑坐桩,這個(gè)路徑就是mysql啟動(dòng)時(shí)候初始化配置文件my.ini的路徑。之所以說它是因?yàn)樗苤匾怙保煌姹镜膍ysql或者不同的系統(tǒng)這個(gè)文件位置是不一樣的绵跷,需要到這里來(lái)找到它。


mysql57所在位置
my文件的路徑.png

找到文件后更改相應(yīng)位置的內(nèi)容就可以了成福。

如果想查看自己的更改是否有效果碾局,可以以管理員權(quán)限啟動(dòng)命令行然后進(jìn)行如下操作。


命令行操作1.png

命令行操作2.png

如上圖所示就對(duì)了闷叉。

然后緊接著就是重新啟動(dòng)mysql擦俐,你更改了配置必須要重新啟動(dòng)才可以生效∥詹啵可是我在重新啟動(dòng)這個(gè)地方真的是遇到了一個(gè)大坑蚯瞧,可是說出來(lái)也好笑。

mysql下載下來(lái)后是有兩個(gè)服務(wù)進(jìn)程的品擎,一個(gè)叫MySQL埋合,一個(gè)叫MySQL57。而且在控制面板之前那個(gè)服務(wù)里我們看到萄传,MySQL叫做本地系統(tǒng)甚颂,MySQL57是網(wǎng)絡(luò)服務(wù)。我想當(dāng)然的認(rèn)為MySQL是我現(xiàn)在存儲(chǔ)數(shù)據(jù)所用的服務(wù)進(jìn)程秀菱。

執(zhí)行命令net stop mysql無(wú)效振诬,于是我又從網(wǎng)上查了各種攻略,又把mysql和mysql workbench安裝刪除了好幾遍衍菱,真可謂是精通mysql的安裝與刪除了才發(fā)現(xiàn)原來(lái)我一開始服務(wù)進(jìn)程都搞錯(cuò)了赶么,直接輸入net stop mysql57就可以了。

本以為可以出現(xiàn)奇跡脊串,結(jié)果還是存儲(chǔ)失敗了辫呻。又是一頓百度清钥,找到了一個(gè)比較完美的答案。

我們還需要繼續(xù)實(shí)驗(yàn)放闺,仔細(xì)看修改配置文件里init_connect='SETNAMES utf8mb4'祟昭,那我可以拿來(lái)用到數(shù)據(jù)庫(kù)中。果然怖侦,發(fā)現(xiàn)加上“SET NAMES utf8mb4;”這句以后篡悟,數(shù)據(jù)庫(kù)變成了utf8mb4.:在python + mysqldb 或者 python +sqlalchemy兩種模式都適用。創(chuàng)建連接以后础钠,游標(biāo)對(duì)象首先要執(zhí)行一遍“SET NAMES utf8mb4;”這樣就能保證數(shù)據(jù)庫(kù)連接是以u(píng)tf8mb4編碼格式連接恰力,數(shù)據(jù)庫(kù)也就變成utf8mb4的啦。前面都是鋪墊的內(nèi)容旗吁,如果沒有這一步踩萎,前面都是白做的。

數(shù)據(jù)可視化

存儲(chǔ)到數(shù)據(jù)庫(kù)成功以后很钓,接下來(lái)要做的就是如何從數(shù)據(jù)庫(kù)中提取消息香府,并加以利用。我主要對(duì)信息進(jìn)行了兩個(gè)方面的利用码倦,一個(gè)是將所有好友的所在地進(jìn)行分析企孩,并做成條形圖。一個(gè)是將所有好友的個(gè)性簽名進(jìn)行中文分詞袁稽,然后做成詞云來(lái)觀察我好友都在說些什么勿璃?

程序的邏輯很清晰,select_province所做的是從數(shù)據(jù)庫(kù)中提取信息推汽,figure_province是利用畫圖补疑。這個(gè)功能難度不大,不過涉及到一個(gè)細(xì)節(jié)歹撒,就是我們拿到了每個(gè)好友的所在地信息莲组,難道要每次都判斷一遍他們是不是在我國(guó)三十多個(gè)行政區(qū)嘛?這樣無(wú)疑太浪費(fèi)時(shí)間暖夭,無(wú)論是開發(fā)效率還是運(yùn)行效率都不高锹杈。

于是我巧用字典,然后解決了需要頻繁判斷的問題迈着。

首先分別初始化自定義一個(gè)字典和一個(gè)列表竭望。

Province_dict = {'北京': 0, '上海': 0, '天津': 0, '重慶': 0, '黑龍江': 0, '吉林': 0, '遼寧': 0, '內(nèi)蒙古': 0, '河北': 0,
                 '山東':0, '河南':0, '安徽':0,'江蘇':0, '浙江':0, '福建':0, '廣東':0, '湖南':0, '湖北':0, '江西':0,
                 '寧夏':0, '甘肅':0, '新疆':0, '西藏':0, '青海':0, '四川':0,'云南':0, '貴州':0, '廣西':0, '山西':0,
                 '陜西':0, '海南':0, '臺(tái)灣':0 }
Province_tuple = ['北京', '上海', '天津', '重慶', '黑龍江', '吉林', '遼寧', '內(nèi)蒙古', '河北',
                 '山東', '河南', '安徽','江蘇', '浙江', '福建', '廣東', '湖南', '湖北', '江西',
                 '寧夏', '甘肅', '新疆', '西藏', '青海', '四川','云南', '貴州', '廣西', '山西',
                 '陜西', '海南', '臺(tái)灣']

字典的key是我國(guó)三十多個(gè)行政區(qū)的名字,而值所代表的是我朋友所在這些地方的個(gè)數(shù)裕菠,初始化為0咬清。數(shù)據(jù)庫(kù)里是以{province :'所在地'}的形式存儲(chǔ)的,所以利用dict['province']來(lái)判斷該字典值是否在Province_tuple這個(gè)列表里,如果在的話Province_dict[province] += 1枫振。畫圖的時(shí)候直接取出字典值畫圖就可以了。(不知道表達(dá)的是否清晰萤彩,盡力了啊粪滤,也需要大家仔細(xì)看,自行體會(huì)雀扶。)


微信好友所在地分布.png

從圖里可以很直觀的看出來(lái)杖小,我的朋友在北京,山東愚墓,安徽分布最多予权。人對(duì)圖像是最敏感的,所以想要成為一個(gè)很好的數(shù)據(jù)分析師要有很強(qiáng)大的數(shù)據(jù)可視化能力浪册,這知識(shí)數(shù)據(jù)可視化的冰山一角啦扫腺。

最后還有一個(gè)詞云的功能,我引入了jieba分詞包加上自己處理村象,將所有個(gè)性簽名分成一個(gè)一個(gè)詞笆环,包括英文,日文特殊符號(hào)等等厚者。


詞云1.png

詞云2.png

詞云3.png

可以看出來(lái)躁劣,自由,生活库菲,自我這些詞是在我朋友個(gè)性簽名中最頻繁使用的账忘,這不正是90后張揚(yáng)自我的標(biāo)簽嘛?

是不是挺有趣熙宇,心動(dòng)不如行動(dòng)鳖擒,自己實(shí)驗(yàn)一下吧。

PS

有人反映其中ch.py這個(gè)包安裝不了奇颠。解釋一下败去,這個(gè)包是我自己寫的,所以當(dāng)然安裝不了烈拒,而且我忘了把這個(gè)包公布圆裕。其實(shí)這個(gè)包不涉及程序邏輯,這個(gè)包的功能就是解決一些圖像顯示的問題荆几。

以下是代碼

#-*-coding:utf-8-*-
#文件名: ch.py
def set_ch():
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認(rèn)字體
    mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問題</span>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吓妆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吨铸,更是在濱河造成了極大的恐慌行拢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诞吱,死亡現(xiàn)場(chǎng)離奇詭異舟奠,居然都是意外死亡竭缝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門沼瘫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抬纸,“玉大人,你說我怎么就攤上這事耿戚∈剩” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵膜蛔,是天一觀的道長(zhǎng)坛猪。 經(jīng)常有香客問我,道長(zhǎng)皂股,這世上最難降的妖魔是什么墅茉? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮屑墨,結(jié)果婚禮上躁锁,老公的妹妹穿的比我還像新娘。我一直安慰自己卵史,他們只是感情好战转,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著以躯,像睡著了一般槐秧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忧设,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天刁标,我揣著相機(jī)與錄音,去河邊找鬼址晕。 笑死膀懈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谨垃。 我是一名探鬼主播启搂,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刘陶!你這毒婦竟也來(lái)了胳赌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤匙隔,失蹤者是張志新(化名)和其女友劉穎疑苫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捍掺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年撼短,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挺勿。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阔加,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出满钟,到底是詐尸還是另有隱情,我是刑警寧澤胳喷,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布湃番,位于F島的核電站,受9級(jí)特大地震影響吭露,放射性物質(zhì)發(fā)生泄漏吠撮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一讲竿、第九天 我趴在偏房一處隱蔽的房頂上張望泥兰。 院中可真熱鬧,春花似錦题禀、人聲如沸鞋诗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)削彬。三九已至,卻和暖如春秀仲,著一層夾襖步出監(jiān)牢的瞬間融痛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工神僵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雁刷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓保礼,卻偏偏與公主長(zhǎng)得像沛励,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氓英,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評(píng)論 25 707
  • 夢(mèng)海蓉閱讀 465評(píng)論 0 1
  • .gitignore的用法 在日常的開發(fā)中侯勉,當(dāng)我們需要將一個(gè)項(xiàng)目提交到Git時(shí),并不是所有的文件都需要提交铝阐,比如一...
    WeekDiffculty閱讀 329評(píng)論 0 1
  • 今日有幸跟隨領(lǐng)導(dǎo)走訪全息VIP會(huì)員單位億佳門業(yè)址貌,精明干練是我對(duì)吳總的第一印象,吳總非常熱情,落座后直接了當(dāng)练对,從人員...
    呂明超閱讀 126評(píng)論 0 0