[超詳細] Python3爬取豆瓣影評、去停用詞、詞雲圖、評論關鍵詞繪圖處理


爬取豆瓣電影《大偵探皮卡丘》的影評,並做詞雲圖和關鍵詞繪圖
第一步:找到評論的網頁url。
https://movie.douban.com/subject/26835471/comments?start=0&limit=20&sort=new_score&status=P
第二步:鼠標放在評論上右鍵檢查,分析源代碼,確定抓取的內容。

<span class="short">萌就行了!這個世界觀感覺夢想成真了!</span>
1
如上,只要抓取該標簽下的文本就好,這里可以用正則表達式,里面的文本內容用(.*?)抓取。

第三步:觀察分頁情況。
點擊下一頁,發現鏈接變為:
https://movie.douban.com/subject/26835471/comments?start=20&limit=20&sort=new_score&status=P
發現只有start=后面的數字改變,每頁20條評論,每頁*20即可

導入模塊
這些模塊可在cmd下輸入pip install 模塊名,或者pycharm中setting-Project Interpreter里右邊的+號安裝

import requests
import re
from wordcloud import WordCloud
import jieba
from PIL import Image
import jieba.analys
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
1
2
3
4
5
6
7
8
9
10
1、用requests獲取url
因為爬蟲次數較多可能IP被封,所以找了個代理IP,參數里習慣性加上headers偽裝成瀏覽器訪問。

def getHtml(url):
# 獲取url頁面
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'}
proxies = {'http': '61.135.217.7:80'}
response = requests.get(url, headers=headers, proxies=proxies)
response.encoding = 'utf-8'
return response.text
1
2
3
4
5
6
7
8
2、用正則解析網頁,提取文本,返回評論列表
def getComment(url):
# 用正則提取評論文本,返回一個列表
html = getHtml(url) #調用上一個函數
comments = re.findall('<span class="short">(.*?)</span>', html, re.S) # re.S記得加上,空字符串
onepageComments = [] # 創建一個空列表,存放評論
#用正則表達式解析出來的是一個列表,遍歷列表,將每一個評論取出,添加到空列表里,每個評論后面換行
for i in comments:
onepageComments.append(i + '\n')
return onepageComments
1
2
3
4
5
6
7
8
9
3、分頁、函數回調,寫入本地文件
if __name__ == '__main__':
f = open(r'大偵探皮卡丘部分影評.txt', 'w', encoding='utf-8')
#這里抓取10頁內容,如果太多頁可能需要登錄豆瓣賬號,然后在requests.get參數中增加一個cookies參數即可瀏覽后面的評論
for page in range(10):
url = 'https://movie.douban.com/subject/26835471/comments?start=' + str(
20 * page) + '&limit=20&sort=new_score&status=P' # 分頁
# print('第%s頁的評論:' % (page+1)) #這里可以知道正在爬取的是第幾頁的評論,方便自己核對
for i in getComment(url):
f.write(i) # 將每一頁評論都寫入本地文件中
# print(i) # 打印所有評論
# print('\n') # 每頁換行
1
2
3
4
5
6
7
8
9
10
11
4、詞雲圖
先將抓取的文件打開,注意編碼

comments = open('大偵探皮卡丘部分影評.txt', 'r', encoding='utf-8').read()
1
以下詞雲圖分幾種情況,都可以嘗試跑一遍看看效果,最全面的可以直接看第3小點。

4.1 如果不分詞
wc = WordCloud(background_color='white', # 設置背景顏色
font_path="C:\Windows\Fonts\msyh.ttf", # 設置中文字體
max_font_size=60, # 設置字體最大值
random_state=30, # 設置有多少種隨機生成狀態,即有多少種配色方案
width=800,
height=600
).generate(comments) # 生成詞雲
# 展示詞雲圖
plt.figure(figsize=(20, 10)) #設置畫布大小
plt.imshow(wc, interpolation='bilinear')
plt.axis("off") #去掉坐標軸
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
4.2 jieba分詞
wordlist = jieba.cut(str(comments), cut_all=False) #精確模式
wl = " ".join(wordlist)
wc = WordCloud(background_color='white', # 設置背景顏色
font_path="C:\Windows\Fonts\msyh.ttf", # 設置中文字體
max_font_size=60, # 設置字體最大值
random_state=30, # 設置有多少種隨機生成狀態,即有多少種配色方案
width=800,
height=600
).generate(wl) # 注意這里面的參數是wl
# 展示詞雲圖
plt.figure(figsize=(20, 10)) #設置畫布大小
plt.imshow(wc, interpolation='bilinear')
plt.axis("off") #去掉坐標軸
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
4.3 結巴分詞,加上萌圖,去停用詞,並保存圖片
相關的模塊要導進來
這里有一個哈工大停用詞表,可自行網上下載
然后下載一張詞雲用的背景圖(我這里是pikaqiu.png,一張皮卡丘的圖)

wordlist = jieba.cut(str(comments), cut_all=False) #精確模式
wl = " ".join(wordlist)
# 設置背景圖
mask = np.array(Image.open('pikaqiu.png', 'r'))
# 設置停用詞
stopwords_file = open('哈工大停用詞表.txt', 'r')
stopwords = [words.strip() for words in stopwords_file.readlines()]
# 設置詞雲(里面多加了幾個參數)
wc = WordCloud(background_color='white', # 設置背景顏色
mask=mask, # 設置背景圖片
max_words=2000, # 設置最大詞數
stopwords=stopwords, # 設置停用詞
font_path="C:\Windows\Fonts\msyh.ttf", # 設置中文字體
max_font_size=60, # 設置字體最大值
random_state=30, # 設置有多少種隨機生成狀態,即有多少種配色方案
width=600,
height=800
).generate(wl) # 生成詞雲

# 展示詞雲圖
plt.figure(figsize=(8, 6)) #設置畫布大小
plt.imshow(wc, interpolation='bilinear')
plt.axis("off") #去掉坐標軸
plt.show()
wc.to_file('result.jpg') #存為圖片
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
到這里基本就完成了

5、取前20個評論關鍵詞
# withWeight=True一並返回關鍵詞、權重值
keywords = jieba.analyse.extract_tags(
comments, topK=20, withWeight=True, allowPOS=("n", "v")) # 指定名詞和動詞

# 變成dataframe格式
comm = pd.DataFrame(keywords)
for item in keywords:
print(item[0], item[1])

# 設置畫布大小
plt.figure(figsize=(10, 8))
#顯示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 畫圖
plt.bar(comm[0], comm[1], color="c")
# 設置標簽,標題,調整大小
plt.xlabel('詞語', fontsize=20)
plt.ylabel('權重', fontsize=20)
plt.title('評論詞頻', fontsize=20)
plt.tick_params(labelsize=10)
# 在每個直條上加標簽
for a, b in zip(comm[0], comm[1]):
plt.text(a, b, '%.2f' % b, ha='center', va='bottom', fontsize=10)
plt.show(http://www.my516.com)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

---------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM