一、背景及研究現狀
在我國互聯網的發展過程中,PC互聯網已日趨飽和,移動互聯網卻呈現井噴式發展。數據顯示,截止2013年底,中國手機網民超過5億,占比達81%。伴隨著移動終端價格的下降及wifi的廣泛鋪設,移動網民呈現爆發趨勢。
微信已經成為連接線上與線下、虛擬與現實、消費與產業的重要工具,它提高了O2O類營銷用戶的轉化率。過去開發軟件,程序員常要考慮不同開發環境的語言、設備的適配性和成本。現在,開發者可以在一個“類操作底層”去開發應用,打破了過去受限的開發環境。
二、研究意義及目的
隨著寬帶無線接入技術和移動終端技術的飛速發展,人們迫切希望能夠隨時隨地乃至在移動過程中都能方便地從互聯網獲取信息和服務,移動互聯網應運而生并迅猛發展。然而,移動互聯網在移動終端、接入網絡、應用服務、安全與隱私保護等方面還面臨著一系列的挑戰。其基礎理論與關鍵技術的研究,對于國家信息產業整體發展具有重要的現實意義。
三、研究內容及數據獲取
普通用戶使用手機掃描二維碼并在手機上確認后,wxpy自動從用戶的網頁版微信獲取好友列表,包括好友昵稱、所在地區、個性簽名、性別等信息。
四、python程序設計
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
#微信好友特征數據分析及可視化 # 1.導包操作 from wxpy import * import re import jieba import numpy as np from scipy.misc import imread from wordcloud import WordCloud import matplotlib.pyplot as plt from pylab import mpl import pandas as pd mpl.rcParams[ 'font.sans-serif' ] = [ 'SimHei' ] from pyecharts.charts import Map from pyecharts import options as opts # 2.登錄操作 bot = Bot() # 列舉登錄賬號的所有好友 all_friends = bot.friends() print (all_friends) # 獲取登錄賬號所關注的所有的公眾號 all_maps = bot.mps() print ( "所有好友列表" , all_maps) # 獲取當前登錄賬號的群聊列表 all_groups = bot.groups() print ( "所有群聊列表" , all_groups) # 根據好友的備注名稱搜索好友 #myfriend = bot.friends().search('許寬')[0] #print("搜索好友:", myfriend) # 搜索好友并發送信息 # bot.friends().search('許寬')[0].send('你好呀') # 向文件傳輸助手發送信息 bot.file_helper.send( "hello" ) # 3.顯示男女比例 sex_dict = { 'male' : 0 , 'female' : 0 , "no_set" : 0 } for friend in all_friends: print (friend, friend.sex) if friend.sex = = 1 : sex_dict[ 'male' ] + = 1 elif friend.sex = = 2 : sex_dict[ 'female' ] + = 1 elif friend.sex = = 0 : sex_dict[ 'no_set' ] + = 1 print (sex_dict) # 4使用matplotlib可視化 slices = [sex_dict[ "male" ], sex_dict[ "female" ], sex_dict[ "no_set" ]] activities = [ "male" , "female" , "no_set" ] cols = [ "r" , "m" , "g" ] # startangle:開始繪圖的角度,逆時針旋轉 # shadow:陰影 # %1.1f%%:格式化字符串,整數部分最小1位,小數點后保留一位,%%:轉義字符 plt.pie(slices, labels = activities, colors = cols, startangle = 90 , shadow = True , autopct = '%1.1f%%' ) plt.title( "微信好友比例圖" ) plt.savefig( "WeChat_sex.png" ) # 統計登錄賬號好友的各省人數 province_dict = { '河北' : 0 , '山東' : 0 , '遼寧' : 0 , '廣西' : 0 , '吉林' : 0 , '甘肅' : 0 , '青海' : 0 , '河南' : 0 , '江蘇' : 0 , '湖北' : 0 , '湖南' : 0 , '江西' : 0 , '浙江' : 0 , '廣東' : 0 , '云南' : 0 , '福建' : 0 , '臺灣' : 0 , '海南' : 0 , '山西' : 0 , '四川' : 0 , '陜西' : 0 , '貴州' : 0 , '安徽' : 0 , '北京' : 0 , '天津' : 0 , '重慶' : 0 , '上海' : 0 , '香港' : 0 , '澳門' : 0 , '新疆' : 0 , '內蒙古' : 0 , '西藏' : 0 , '黑龍江' : 0 , '寧夏' : 0 } # 統計省份 for friend in all_friends: # print(friend.province) if friend.province in province_dict.keys(): province_dict[friend.province] + = 1 print ( "province_dict" ) print (province_dict) # 為了方便數據呈現,生成JSON Array格式數據 data = [] for key, value in province_dict.items(): data.append({ 'name' : key, 'value' : value}) # 在data列表末尾添加一個字典元素 print (data) data_process = pd.DataFrame(data) # 創建數據框 data_process.columns = [ 'city' , 'popu' ] print (data_process) map = Map ().add( "微信好友城市分布圖" , [ list (z) for z in zip (data_process[ 'city' ], data_process[ 'popu' ])], "china" ).set_global_opts( title_opts = opts.TitleOpts(title = "Map-VisualMap(連續型)" ), visualmap_opts = opts.VisualMapOpts(max_ = 10 )) map .render( 'map.html' ) # with...as...語句結束時,自動調用f.close() # a表示:在文件末尾追加 def write_txt_file(path, txt): # 寫文件 with open (path, 'a' , encoding = 'gbk' ) as f: return f.write(txt) # 每次運行程序前,需要刪除上一次的文件 # 默認字符編碼為GBK def read_txt_file(path): with open (path, 'r' , encoding = 'gbk' ) as f: return f.read() # 統計登錄賬號好友個性簽名 for friend in all_friends: print (friend, friend.signature) # 對數據進行清洗,將標點符號等對詞頻率統計造成影響的因素剔除 # [...]:匹配中括號任意一個字符 # r:防止轉義 pattern = re. compile (r '[一-龥]+' ) # 將正則字符串編譯成正則表達式對象,以后在后期的匹配中復用 # 對某一個簽名進行匹配,只匹配中文漢字,結果是列表 filterdata = re.findall(pattern, friend.signature) print (filterdata) write_txt_file( 'signatures.txt' , ''.join(filterdata)) # 讀取文件并輸出。 content = read_txt_file( 'signatures.txt' ) print (content) # 輸出內容,僅漢字 # 輸出分詞結果,結果為列表 segment = jieba.lcut(content) # 精確模式:不存在冗余數據,適合文本分析 print (segment) # 生成數據框且有一列元素 word_df = pd.DataFrame({ 'segment' : segment}) # 字典類型 print (word_df) # index_col=False:第一行不做為索引 # seq=" ":分隔符 # names=['stopword']:列名 # "stopwords.txt":停止詞庫 stopwords = pd.read_csv( "stopwords.txt" , index_col = False , sep = " " , names = [ 'stopword' ], encoding = 'gbk' ) print (stopwords) # 查看過濾停止詞后的數據框 word_df = word_df[~word_df.segment.isin(stopwords.stopword)] print ( "過濾后:" ) print (word_df) # 查看分詞的詞頻 # python中的groupby可以看作是基于行或者是基于index的聚合操作 # agg函數提供基于列的聚合操作,一般與groupby連用 # np.size:numpy庫中統計一列中不同值的個數 words_stat = word_df.groupby(by = [ 'segment' ])[ 'segment' ].agg({ "計數" : np.size}) # 警告信息 print (words_stat) # 根據計數這一列降序排列 words_stat = words_stat.reset_index().sort_values(by = [ "計數" ], ascending = False ) print (words_stat) # 讀入背景圖片 color_mask = imread( "black_mask.png" ) # 設置詞云屬性 wordcloud = WordCloud(font_path = "Hiragino.ttf" , # 設置字體 background_color = "pink" , # 設置顏色 max_words = 100 , # 詞云顯示的最大詞數 mask = color_mask, # 設置背景圖片 max_font_size = 100 # 字體最大值 ) # 生成詞云字典,獲取詞云最高的前一百詞 word_frequence = {x[ 0 ]: x[ 1 ] for x in words_stat.head( 100 ).values} print (word_frequence) # 繪制詞云圖 wordcloud.generate_from_frequencies(word_frequence) wordcloud.to_file( "wordcloud.png" ) # 對圖像進行處理 plt.imshow(wordcloud) plt.axis( "off" ) # 隱藏坐標軸 plt.show() |
五、數據分析及可視化
微信好友男女性別比例
微信好友所在省份比例
聲明
祖國領土主權神圣不可侵犯!
部分地區未標注,敬請諒解!
微信好友個性簽名詞云圖
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_40507857/article/details/103835711