评价一部电影除了评分、票房之外,小编觉得影评也是一项重要的指标,所以我们就用豆瓣电影上对《后来的我们》影评进行分析。
看了这篇文章,你能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亿票房,但它的口碑并不好,可能真的存在“炒作”的现象。小伙伴们有什么看法,可以在下方留言。
喜欢我的文章请关注微信公众号:追梦程序员。