前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手把手教你用Python分析豆瓣电影——以《我不是药神》《邪不压正》为例

手把手教你用Python分析豆瓣电影——以《我不是药神》《邪不压正》为例

作者头像
CDA数据分析师
发布于 2018-07-30 07:40:05
发布于 2018-07-30 07:40:05
1.6K00
代码可运行
举报
文章被收录于专栏:CDA数据分析师CDA数据分析师
运行总次数:0
代码可运行

作者 Ctipsy,转载需授权

《我不是药神》是由文牧野执导,宁浩、徐峥共同监制的剧情片,徐峥、周一围、王传君、谭卓、章宇、杨新鸣等主演 。影片讲述了神油店老板程勇从一个交不起房租的男性保健品商贩程勇,一跃成为印度仿制药“格列宁”独家代理商的故事。

该片于2018年7月5日在中国上映。上映之后获得一片好评,不少观众甚至直呼“中国电影希望”,“《熔炉》、《辩护人》之类写实影片同水准”,诚然相较于市面上一众的抠图贴脸影视作品,《药神》在影片质量上确实好的多,不过我个人觉得《药神》的火爆还有以下几个原因:

  • 影片题材稀少带来的新鲜感,像这类”针砭时弊” 类影视作品,国内太少。
  • 顺应潮流,目前《手机》事件及其带来的影响和国家层面文化自信的号召以及影视作品水平亟待提高的大环境下,《药神》的过审与上映本身也是对该类题材一定程度的鼓励。
  • 演员靠谱、演技扎实,这个没的说,特别是王传君的表现,让人眼前一亮。

本文通过爬取《我不是药神》和《邪不压正》豆瓣电影评论,对影片进行可视化分析。

截止7月13日:《我不是药神》豆瓣评分:8.9 分,猫眼:9.7 分,时光网:8.8 分 。

截止7月13日: 《邪不压正》 豆瓣评分:7.2 分,猫眼:7.4 分,时光网:7.3 分 。 豆瓣的评分质量相对而言要靠谱点,所以本文数据来源也是豆瓣。

0. 需求分析

  • 获取影评数据
  • 清洗分析存储数据
  • 分析展示影评城市来源、情感
  • 分时展示电影评分趋势
  • 当然主要是用来熟练pandas和爬虫及可视化技能

1. 前期准备

1.1 网页分析

豆瓣从2017.10月开始全面禁止爬取数据,仅仅开放500条数据,白天1分钟最多可以爬取40次,晚上一分钟可爬取60次数,超过此次数则会封禁IP地址

tips发现 实际操作发现,点击影片评论页面的后页时,url中的一个参数start会加20,但是如果直接赋予’start’每次增加10,网页也是可以存在的!

  • 登录状态下,按网页按钮点击后页start最多为480,也就是20*25=500条
  • 非登录状态下,最多为200条
  • 登录状态下,直接修改url的方法可以比官方放出的评论数量多出了一倍!!!

1.2 页面布局分析

本次使用xpath解析,因为之前的博客案例用过正则,也用过beautifulsoup,这次尝试不一样的方法。

如下图所示,本此数据爬取主要获取的内容有:

  • 评论用户ID
  • 评论内容
  • 评分
  • 评论日期
  • 用户所在城市

城市信息获取

评论页面没有城市信息,因此需要通过进入评论用户主页去获取城市信息元素。

通过分析页面发下,用户ID名称里隐藏着主页链接!所以我的思路就是request该链接,然后提取城市信息。

2. 数据获取-爬虫

2.1 获取cookies

因为豆瓣的爬虫限制,所以需要使用cookies作身份验证,通过chrome获取cooikes位置如下图:

2.2 加载cookies与headers

下面的cookie被修改了,诸君需要登录后自己获取专属cookieo(∩_∩)o

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    cookies = {'cookie': 'bid=GOOb4vXwNcc; douban-fav-remind=1; viewed="27611266_26886337"; ps=y; ue="citpys原创分享@163.com"; " \
                   "push_noty_num=0; push_doumail_num=0; ap=1; loc-last-index-location-id="108288"; ll="108288"; dbcl2="187285881:N/y1wyPpmA8"; ck=4wlL'}
    url = "https://movie.douban.com/subject/" + str(id) + "/comments?start=" + str(page * 10) + "&limit=20&sort=new_score&status=P"
    res = requests.get(url, headers=headers, cookies=cookies)
    res.encoding = "utf-8"
    if (res.status_code == 200):
        print("\n第{}页短评爬取成功!".format(page + 1))
        print(url)
    else:
        print("\n第{}页爬取失败!".format(page + 1))

一般刷新页面后,第一个请求里包含了cookies。

2.3 延时反爬虫

设置延时发出请求,并且延时的值还保留了2位小数(自我感觉模拟正常访问请求会更加逼真…待证实)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
time.sleep(round(random.uniform(1, 2), 2))

2.4 解析需求数据

这里有个大bug,找了好久!

因为有的用户虽然给了评论,但是没有给评分,所以score和date这两个的xpath位置是会变动的。

所以需要加判断,如果发现score里面解析的是日期,证明该条评论没有给出评分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    name = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/a/text()'.format(i))
    # 下面是个大bug,如果有的人没有评分,但是评论了,那么score解析出来是日期,而日期所在位置spen[3]为空
    score = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/span[2]/@title'.format(i))
    date = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/span[3]/@title'.format(i))
    m = '\d{4}-\d{2}-\d{2}'
    match = re.compile(m).match(score[0])
    if match is not None:
        date = score
        score = ["null"]
    else:
        pass
    content = x.xpath('//*[@id="comments"]/div[{}]/div[2]/p/span/text()'.format(i))
    id = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/a/@href'.format(i))
    try:
        city = get_city(id[0], i)  # 调用评论用户的ID城市信息获取
    except IndexError:
        city = " "
    name_list.append(str(name[0]))
    score_list.append(str(score[0]).strip('[]\''))  # bug 有些人评论了文字,但是没有给出评分
    date_list.append(str(date[0]).strip('[\'').split(' ')[0])
    content_list.append(str(content[0]).strip())
    city_list.append(city)

2.5 获取电影名称

从url上只能获取电影的subject的8位ID数值,引起需要自行解析网页获取ID号对应的电影名称,该功能是后期改进添加的,因此为避免现有代码改动多(偷个懒),采用了全局变量赋值给movie_name,需要注意全局变量调用时,要加global声明一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    pattern = re.compile('<div id="wrapper">.*?<div id="content">.*?<h1>(.*?) 短评</h1>', re.S)
    global movie_name
    movie_name = re.findall(pattern, res.text)[0]  # list类型

3. 数据存储

因为数据量不是很大,因为普通csv存储足够,把获取的数据转换为pandas的DF格式,然后存储到csv文件中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    infos = {'name': name_list, 'city': city_list, 'content': content_list, 'score': score_list, 'date': date_list}
    data = pd.DataFrame(infos, columns=['name', 'city', 'content', 'score', 'date'])
    data.to_csv(str(ID) + "_comments.csv")

因为考虑到代码的复用性,所以main函数中传入了两个参数。

  • 一个是待分析影片在豆瓣电影中的ID号(这个可以在链接中获取到,是一个8位数。
  • 一个是需要爬取的页码数,一般设置为49,因为网站只开放500条评论。

另外有些电影评论有可能不足500条,所以需要调整,之前尝试通过正则匹配分析页面结构。

4. 数据清洗

爬取出来的结果如下:

4.1 城市信息清洗

从爬取的结果分析可以发现,城市信息数据有以下问题:

  • 有城市空缺
  • 海外城市
  • 乱写
  • pyecharts尚不支持的城市,目前支持的城市列表可以看到Github相关链接: https://github.com/pyecharts/pyecharts/blob/master/pyecharts/datasets/city_coordinates.json

step1: 过滤筛选中文字

通过正则表达式筛选中文,通过split函数提取清理中文,通过sub函数替换掉各类标点符号。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    line = str.strip()
    p2 = re.compile('[^\u4e00-\u9fa5]')  # 中文的编码范围是:\u4e00到\u9fa5
    zh = " ".join(p2.split(line)).strip()
    zh = ",".join(zh.split())
    str = re.sub("[A-Za-z0-9!!,%\[\],。]", "", zh)

step2: 匹配pyecharts支持的城市列表

一开始我不知道该库有城市列表资料(只找了官网,没看github)所以使用的方法如下,自己上网找中国城市字典,然后用excel 筛选和列表分割功能快速获得一个不包含省份和’市’的城市字典,然后匹配。后来去github上issue了下,发现有现成的字典文件,一个json文本,得到的回复如下(^__^)。

这样就方便了,直接和这个列表匹配就完了,不在里面的话,直接list.pop就可以了 但是这样还有个问题,就是爬取下来的城市信息中还包含着省份,而pyecharts中是不能带省份的,所以还需要通过分割,来提取城市,可能存在的情况有:

· 两个字:北京 · 三个字:攀枝花 · 四个字:山东烟台 · 五个字:四川攀枝花 · 六个字:黑龙江哈尔滨 …

因此我做了简化处理:

  • 名称为2~4的,如果没匹配到,则提取后2个字,作为城市名。
  • 名称为>4的,如果没匹配到,则依次尝试提取后面5、4、3个字的。
  • 其余情况,经过观察原始数据发现数量极其稀少,可以忽略不作处理。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        d = pd.read_csv(csv_file, engine='python', encoding='utf-8')
        for i in d['city'].dropna():       # 过滤掉空的城市
            i = translate(i)  # 只保留中文
            if len(i)>1 and len(i)<5:  # 如果名称个数2~4,先判断是否在字典里
                if i in fth:
                    citys.append(i)
                else:
                    i = i[-2:]  # 取城市名称后两个,去掉省份
                    if i in fth:
                        citys.append(i)
                    else:
                        continue
            if len(i) > 4:
                if i in fth:   # 如果名称个数>2,先判断是否在字典里
                    citys.append(i)
                if i[-5:] in fth:
                    citys.append(i[-5:])
                    continue
                if i[-4:] in fth:
                    citys.append(i[-4:])
                    continue
                if i[-3:] in fth:
                    citys.append(i[-3:])
                else:
                    continue
        result = {}
        while '' in citys:
            citys.remove('')  # 去掉字符串中的空值
        print("城市总数量为:",len(citys))
        for i in set(citys):
            result[i] = citys.count(i)
        return result

但是这样可能还有漏洞,所以为保证程序一定不出错,又设计了如下校验模块:

思路就是,循环尝试,根据xx.add()函数的报错,确定城市名不匹配,然后从list中把错误城市pop掉,另外注意到豆瓣个人主页上的城市信息一般都是是到市,那么县一级的区域就不考虑了,这也算是一种简化处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while True:   # 二次筛选,和pyecharts支持的城市库进行匹配,如果报错则删除该城市对应的统计
    try:
        attr, val = geo.cast(info)
        geo.add("", attr, val, visual_range=[0, 300], visual_text_color="#fff", is_geo_effect_show=False,
                is_piecewise=True, visual_split_number=6, symbol_size=15, is_visualmap=True)
    except ValueError as e:
        e = str(e)
        e = e.split("No coordinate is specified for ")[1]  # 获取不支持的城市名称
        info.pop(e)
    else:
        break

5. 基于snownlp的情感分析

snownlp主要可以进行中文分词(算法是Character-Based Generative Model)、词性标注(原理是TnT、3-gram 隐马)、情感分析(官网木有介绍原理,但是指明购物类的评论的准确率较高,其实是因为它的语料库主要是购物方面的,可以自己构建相关领域语料库,替换原来的,准确率也挺不错的)、文本分类(原理是朴素贝叶斯)、转换拼音、繁体转简体、提取文本关键词(原理是TextRank)、提取摘要(原理是TextRank)、分割句子、文本相似(原理是BM25)。

官网还有更多关于该库的介绍,在看本节之前,建议先看一下官网,里面有最基础的一些命令的介绍。 官网链接:https://pypi.org/project/snownlp/

由于snownlp全部是unicode编码,所以要注意数据是否为unicode编码。因为是unicode编码,所以不需要去除中文文本里面含有的英文,因为都会被转码成统一的编码上面只是调用snownlp原生语料库对文本进行分析,snownlp重点针对购物评价领域,所以为了提高情感分析的准确度可以采取训练语料库的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
attr, val = [], []
info = count_sentiment(csv_file)
info = sorted(info.items(), key=lambda x: x[0], reverse=False)  # dict的排序方法
for each in info[:-1]:
    attr.append(each[0])
    val.append(each[1])
line = Line(csv_file+":影评情感分析")
line.add("", attr, val, is_smooth=True, is_more_utils=True)
line.render(csv_file+"_情感分析曲线图.html")

6. 数据可视化与解读

6.0 文本读取

在后面的commit版本中,我最终只传入了电影的中文名字作为参数,因此相较于之前的版本,在路径这一块儿需要做写调整。由于python不支持相对路径下存在中文,因此需要做如下处理:

  • step1 获取文件绝对路径
  • step2 转换路径中的\\\
  • step3 如果还报错,在read_csv中加参数read_csv(csv_file, engine='python', encoding='utf-8')
  • 注意: python路径中,如果最后一个字符为\会报错,因此可以采取多段拼接的方法解决。

完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
path = os.path.abspath(os.curdir)
csv_file = path+ "\\" + csv_file +".csv"
csv_file = csv_file.replace('\\', '\\\\')

6.1 评论来源城市分析

调用pyecharts的page函数,可以在一个图像对象中创建多个chart,只需要对应的add即可。

城市评论分析的思路如下:

  • 经过步骤4的的清洗处理之后,获得形如[("青岛", 9),("武汉", 12)]结构的数据。
  • 通过循环试错,把不符合条件的城市信息pop掉。 except ValueError as e: e = str(e) e = e.split("No coordinate is specified for ")[1] # 获取不支持的城市名称 info.pop(e)
  • 遍历dict,抽取信息赋值给attrval为画图做准备。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for key in info:
    attr.append(key)
    val.append(info[key])

函数代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    geo1 = Geo("", "评论城市分布", title_pos="center", width=1200, height=600,
            background_color='#404a59', title_color="#fff")
    geo1.add("", attr, val, visual_range=[0, 300], visual_text_color="#fff", is_geo_effect_show=False,
            is_piecewise=True, visual_split_number=10, symbol_size=15, is_visualmap=True, is_more_utils=True)
    #geo1.render(csv_file + "_城市dotmap.html")
    page.add_chart(geo1)
    geo2 = Geo("", "评论来源热力图",title_pos="center", width=1200,height=600, background_color='#404a59', title_color="#fff",)
    geo2.add("", attr, val, type="heatmap", is_visualmap=True, visual_range=[0, 50],visual_text_color='#fff', is_more_utils=True)
    #geo2.render(csv_file+"_城市heatmap.html")  # 取CSV文件名的前8位数
    page.add_chart(geo2)
    bar = Bar("", "评论来源排行", title_pos="center", width=1200, height=600 )
    bar.add("", attr, val, is_visualmap=True, visual_range=[0, 100], visual_text_color='#fff',mark_point=["average"],mark_line=["average"],
            is_more_utils=True, is_label_show=True, is_datazoom_show=True, xaxis_rotate=45)
    #bar.render(csv_file+"_城市评论bar.html")  # 取CSV文件名的前8位数
    page.add_chart(bar)
    pie = Pie("", "评论来源饼图", title_pos="right", width=1200, height=600)
    pie.add("", attr, val, radius=[20, 50], label_text_color=None, is_label_show=True, legend_orient='vertical', is_more_utils=True, legend_pos='left')
    #pie.render(csv_file + "_城市评论Pie.html")  # 取CSV文件名的前8位数
    page.add_chart(pie)
    page.render(csv_file + "_城市评论分析汇总.html")

从上图可以看出,《我不是药神》的观影人群中,排名前十的城市依次为 北京、上海、南京、杭州、深圳、广州、成都、长沙、重庆、西安

而相对的《邪不压正》观影人群,排名前十依次为 北京、上海、广州、成都、杭州、南京、西安、深圳、长沙、哈尔滨

电影消费是城市消费的一部分,某种程度上可以作为观察一个城市活力的指标。上述城市大都在近年的GDP排行中居上游,消费力强劲。

但是我们不能忽略城市人口基数和荧幕数量的因素。一线大城市的荧幕数量总额是超过其他二三线城市的,大城市人口基数庞大,极多的荧幕数量和座位、极高密度的排片场次,让诸多人便捷观影,这样一来票房自然就比其他城市高出不少,活跃的观众评论也多。

6.2 评论情感分析

0.5以下为负面情绪,0.5以上为正面情绪,因为电影好评太多,为了图形的合理性(让低数值的统计量也能在图中较明显的展示),把评论接近1的去掉了。当然按理说情绪正面性到1的应该很少,出现这种结果的原因我觉得是语料库的锅。

6.3 电影评分走势分析

思路如下:

  • 读取csv文件,以dataframe(df)形式保存
  • 遍历df行,保存到list
  • 统计相同日期相同评分的个数,例如dict类型 ('很差', '2018-04-28'): 55
  • 转换为df格式,设置列名 info_new.columns = ['score', 'date', 'votes']
  • 按日期排序, info_new.sort_values('date', inplace=True)
  • 遍历新的df,每个日期的评分分为5种,因此需要插入补充缺失数值。

补充缺失数值

创建新df,遍历匹配各种评分类型,然后插入行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
creat_df = pd.DataFrame(columns = ['score', 'date', 'votes']) # 创建空的dataframe
    for i in list(info_new['date']):
        location = info_new[(info_new.date==i)&(info_new.score=="力荐")].index.tolist()
        if location == []:
            creat_df.loc[mark] = ["力荐", i, 0]
            mark += 1
        location = info_new[(info_new.date==i)&(info_new.score=="推荐")].index.tolist()
        if location == []:
            creat_df.loc[mark] = ["推荐", i, 0]
            mark += 1
        location = info_new[(info_new.date==i)&(info_new.score=="还行")].index.tolist()
        if location == []:
            creat_df.loc[mark] = ["还行", i, 0]
            mark += 1
        location = info_new[(info_new.date==i)&(info_new.score=="较差")].index.tolist()
        if location == []:
            creat_df.loc[mark] = ["较差", i, 0]
            mark += 1
        location = info_new[(info_new.date==i)&(info_new.score=="很差")].index.tolist()
        if location == []:
            creat_df.loc[mark] = ["很差", i, 0]
            mark += 1
    info_new = info_new.append(creat_df.drop_duplicates(), ignore_index=True)

细节

由于遍历匹配时,抽取的评分等级和上文代码中的“力荐”、“推荐”、“还行”、“较差”、“很差”次序可能不一致,因此最后会有重复值出现,所以在拼接两个df时,需要duplicates()去重。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
info_new = info_new.append(creat_df.drop_duplicates(), ignore_index=True)

之后就可以遍历df取数画图了(第二中遍历df的方法)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for index, row in info_new.iterrows():   # 第二种遍历df的方法
    score_list.append([row['date'], row['votes'], row['score']])

前面还提到了一种遍历方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for indexs in d.index:  # 一种遍历df行的方法
    d.loc[indexs].values[:])

从上述日评分投票走势图可以发现,在影片上映开始的一周内,为评论高峰,尤其是上映3天内,这符合常识,但是也可能有偏差,因为爬虫获取的数据是经过豆瓣电影排序的,倘若数据量足够大得出的趋势可能更接近真实情况。

另外发现,影片在上映前也有部分评论,分析可能是影院公映前的小规模试映,且这些提前批的用户的评分均值,差不多接近影评上映后的大规模评论的最终评分 ,从这些细节中,我们或许可以猜测,这些能提前观看影片的,可能是资深影迷或者影视从业人员,他们的评论有着十分不错的参考价值。

那么日后在观看一部尚未搬上大荧幕的影片前,我们是否可以通过分析这些提前批用户的评价来决定是否掏腰包去影院避免邂逅烂片呢?

6.4 影评词云图

思路如下:

  • 读取csv文件,以dataframe(df)形式保存
  • 去除评论中非中文文本
  • 选定词云背景
  • 调整优化停用词表

姜文背景图

《邪不压正》词云图

台词

从词云图中可以探究到,评论多次提到“台词”,《邪不压正》的台词确实依旧带着浓浓的姜文味,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
一、治脚吗?不治。治治吧。不治。治治。《邪不压正》
二、怎么相信一个写日记的人。《邪不压正》
三、“我就是为了这醋,包了一顿饺子”。《邪不压正》
四、冰川期就要来了,海平面降低了,那几个岛越来越大,跟澳大利亚连一块儿了。《邪不压正》
五、你总是给自己设置障碍,因为你不敢。《邪不压正》
六、正经人谁写日记啊。《邪不压正》
七、都是同一个师傅教的,破不了招啊。《邪不压正》
八、你对我开枪,不怕杀了我,不怕。你不爱我,傻瓜,子弹是假的。《邪不压正》
九、外国男人只想乱搞,中国男人都想成大事。《邪不压正》
十、老蒋更不可靠,一个写日记的人能可靠吗,正经人谁写日记啊?《邪不压正》
十一、你每犯一次错,就会失去一个爸爸。《邪不压正》
十二、谁把心里话写日记里啊,日记这玩意本来就不是给外人看,要是给外人看了,就俩字下贱!《邪不压正》
十三    、咳咳…还等什么呢。——姜文《邪不压正》
十四、我当时问你在干嘛,你拿着肘子和我说:真香。《邪不压正》
十五、“我要报仇!”“那你去呀!你不敢?”“我等了十五年了,谁说我不敢?”“那你为什么不去,你不敢”“对,我不敢”《邪不压正》

喜欢

虽然这部影片评分和姜文之前的优秀作品相比显得寒酸,但是观众们依旧对姜导演抱有期望支持和喜爱,期待他后续更多的精彩作品;程序刚跑完,词云里突然出现个爸爸,让我卡顿了(PS:难道程序bug了???),接着才想起来是影片中的姜文饰演的蓝爸爸,以此称呼姜导,可见铁杆粉丝的满满爱意~

一步之遥

同时可以发现评论中,姜文的另一部作品《一步之遥》也被提及较多。诚然,《邪不压正》确实像是《让子弹飞》和《一步之遥》的糅合,它有着前者的邪性与潇洒,又带有后者的戏谑和浪漫。因而喜欢《一步之遥》的观众会爱上本片,反之不待见的观众也会给出《一步之遥》的低分。

徐峥背景图

《我不是药神》词云图

高频重点词汇有:

  • 中国
  • 题材
  • 现实
  • 煽情
  • 社会
  • 故事
  • 好看
  • 希望

词云分析结果展现出的强烈观感有一部分原因是《我不是药神》的意外之喜,宁浩和徐峥两个喜剧界的领军人物合作,很自然的以为会是喜剧路数,谁能想到是一部严肃的现实题材呢?

倘若是尚未观看本片的读者,仅从情感分析的角度看,我相信也可以下对本片下结论:值得去影院体验的好电影。正如我在文章开篇所说,《药神》的诞生,给中国当前的影片大环境带来了一股清流,让人对国产电影的未来多了几分期许。

7. 总结

  • 练习一下pandas操作和爬虫。
  • 没有自己构建该领域的语料库,如果构建了相关语料库,替换默认语料库,情感分析准确率会高很多。所以语料库是非常关键的,如果要正式进行文本挖掘,建议要构建自己的语料库。
  • pyecharts画图挺别致的。

附录一下爬取分析的“邪不压正”的电影数据,因为图形和分析过程相似,所以就不单独放图了,(ps:姜文这次没有给人带来太大的惊喜==)

视频:《邪不压正》——Python数据分析

Github完整代码: https://github.com/Ctipsy/DA_projects/tree/master/%E6%88%91%E4%B8%8D%E6%98%AF%E8%8D%AF%E7%A5%9E

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CDA数据分析师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ASP.NET MVC 2的代码以MS-PL协议开源发布
微软已经宣布ASP.NET MVC 2的代码以MS-PL协议发布,MS-PL是一个得到OSI认证的开源协议,ASP.NET MVC基于MS-PL发布,是一个真正的开源框架且没有任何平台限制,也就是说,您可以在mono下使用或开发ASP.NET MVC的相关项目。 可以到ASP.NET MVC 2 RTM Download Details page获取源代码,或者到CodePlex上获取,这个页面是微软官方的下载地址,可以在下载页面上查看这个文件 mvc2-ms-pl.zip。 另外ASP.NET MVC1向
张善友
2018/01/31
8060
ASP.NET MVC 2 转换工具
似水流年报告了ASP.NET MVC 2 正式发布,那么我们有许多ASP.NET MVC 1.0的程序需要移植到2.0怎么办呢?Eilon Lipton 已经发布了一篇博文 migration tool for converting ASP.NET MVC 1 application projects,为我们的Visual Studio 2008的MVC项目的迁移准备好工具,主要工作就是转化项目类型,更新程序集的引用和生成配置信息,添加一些新的script文件。 如果你想把项目迁移到Visual Studi
张善友
2018/01/22
1.5K0
ASP.NET MVC 2 转换工具
Orchard 发布1.0版本和ASP.NET MVC 3 RTM
Orchard是一个免费和开源的社区交流项目,致力于在ASP.NET平台开发应用程序和可重用性组件。它将创建用于ASP.Net应用和扩展的共享组件,以及修改这些组件以便使其应用于终端用户,脚本人员和开发者。我们也寻求与现有的应用程序的作者建立伙伴关系,以帮助他们实现自己的目标。Orchard作为ASP.Net 开源系统的一部分发布,隶属于Outercurve Foundation(微软有一个开源项目托管平台CodePlex.com,而CodePlex基金会则是一个促进企业和社区在开源方面展开合作的非营利组织
张善友
2018/01/30
1.1K0
Orchard 发布1.0版本和ASP.NET MVC 3 RTM
ASP.NET Core: 全新的ASP.NET !
背景 最新版本的 ASP.NET 叫做 ASP.NET Core (也被称为 ASP.NET 5)   它颠覆了过去的 ASP.NET。 什么是 ASP.NET Core? ASP.NET Core
葡萄城控件
2018/01/10
11.9K0
ASP.NET Core: 全新的ASP.NET !
ASP.NET MVC 4, ASP.NET Web API 和ASP.NET Web Pages v2(Razor)现在都是开源了
[原文发表地址] ASP.NET MVC 4, ASP.NET Web API and ASP.NET Web Pages v2 (Razor) now all open source with contributions [原文发表时间] 2012-03-28 12:05 星期二快乐 !它确实是快乐的一天, (字面上这一刻) 正如我在拉斯维加斯的一次会议上,刚刚点击发布按钮来发布这篇博文,以此来宣布 ASP.NET MVC 4,ASP.NET Web API,ASP.NET Web Pages v2 (R
张善友
2018/01/29
1.7K0
微软以Apache许可协议开源ASP.NET MVC
微软开发部门副总裁Scott Guthrie宣布,ASP.NET MVC及相关项目将在Apache许可证下开源,托管在CodePlex上。ASP.NET MVC是微软的Web应用程序框架,早在2009年已宣布开源,但采用的是微软公共许可证MS-PL。 在MS-PL许可证下,所有人都可以阅读源代码,但无权提出修改建议或贡献代码,对微软的决定构不成任何影响。但在新的开源开发模式下,开发者可以修正bug,修改代码,增加特性,微软将接受第三方递交的补丁。 微软已经接受了开源.NET框架Mono创始人 Miguel
张善友
2018/01/30
1.3K0
ASP.NET MVC 1.0 RC 那些事
Scott Gu宣布了ASP.NET MVC 1.0 RC的发布, Scott Gu在blog上写了一篇ASP.NET MVC 1.0 Release Candidate Now Available, RC版本有很多小的改进: Visual Studio同 MVC的集成更成熟了,也就说有了更好用的脚手架- "Go to Controller" / "Go to View" / "Add View" 等等 AJAX 的改进 FileUpload / "Download" 改进,例如 FileResul
张善友
2018/01/30
6790
ASP.NET MVC Training Kit发布了
Scott Guthrie昨天宣布了ASP.NET MVC 按照Ms-PL协议开源发布,具体内容参见ASP.NET MVC 1.0 has been released,也可以参看Scott Hanselman的新闻稿Microsoft ASP.NET MVC 1.0 is now Open Source MS-PL。 微软同时也推出了一套ASP.NET MVC frameworke培训教材, 其中包含了许多范例程序、PPT、实验演练(Labs)教材等,想学习新技术的人不用在等了,赶快下载回来学习吧。 下面是
张善友
2018/01/31
9190
ASP.NET MVC Training Kit发布了
EntityFramework教程整理
ASP.NET MVC 系列文章 以下文章属于ASP.NET MVC 1.0 正式版 ASP.NET MVC雕虫小技 1-2 ASP.NET MVC 重点教程一周年版 第十一回 母版页、用户自定义控件及文件上传 ASP.NET MVC 重点教程一周年版 第十回 请求Controller ASP.NET MVC 重点教程一周年版 第九回 HtmlHelper ASP.NET MVC 重点教程一周年版 第八回 Helper之演化 用ASP.NET MVC自己管理自己的View:ASP.NET MVC File
逸鹏
2018/04/09
1.2K0
ASP.NET MVC 重点教程一周年版 第一回 安装,并使ASP.NET MVC页面运行起来
从前写过一系列的ASP.NET MVC教程,ASP.NET MVC在这之后历经5个preview版本终于到今天的RC版本,而且不久就要正式推出正式版本,所以值此之际,重典也重新修正这一系列的教程,使之与时俱进。
重典
2022/04/11
7260
ASP.NET MVC 重点教程一周年版 第一回 安装,并使ASP.NET MVC页面运行起来
ASP.NET MVC扩展库
很多同学都读过这篇文章吧 ASP.NET MVC中你必须知道的13个扩展点,今天给大家介绍一个ASP.NET MVC的扩展库,主要就是针对这些扩展点进行。这个项目的核心是IOC容器,包括Ninject, StructureMap, Unity ,Windsor和Autofac。如果你和我一样喜欢使用IOC,这个库值得你关注,这些IOC我都用过了,现在比较喜欢使用Autofac。 ASP.NET MVC扩展库的网站地址是http://www.mvcextension.com/,基于Ms-PL协议的开源库,5.
张善友
2018/01/22
8120
.NET Core RC2/RTM 明确了时间表
.NET Core 经过了将近2年的开发,去年12月份发布的RC1版本,明确来说那只是一个beta版本,自从RC1发布以来,看到github里的RC2分支,整个工具链都发生了很大的变化,大家都在焦急的等待着微软发布.NET Core RC2, 昨天.NET 官方博客回应了大家关心 .NET Core RC2 – Improvements, Schedule, and Roadmap。 博客文章里已经明确了RC2 是一个真正的RC版本,就在5月中旬发布,也就是下周了。 RTM 版本是6月底,时间表如下: .
张善友
2018/01/22
6470
.NET Core RC2/RTM 明确了时间表
asp.net mvc相关开源项目推荐
asp.net mvc ctp版本发布不到一个月时间,在社区出现了丛多的优秀开源项目,社区的活跃性非常高哦,前一段时间园子里也引发了MVC和WebForm的讨论,现在给各位推荐几个相关的优秀项目,这些项目是MVC的价值的最佳证明。 1、 Asp.net mvc 和Castle 的MonoRail项目有着直接的渊源关系,第一个是Castle的Monorail项目,网站地址: http://www.castleproject.org/ ,建议读读这篇文章:MS MVC框架漩涡中的MonoRail未来。 我也在使
张善友
2018/01/22
2.2K0
ASP.NET MVC随想录——锋利的KATANA
正如上篇文章所述那样,OWIN在Web Server与Web Application之间定义了一套规范(Specs),意在解耦Web Server与Web Application, 从而推进跨平台的实现。若要真正使用OWIN规范,那么必须要对他们进行实现。目前有两个产品实现了OWIN规范——由微软主导的 Katana和第三方的Nowin。这篇文章,我主要关注还是Katana,由微软团队主导,开源到CodePlex上。 可以在Visual Studio中输入命令:git clone https://git01
用户1161731
2018/01/11
1.8K0
ASP.NET MVC随想录——锋利的KATANA
ASP.NET MVC 4 RC的JS/CSS打包压缩功能
打包(Bundling)及压缩(Minification)指的是将多个js文件或css文件打包成单一文件并压缩的做法,如此可减少浏览器需下载多个文件案才能完成网页显示的延迟感,同时通过移除JS/CSS文件案中空白、批注及修改JavaScript内部函数、变量名称的压缩手法,能有效缩小文件案体积,提高传输效率,提供使用者更流畅的浏览体验。 在ASP.NET MVC 4中可以使用BundleTable捆绑多个css文件和js文件,以提高网络加载速度和页面解析速度。更为重要的是通过捆绑可以解决IE浏览器的31个C
张善友
2018/01/22
3.3K0
ASP.NET MVC 4 RC的JS/CSS打包压缩功能
初识Asp.Net MVC2.0【续】
    之前写了点Asp.Net MVC的概念,没有实际上系统的介绍Asp.Net MVC开发方式与WebFrom 开发方式的区别。昨晚上看了访问自己blog的入口的搜索关键词大部分是冲着MVC来的,就有了冲动将自己浅薄的知识写在这里,供初学者有个浅显的认识。欢迎高手拍砖指导,希望能把一篇入门的文章写的尽善尽美。
老马
2022/05/10
3980
初识Asp.Net MVC2.0【续】
【asp.net core 系列】 1 带你了解一下asp.net core
这是一个新的系列,名字是《ASP.NET Core 入门到实战》。这个系列主讲ASP.NET Core MVC,辅助一些前端的基础知识(能用来实现我们需要的即可,并非主讲)。同时这个系列也会在后续介绍ASP.NET Core 平台的其它类型的项目,并带领大家以各个类型的项目为主要架构开发一个网站或者网络服务中心。
程序员小高
2020/06/03
1.2K0
ASP.Net MVC框架配置与分析
前几年的时候ASP.Net就有MVC的概念,实际上就是我们熟悉的WebForm开发模型。 1、Model层与视图无关,并且只与数据库相关: 伪代码: pulic class Model {       pulic DataSet ds()       {             //数据库库取数据             return ds;       } } 2、Controller实际上就是我们熟悉的Default.aspx.cs文件,继承自System.Web.UI.Page 类的文件 3、Vie
菩提树下的杨过
2018/01/22
1.6K0
ASP.Net MVC框架配置与分析
在.NET 8 RC1 版本中 MAUI、ASP.NET Core 和 EF8 的新特性
从年初2 月份发布第一个预览版,经历7个预览版后,Microsoft 西雅图时间9月13日发布了 .NET 8  RC 1: https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-rc1/[1], 这是该框架在 11 月初正式发布之前的两个版本中的第一个。 .NET 8 RC1 是在生产中受支持,随着开发团队修复和完善内容,该框架基本上已经准备好了新的和令人兴奋的功能,以便在 11 月 14 日开始的 .NET Conf 2023 [2]期间正式发布RTM。
张善友
2023/09/14
7870
在.NET 8 RC1 版本中 MAUI、ASP.NET Core 和 EF8 的新特性
jQuery和asp.net mvc相关资源链接
jQuery: Simplify calling ASP.NET AJAX services from jQuery jQuery Splitter jHtmlArea – The all NEW HTML WYSIWYG Editor for jQuery Expand table rows with jQuery - jExpand plugin Quick Tip – Reading & Editing HTML Attributes in jQuery Use jQuery and ASP.NET
张善友
2018/01/22
1.4K0
推荐阅读
相关推荐
ASP.NET MVC 2的代码以MS-PL协议开源发布
更多 >
LV.1
广东智用人工智能应用研究院CTO
目录
  • 0. 需求分析
  • 1. 前期准备
    • 1.1 网页分析
    • 1.2 页面布局分析
  • 2. 数据获取-爬虫
    • 2.1 获取cookies
    • 2.2 加载cookies与headers
    • 2.3 延时反爬虫
    • 2.4 解析需求数据
    • 2.5 获取电影名称
  • 3. 数据存储
  • 4. 数据清洗
    • 4.1 城市信息清洗
  • 5. 基于snownlp的情感分析
  • 6. 数据可视化与解读
    • 6.0 文本读取
    • 6.1 评论来源城市分析
    • 6.2 评论情感分析
    • 6.3 电影评分走势分析
    • 6.4 影评词云图
  • 7. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档