在Anaconda下完成,參考https://blog.csdn.net/zhonglixianyun/article/details/78229782
結果圖:
1. 需要的庫
numpy, os,
itchat, wordcloud, jieba,
1) 安裝itchat
由於在Anaconda下運行,安裝外部庫要在\Anacoda\Scripts目錄下,pip默認是把東西安裝在系統python環境中,即C:\Python27\Lib\site-packages中,因而無法在annocanda環境中調用,所以會出現這樣的問題。
解決辦法:在D:\Anacoda\Scripts中 把pip.exe和pip-script.py改成condapip.exe和condapip-script.py (改名字只是爲了和系統python環境中的pip區分)。然後cmd中要用anaconda環境安裝包就在\Anacoda\Scripts 下使用condapip install XXX就好了,想用系統的Python環境就直接pip install .....
2) 安裝jieba
cmd-在\Anacoda\Scripts 下-condapip install XXX
3) 安裝wordcloud
wordcloud不能直接安裝,需要先下載對應python+計算機的版本wordcloud-1.3.2-cp36-cp36m-win_amd64.whl
下載地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
然後在\Anacoda\Scripts 下 condapip install,將whl文件直接拖進來即可
2. 在目錄下保存一張詞雲的底圖,用來確定詞雲形狀 配色
3. 代碼
import itchat
import re
# 先登錄,掃二維碼登錄微信
itchat.login()
#獲取好友列表,返回的是json信息
friends = itchat.get_friends(update=True)[0:]
#打印好友列表信息
#print(friends)
tList = []
for i in friends:
# 獲取個性簽名,替換掉span,class,emoji
signature = i["Signature"].replace(" ", "").replace("span", "").replace("class", "").replace("emoji", "")
# 正則匹配過濾掉emoji表情,例如emoji1f3c3等
rep = re.compile("1f\d.+")
signature = rep.sub("", signature)
tList.append(signature)
# 拼接字符串
text = "".join(tList)
# jieba分詞
import jieba
wordlist_jieba = jieba.cut(text, cut_all=True)
wl_space_split = " ".join(wordlist_jieba)
# wordcloud詞雲
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import os
import numpy as np
import PIL.Image as Image
#d = os.path.dirname(__file__)
#找一張微信logo圖來生成配色方案,微信logo圖wechat.jpg路徑在F:\\盤下
alice_coloring = np.array(Image.open(os.path.join('F:\\','we9.jpg')))
# 這裏要選擇字體存放路徑,win的字體在C:/windows/Fonts中
"""#my_wordcloud = WordCloud().generate(wl_space_split) 默認構造函數
my_wordcloud = WordCloud(
background_color='white', # 設置背景顏色
mask = abel_mask, # 設置背景圖片
max_words = 200, # 設置最大顯示的字數
stopwords = STOPWORDS, # 設置停用詞
font_path = C:/Users/Windows/fonts/simkai.ttf', # 設置字體格式,如不設置顯示不了中文
max_font_size = 50, # 設置字體最大值
random_state = 30, # 設置有多少種隨機生成狀態,即有多少種配色方案
scale=.5
).generate(wl_space_split)"""
my_wordcloud = WordCloud(background_color="white", max_words=2000, mask=alice_coloring,
max_font_size=40, random_state=42,
font_path='C:/Windows/Fonts/simhei.ttf') \
.generate(wl_space_split)
image_colors = ImageColorGenerator(alice_coloring)
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
# 保存圖片到F:\\盤下 併發送到手機裏的文件傳輸助手(filehelper)裏
my_wordcloud.to_file(os.path.join('F:\\','wechat_cloud.png'))
itchat.send_image("F:\\wechat_cloud.png", 'filehelper')
4. 問題:
1) [Errno 2] No such file or directory
原因:人爲的給名爲wechat的jpg文件又加了.jpg存儲
2) 報錯unexpected character after line continuation character
my_wordcloud = WordCloud(background_color="white", max_words=2000, mask=alice_coloring,
max_font_size=40, random_state=42,
font_path='C:/Windows/Fonts/simhei.ttf')\
.generate(wl_space_split)
原因:換行符 是 空格+\ ,這裏沒加空格,加上空格或者直接變爲一行就可以了
5. 學習筆記
1) re 模塊
Regular Expression,正則表達式
2) spider 的調試debug
a = 'a'
b = 'b'
c = 'c'
e = 'e'
f = 'f'
g = 'g'
h = 'h'
print(a)
1] 調試
調試前,在ipython中輸入%reset 把工作空間的所有變量清除,以免影響測試
先不打斷點,用debug (Ctrl+F5)的方式運行。
出現ipdb提示符,說明進入調試模式
在提示符後輸入c(continue),程序繼續執行到下一個斷點。程序結束。
* 即使沒打斷點,也會在第一句執行之前中斷,未執行第一句。c=.
* q退出調試
2] 斷點
a. 普通的breakpoint,雙擊行首
ipython中箭頭指示執行到第幾行,在斷點前結束
ipdb> !f
*** NameError: name 'f' is not defined
ipdb> !e
'e'
*!(python語句), 在當前狀態下執行該python語句,例如!f可查看f變量,f==4可臨時賦值
b. 帶條件的breakpoint,Ctrl+Shift+雙擊行首
在框內可輸入斷點的條件,可以是任意返回True / False 的Python語句,例如(a==4)and(b==5)
發現斷點不起作用,因爲不滿足條件。
q結束,重新Ctrl+F5進入debug,會自動在第一行開始前停住,
可以按=Ctrl+F10 單行單行的執行
c. 其他
Step Into,進入函數內部
Return , 跳出來.
3] 調試常用命令
ENTER
(重複上次命令)- a(在某個def中打印這個def接收到的所有arguements)
- b(在某行設置breakpoint)
c
(繼續)直到觸碰下一個breakpointl
( 可以列出當前將要運行的代碼塊)- ll(列出整個tree)
r
(運行直到子程序結束)- r(eturn) 繼續執行,直到函數體返回
!<python 命令>
- n(ext) 讓程序運行下一行,如果當前語句有一個函數調用,用 n 是不會進入被調用的函數體中的
- s(tep) 跟 n 相似,但是如果當前有一個函數調用,那麼 s 會進入被調用的函數體中
- j(ump) 讓程序跳轉到指定的行數
h
(幫助)- a(rgs) 打印當前函數的參數
- p(rint) 最有用的命令之一,打印某個變量
- pp locals() 在某個def中打印該def中的局部變量
- pp globals() 打印全局變量
- q(uit) 退出調試
6. 細節
#獲取好友列表,返回的是json信息
friends = itchat.get_friends(update=True)[0:] ,friends列表存儲了所有好友的下列信息。
* 任取 i = friends[1], 以其中一個好友爲例 , 可以看到‘Signature’‘City’‘Sex’等標籤的信息
* 獲取對應標籤的信息 可以i["xxx"]任取
* replace()方法的語法
str.replace(old, new[, max]) 例如:str.replace("is", "was", 3); max 指定替換次數不超過3次
例如
signature = i["Signature"].replace(" ", "").replace("span", "").replace("class", "").replace("emoji", "")