關鍵詞:requests,BeautifulSoup,jieba,wordcloud
整體思路:通過requests請求獲得html,然后BeautifulSoup解析html獲得一些關鍵數據,之后通過jieba分詞對數據進行切分,去停,最后通過wordcloud畫詞雲圖
1、請求虎撲Acg區
Acg區首頁的url為:https://bbs.hupu.com/acg
Acg區第二頁的url為:https://bbs.hupu.com/acg-2
從這里可以得知,如果我們要請求多個網頁,只需要以首頁作為基礎url,后面的每一頁在首頁的url基礎上進行添加即可。引入requests庫進行請求
base_url = r'https://bbs.hupu.com/acg' add_url = '' content_str = '' # 嘗試請求15個網頁 for i in range(1, 15): if i != 1: add_url = r'-{}'.format(i) else: add_url = '' url = base_url + add_url response = requests.get(url)
2、BeautifulSoup解析
打開瀏覽器的控制台,觀察網頁源碼,尋找需要獲得的數據的標簽。我們需要獲取一個帖子的標題,通過瀏覽網頁源碼可以發現帖子的標題在一個<a></a>標簽中,且class=“truetit”,通過這兩個信息我們就可以通過BeautifulSoup獲取一個帖子的標題了。

base_url = r'https://bbs.hupu.com/acg' add_url = '' content_str = '' for i in range(1, 15): if i != 1: add_url = r'-{}'.format(i) else: add_url = '' url = base_url + add_url response = requests.get(url) # 引入BeautifulSoup soup = BeautifulSoup(response.text, "lxml") # 找<a></a>標簽,class = ‘truetit’ all_title = soup.find_all("a", class_="truetit") for title in all_title: content_str += title.text
需要注意的是,
all_title = soup.find_all("a", class_="truetit")
會把當前網頁的所有標題都讀出來,且格式是一個以<a></a>標簽為元素的list,通過for遍歷這個list,對每一個<a></a>,調用title.text即可以獲得帖子的標題。
print一下,查看是不是獲得了想要的結果:

可以看到我們已經獲得了我們想要的標題,下一步就是數據處理了(jieba分詞+去停)
3、jieba分詞+去停用詞
先寫一個生成停用詞表的函數
# 引入停用詞表 def stopwordslist(filepath): stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()] return stopwords
再進行jieba分詞,去停使用的是哈工大停用詞表
# 用lcut使得分詞后為一個list s_list = jieba.lcut(content_str) out_list = [] # 引入停用詞表 stopwords = stopwordslist(r'E:\stopwords-master\哈工大停用詞表.txt') for word in s_list: if word not in stopwords: if word != '\t': out_list.append(word) out_str = " ".join(out_list)
到這一步,就可以獲得分詞后的關鍵詞了。下一步就是畫詞雲圖了。
4、畫詞雲圖
引入wordcloud,font_path是字體的路徑,不導入的話可能只會顯示一些框框,具體文字下載可以去網上找。mask是背景圖片。generate()里的是string類型的數據。
alice_mask = plt.imread(r'D:\壁紙\huge.jpg') # generate的是string類型的 word_cloud = WordCloud(font_path='msyh.ttc',mask=alice_mask,background_color='white', max_words=400, max_font_size=80).generate(out_str) plt.figure(figsize=(15,9)) plt.imshow(word_cloud, interpolation="bilinear") plt.axis('off') plt.show()
5、結果展示
不引入mask參數:

引入mask參數:

今天是8月8號,最近正好是巨人最新一話發布的時候,所以巨人的討論度很高。同時一直支撐着虎撲acg區熱度的海賊王討論度也很高,其次的關鍵詞還有 動畫,動漫,龍珠,艾倫,漫畫,情報等等。
6、需要改進的地方
(1)無關緊要的詞太多了,需要自寫停用詞表進行去停。如最后結果中的“是不是”,“覺得”等,這些詞都應該去掉
(2)引入mask的情況下,很多背景圖使用了最后卻沒有展示出來。有的背景圖可以,有的卻不可以。
最后,感謝觀看這篇博客。其中借鑒了許多網上的內容,感謝一些原作者的努力。
