Python 分析电影《南方车站的聚会》

Stella981
• 阅读 306

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: 程序员野客

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

Python 分析电影《南方车站的聚会》

《南方车站的聚会》由刁亦男执导,主要演员包括:胡歌、桂纶镁、廖凡、万茜等,该片于 2019 年 5 月 18 在戛纳电影节首映,2019 年 12 月 6 日在中国正式上映。故事灵感来自真实新闻事件,主要讲述盗窃团伙头目周泽农(胡歌饰),在重金悬赏下走上逃亡之路,艰难寻求自我救赎的故事。

影片上映了一周多,票房接近 2 亿,作为一部文艺片,这个表现应该算是属于中上水平了。下面打开豆瓣看一下评分情况,如下图所示:

Python 分析电影《南方车站的聚会》

从图中我们可以看到目前有 13 万多人评分,达到了 7.5 分,打 4 星和 3 星的居多,并非网上一些人所说的口碑两极分化(如果两级分化,应该是打 5 星 和 1 星的居多吧?!)。

页面向下拉到影评位置,如下图所示:

Python 分析电影《南方车站的聚会》

我们可以看到有 5 万多条影评,目前豆瓣对查看影评数据的限制是:未登录最多可以查看 200 条数据,登录用户最多可以查看 500 条数据,我们要做的是通过 Python 爬取豆瓣 500 条影评数据,然后进行数据分析。

首先获取影片列表 URL,具体操作为:点击上图中 全部 52846 条,进入影评列表首页,如下图所示:

Python 分析电影《南方车站的聚会》

但我们发现一个问题,该 URL 参数中并没有行号等信息(实现翻页需要),这个问题我们只需点击后页按钮即可看到,结果如图所示:

Python 分析电影《南方车站的聚会》

现在我们可以从 URL 中看到这些信息了,因 start 参数为变量,我们将上面 URL 修改为:https://movie.douban.com/subject/27668250/comments?start=%d&limit=20&sort=new_score&status=P 作为爬取开始 URL。

接着我们看一下如何实现登陆,首先打开登录页,如下图所示:

Python 分析电影《南方车站的聚会》

我们先在手机号/邮箱密码输入框处随意输入(不要输入正确的用户名和密码),再按 F12 键打开开发者工具,最后点击登录豆瓣按钮,结果如图所示:

Python 分析电影《南方车站的聚会》

我们点击上面图中所示 basic 项,点击后结果如图所示:

Python 分析电影《南方车站的聚会》

此时可以看到 Request URL(登录所需 URL) 和 Form Data 项,这两项是我们登录时需要的,当然我们还需 User-Agent,点击上面图中所示的 Request Headers 项即可看到,如图所示:

Python 分析电影《南方车站的聚会》

所需要的东西都找好了,接下来就是具体实现了,豆瓣登录和影评数据爬取的具体实现如下所示:

  1 import requests
  2 import time
  3 import random
  4 from lxml import etree
  5 import csv
  6 ​
  7 # 新建 csv 文件
  8 csvfile = open('南方车站的聚会.csv','w',encoding='utf-8',newline='')
  9 writer = csv.writer(csvfile)
 10 # 表头
 11 writer.writerow(['时间','星级','评论内容'])
 12 ​
 13 def spider():
 14     url = 'https://accounts.douban.com/j/mobile/login/basic'
 15     headers = {"User-Agent": 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'}
 16     comment_url = 'https://movie.douban.com/subject/27668250/comments?start=%d&limit=20&sort=new_score&status=P'
 17     data = {
 18         'ck': '',
 19         'name': '自己的用户名',
 20         'password': '自己的密码',
 21         'remember': 'false',
 22         'ticket': ''
 23     }
 24     session = requests.session()
 25     session.post(url=url, headers=headers, data=data)
 26     # 总共 500 条,每页 20 条
 27     for i in range(0, 500, 20):
 28         # 获取 HTML
 29         data = session.get(comment_url % i, headers=headers)
 30         print('第', i, '页', '状态码:', data.status_code)
 31         # 暂停 0-1 秒
 32         time.sleep(random.random())
 33         # 解析 HTML
 34         selector = etree.HTML(data.text)
 35         # 获取当前页所有评论
 36         comments = selector.xpath('//div[@class="comment"]')
 37         # 遍历所有评论
 38         for comment in comments:
 39             # 获取星级
 40             star = comment.xpath('.//h3/span[2]/span[2]/@class')[0][7]
 41             # 获取时间
 42             t = comment.xpath('.//h3/span[2]/span[3]/text()')
 43             # 获取评论内容
 44             content = comment.xpath('.//p/span/text()')[0].strip()
 45             # 排除时间为空的项
 46             if len(t) != 0:
 47                 t = t[0].strip()
 48                 writer.writerow([t, star, content])
 49 接下来我们通过词云直观的来展示下整体评论情况,具体实现如下所示:
 50 
 51 import csv
 52 import jieba
 53 from wordcloud import WordCloud
 54 import numpy as np
 55 from PIL import Image
 56 ​
 57 # jieba 分词处理
 58 def jieba_():
 59     csv_list = csv.reader(open('南方车站的聚会.csv', 'r', encoding='utf-8'))
 60     print('csv_list',csv_list)
 61     comments = ''
 62     for i,line in enumerate(csv_list):
 63         if i != 0:
 64             comment = line[2]
 65             comments += comment
 66     print("comment-->",comments)
 67     # jieba 分词
 68     words = jieba.cut(comments)
 69     new_words = []
 70     # 要排除的词
 71     remove_words = ['以及', '在于', '一些', '一场', '只有',
 72                     '不过', '东西', '场景', '所有', '这么',
 73                     '但是', '全片', '之前', '一部', '一个',
 74                     '作为', '虽然', '一切', '怎么', '表现',
 75                     '人物', '没有', '不是', '一种', '个人'
 76                     '如果', '之后', '出来', '开始', '就是',
 77                     '电影', '还是', '不是', '武汉', '镜头']
 78     for word in words:
 79         if word not in remove_words:
 80             new_words.append(word)
 81     global word_cloud
 82     # 用逗号分隔词语
 83     word_cloud = ','.join(new_words)
 84 ​
 85 # 生成词云
 86 def world_cloud():
 87     # 背景图
 88     cloud_mask = np.array(Image.open('bg.jpg'))
 89     wc = WordCloud(
 90         # 背景图分割颜色
 91         background_color='white',
 92         # 背景图样
 93         mask=cloud_mask,
 94         # 显示最大词数
 95         max_words=600,
 96         # 显示中文
 97         font_path='./fonts/simhei.ttf',
 98         # 字的尺寸限制
 99         min_font_size=20,
100         max_font_size=100,
101         margin=5
102     )
103     global word_cloud
104     x = wc.generate(word_cloud)
105     # 生成词云图片
106     image = x.to_image()
107     # 展示词云图片
108     image.show()
109     # 保存词云图片
110     wc.to_file('wc.png')

整体评论词云图

Python 分析电影《南方车站的聚会》

因为有人说了影片口碑两级分化,接下来我们看一下打 1 星和 5 星的词云效果如何,主要实现如下所示:

1 for i,line in enumerate(csv_list):
2     if i != 0:
3         star = line[1]
4         comment = line[2]
5         # 一星评论用 1,五星评论用 5
6         if star == '1':
7             comments += comment

一星评论词云图

Python 分析电影《南方车站的聚会》

五星评论词云图

Python 分析电影《南方车站的聚会》

上面我们只使用了评论内容信息,还有时间和星级信息没有使用,最后我们可以用这两项数据分析下随着时间的变化影片星级的波动情况,以月为单位统计影片从首映(2019 年 5 月)到当前时间(2019 年 12月)的星级波动情况,具体实现如下所示:

 1 import csv
 2 from pyecharts.charts import Line
 3 import pyecharts.options as opts
 4 import numpy as np
 5 from datetime import datetime
 6 ​
 7 def score():
 8     csv_list = csv.reader(open('南方车站的聚会.csv', 'r', encoding='utf-8'))
 9     print('csv_list', csv_list)
10     comments = ''
11     ts = []
12     ss = set()
13     for i, line in enumerate(csv_list):
14         if i != 0:
15             t = line[0][0:7]
16             s = line[1]
17             ts.append(t+':'+s)
18             ss.add(t)
19     new_times = []
20     new_starts = []
21     new_ss = []
22     for i in ss:
23         new_ss.append(i)
24     arr = np.array(new_ss)
25     new_ss = arr[np.argsort([datetime.strptime(i, '%Y-%m') for i in np.array(new_ss)])].tolist()
26     print('new_ss',new_ss)
27     for i in new_ss:
28         x = 0
29         y = 0
30         z = 0
31         for j in ts:
32             t = j.split(':')[0]
33             s = int(j.split(':')[1])
34             if i == t:
35                 x += s
36                 z += 1
37         new_times.append(i)
38         new_starts.append(round(x / z, 1))
39     c = (
40             Line()
41            .add_xaxis(new_times)
42            .add_yaxis('南方车站的聚会',new_starts)
43             .set_global_opts(title_opts=opts.TitleOpts(title='豆瓣星级波动图'))
44         ).render()

影片星级波动效果如下图所示:

Python 分析电影《南方车站的聚会》

根据影片星级的波动情况我们也能大致预测到影片评分的波动情况。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python 开发:制作一个简易的点菜系统(附源码)
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于海唤鱼杂记客栈,作者:海唤鱼杂记客栈!PythonGUI编程:制作一个简易的点菜系统(附源码)(https://oscimg.oschina.net/oscnet/up7f6390bf0f7f63953f8c28
Stella981 Stella981
2年前
Python数据可视化:折线图、柱状图、饼图代码
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。作者:godweiyang来源:算法码上来Python爬虫、数据分析、网站开发等案例教程视频免费在线观看https://space.bilibili.com/523606542!(https://oscimg.oschi
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Python爬取网易云音乐辑的图片、专辑名和专辑出版时间
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。作者:阿里波特来源:CSDNPython爬虫、数据分析、网站开发等案例教程视频免费在线观看https://space.bilibili.com/523606542!(https://oscimg.oschina.net/
Stella981 Stella981
2年前
Python列表去重的方式有很多,了解它们,进行性能的对比
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于Python实用宝典,作者Python实用宝典!(https://oscimg.oschina.net/oscnet/up0647b4a837d357255bd6f04110912d68.jpg)前言列表
Stella981 Stella981
2年前
Python js逆向 爬取X天下数据,好好看,好好学
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。之前讲过execjs这个库可以在python中运行js代码,这将极大的帮助我们解决逆向问题,找到加密位置不会重写怎么办、js代码太复杂怎么办,用execjs秒杀它。本次的受害者aHR0cHM6Ly9wYXNz
Stella981 Stella981
2年前
Python高考报考迁移图,各省考生“最想去哪”
前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者:小dull鸟2020年高考已经落下帷幕,各地高考成绩近期陆续出来了,各大网站也都被各类高考信息刷屏,小编凑巧发现百度推出了“高考搜索大数据”网页,吸引了上亿人次浏览。!Python高考报考迁移图,各省考生“最想去哪