評價一部電影除了評分、票房之外,小編覺得影評也是一項重要的指標,所以我們就用豆瓣電影上對《後來的我們》影評進行分析。
看了這篇文章,你能get到的技能如下:
1.使用Python爬取數據。
2.使用Java進行中文分詞,並統計詞語頻數。
巧婦難爲無米之炊,下面我們就使用Python爬取豆瓣電影上對《後來的我們》的影評。此次使用到的Python庫有request、BeautifulSoup、UserAgent。
requests庫的主要作用:根據鏈接地址得到HTML頁面的源代碼。
BeautifulSoup庫的主要作用:解析HTML文檔,使用戶方便提取所需內容。
UserAgent庫的主要作用:用於生成隨機的User-agent。
通過對豆瓣電影的分析,我們知道影評的鏈接格式爲https://movie.douban.com/subject/26683723/comments?start={影評起始條數}&limit=20&sort=new_score&status=P&percent_type=,並且影評起始條數的值也是有規律的,以0開始,每次加20即可。
再分析HTML頁面的源代碼,我們知道每一條影評信息存放在一個名爲comment的div標籤下,在此div標籤下有名爲comment-time的span標籤,存放此影評的發表時間,有一個p標籤存放具體的影評文字。我們都可以通過BeautifulSoup庫獲相應標籤下的內容。
我們把每一個頁面的所有影評信息存放在本地創建的txt文件中。爬取影評的Python代碼如下。
"""
採集豆瓣上《後來的我們》影評
"""
import requests
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import time
#從指定url下載HTML網頁
def get_page(url, options={}):
ua = UserAgent()
base_headers = {
'User-Agent': ua.random
}
headers = dict(base_headers, **options)
try:
r = requests.get(url, headers=headers)
if r.status_code == 200:
r.encoding=r.apparent_encoding
return r.text
except ConnectionError:
return None
start = 0
while start <= 200:
time.sleep(5)
fileName = "E:\\閒時程序代碼\\python\\後來的我們\\影評\\douban" + str(start) + ".txt"
f = open(fileName, "w",encoding='utf-8')
comments = [] #要寫入的影評字符串列表
url = "https://movie.douban.com/subject/26683723/comments?start=" + str(start) + "&limit=20&sort=new_score&status=P&percent_type="
text = get_page(url)
if text is not None:
soup = BeautifulSoup(text, 'html.parser')
commentDivs = soup.find_all('div', 'comment')
for each in commentDivs:
commentinfo = each.find('span','comment-info')
commenttime = str(commentinfo.find('span','comment-time ')['title'])
content = ""
for i, string in enumerate(each.find('p')):
if i == 0:
content = string
content = content.replace("\n",",")
content.encode(encoding='utf-8',errors="ignore")
comments.append(commenttime + " \t" + content + "\n")
f.writelines(comments)
print(str(start) + " :成功")
else:
print(str(start) + " :失敗")
start += 20
爬取成功後,在本地文件中有如下txt文件。
其中douban0.txt文件下內容如下。
有了影評數據,我們就可以進一步的進行分析了。我們對所有的影評文字進行一箇中文分詞處理。其中要用到的第三方jar包有 ansj_seg.jar nlp-lang.jar。
ansj_seg.jar的主要作用:對中文字符串進行詞意分詞。
nlp-lang.jar的主要作用:對分詞提供支持。
進行分詞的Java代碼如下。
package ChineseSplit;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.ansj.domain.Result;
import org.ansj.splitWord.analysis.ToAnalysis;
/**
* 對《後來的我們》影評進行中文分詞處理
* @author liuchen
*
*/
public class Main {
public static void main(String[] args) throws IOException {
String str = ""; //存放所有影評字符
String filepath = "E:\\閒時程序代碼\\python\\後來的我們\\影評";
File file = new File(filepath);
String[] filelist = file.list();
for (int i = 0; i < filelist.length; i++) {
InputStreamReader isr = new InputStreamReader(new FileInputStream(filepath + "\\" + filelist[i]), "utf-8");
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s = br.readLine())!=null){
str += s.trim().split("\t")[1];
}
br.close();
}
Result r = ToAnalysis.parse(str); //返回分詞結果
String[] words = r.toStringWithOutNature("\t").split("\t"); //輸出沒有詞性的分詞結果 以製表符分開
Map<String, Integer> map = new HashMap<String, Integer>(); //使用HashMap統計詞語次數
for(int i=0; i<words.length;i++){
if(map.containsKey(words[i])){
map.put(words[i], map.get(words[i])+1);
}else{
map.put(words[i], 1);
}
}
for (Entry<String, Integer> entry : map.entrySet()) { //輸出分詞結果
System.out.println(entry);
}
}
}
對分詞結果進行人工去除標點符號、人稱代詞等,小編將能反映電影情節的詞語的出現次數進行降序排序,結果如下。
將影評文字做成的詞雲圖如下所示。
通過上面的分析,小編個人覺得《後來的我們》雖然已經取得了10億票房,但它的口碑並不好,可能真的存在“炒作”的現象。小夥伴們有什麼看法,可以在下方留言。
喜歡我的文章請關注微信公衆號:追夢程序員。