一、寫在前面
最近復仇者聯盟4正在熱映中,很多人都去電影院觀看了電影,那么對於這部電影,看過的人都是怎么評價的呢?這時候爬蟲就可以派上用場了!
二、主要思路
首先打開豆瓣電影,然后進入復仇者聯盟4的詳情頁面:https://movie.douban.com/subject/26100958/,下拉頁面就可以找到這部電影的短評了:
雖然它顯示的短評有85751條,但是我們卻沒有辦法獲取所有的短評,在未登錄的情況下只能看到200條短評,登錄之后也只能得到500條短評,可是只有500條怎么夠呢?所以我們得想辦法得到盡量多的短評,思路為分別選擇好評、一般、短評和最新,不過最新的短評只顯示100條,所以我們能爬取的短評數量就是1600條。
當我們把短評爬取下來之后,可以先把短評數據保存到數據庫中,然后再對這些短評進行分析。這里我選擇用MongoDB數據庫來保存數據,然后使用SnowNLP進行情感分析,再使用jieba分詞和wordcloud生成詞雲。
三、主要代碼
1.模擬登錄
這一步是很重要的,我們需要帶着登錄之后的Cookie去發送請求才能得到數據,當然也可以打開瀏覽器登錄之后復制Cookie,具體怎么做看個人喜好。登錄豆瓣的url為:https://accounts.douban.com/passport/login?,抓一下包就知道怎么模擬登錄了,並沒有什么難度。代碼如下:
1 def login(self): 2 """ 3 模擬登錄 4 :return: 5 """ 6 url = "https://accounts.douban.com/j/mobile/login/basic" 7 data = { 8 "ck": "", 9 "name": self.username, 10 "password": self.password, 11 "remember": "false", 12 "ticket": "" 13 } 14 res = self.session.post(url, headers=self.headers, data=data) 15 print("登錄成功!歡迎用戶:", res.json()["payload"]["account_info"]["name"])
2.情感分析
SnowNLP是python中用來處理文本內容的,可以用來分詞、標注、文本情感分析等,情感分析是簡單的將文本分為兩類,積極和消極,返回值為情緒的概率,越接近1為積極,接近0為消極。代碼如下:
1 def analyze(self): 2 """ 3 情感分析 4 :return: 5 """ 6 result = self.col.find() 7 comments = [] 8 for i in result: 9 comments.append(i["評論"]) 10 sentiments_list = [] 11 for i in comments: 12 s = SnowNLP(i) 13 sentiments_list.append(s.sentiments) 14 plt.hist(sentiments_list, bins=np.arange(0, 1, 0.01), facecolor="g") 15 plt.xlabel('Sentiments Probability') 16 plt.ylabel('Quantity') 17 plt.title('Analysis of Sentiments') 18 plt.savefig("Sentiments.png") 19 print("情感分析完畢,生成圖片Sentiments.png")
3.生成詞雲
首先要用jieba對評論進行分詞,然后我們要設置一些停用詞,比如標點符號、“你”、“我”、“一部”、“電影”等詞語,最后使用wordcloud模塊生成詞雲圖片。代碼如下:
1 def generate(self): 2 """ 3 生成詞雲 4 :return: 5 """ 6 result = self.col.find() 7 comments = [] 8 for i in result: 9 comments.append(i["評論"]) 10 text = jieba.cut("\n".join(comments)) 11 12 # 文本清洗,去除標點符號和長度為1的詞 13 with open("stopwords.txt", "r", encoding='utf-8') as f: 14 stopwords = set(f.read().split("\n")) 15 stopwords.update({"一部", "一場", "電影", "小時", "分鍾"}) 16 # 使用圖片 17 mask = np.array(Image.open("Avengers.jpg")) 18 19 # 生成詞雲 20 wc = WordCloud( 21 mask=mask, 22 stopwords=stopwords, 23 font_path="font.ttf", 24 max_font_size=200, 25 min_font_size=20, 26 max_words=100, 27 width=1200, 28 height=800 29 ) 30 wc.generate(' '.join(text)) 31 wc.to_file('Avengers.png') 32 print("詞雲已生成,保存為Avengers.png。")
四、運行結果
首先是進入MongoDB數據庫查看數據:
然后是使用SnowNLP進行情感分析得到的結果,可見很多人都是很喜歡復仇者聯盟4的:
最后是生成的詞雲:
那么,對於看了電影的你,你會怎么評價這部電影呢?如果你沒有看過,會不會想要買一張電影票去看看呢?
完整代碼已上傳到GitHub!