python爬取資料熱點詞生成詞雲
阿新 • • 發佈:2018-12-22
這是當時在中國mooc學 用python玩轉資料 時,寫的一個小demo.
程式實現步驟
1.從某一網站爬取資料,比如我是在豆瓣爬取的書評
利用Requests庫的get()爬取網頁
使用BeatifulSoup庫對爬取網頁進行解析。
寫入檔案
2.對所爬取字串分詞
利用分詞器 jieba ,逐行用jieba分詞,單行程式碼如:
word_list=pseg.cut(subject)
3.去除停用詞
很多如 “的”、“我們”這樣的詞以及一些符號對主題熱點詞分析並沒有用,所以要刪去過濾這些詞。程式碼如:
stop_words =set(line.strip() for line in open('stopwords.txt',encodeing='utf-8'))
4.選擇名詞
jieba中的詞性標籤使用了傳統方式,例如’n’是名詞,’a’是形容詞,’v’是動詞。資料中的名詞更能代表熱點,可以單獨選擇名詞進行後續處理,選擇所有的名詞放到一個列表中的程式碼如下:
for word, flag in word_list:
if not word in stop_words and flag == 'n':
commentlist.append(word)
5.根據詞頻畫出詞雲
將所有名詞直接作為WordCloud()函式的引數,預設WordCloud內部通過統計詞頻對詞進行排序,font_path傳入字型檔案,mask表示詞雲的影象形狀,引數傳入為一個影象
content = ' '.join(commentlist)
wordcloud = WordCloud(font_path='simhei.ttf', background_color="grey", mask=mask_image, max_words=40).generate(content)
完整程式碼
import jieba.posseg as pseg import matplotlib.pyplot as plt from os import path import requests from scipy.misc import imread from wordcloud import WordCloud from bs4 import BeautifulSoup #本程式對豆瓣圖書評論進行抓取,並得出其關鍵詞 def fetch_douban_comments():#對豆瓣評論進行抓取,並寫入subject檔案 r = requests.get('https://book.douban.com/subject/1109968/comments/') soup = BeautifulSoup(r.text, 'lxml') pattern = soup.find_all('p', 'comment-content') with open('subjects.txt', 'w', encoding='utf-8') as f: for s in pattern: f.write(s.string) def extract_words(): with open('subjects.txt','r',encoding='utf-8') as f: comment_subjects = f.readlines() #載入stopword stop_words = set(line.strip() for line in open('stopwords.txt', encoding='utf-8')) commentlist = [] for subject in comment_subjects: if subject.isspace():continue # segment words line by line word_list = pseg.cut(subject)#分詞 for word, flag in word_list: if not word in stop_words and flag == 'n': commentlist.append(word) d = path.dirname(__file__) mask_image = imread(path.join(d, "mickey.png")) content = ' '.join(commentlist) wordcloud = WordCloud(font_path='simhei.ttf', background_color="grey", mask=mask_image, max_words=40).generate(content) # Display the generated image: plt.imshow(wordcloud) plt.axis("off") wordcloud.to_file('wordcloud.jpg') plt.show() if __name__ == "__main__": fetch_douban_comments() extract_words()
結果:
由於所選mask影象是個米老鼠,所以最後詞雲的形狀是這個樣子