鱼C-小师妹 发表于 2021-2-19 09:26:09

《唐人街探案3》值得看吗?【Python+爬虫+可视化 30 秒出答案】

本帖最后由 鱼C-小师妹 于 2021-3-3 17:38 编辑

事先声明:

小师妹不生产评论,只是评论的处理工...

春节假期结束啦,小师妹又来用代码搞事情啦!

随着 唐探3 在全国影院的全面上线,大家对于这部电影的评价却是非常的出乎意料,豆瓣目前评分只有区区 5.7 分。


传送门

很多影评表示非常的失望。

小师妹作为纯路人,准备爬一下数据,看看口碑到底如何{:10_256:}

看完结果,小师妹只想到下面这句话:

二流的作品,比广为流传的作品活得还久,其中有些根本不该问世,却赖着不肯死。
        ——雷蒙德·钱德勒《谋杀的简约之道
剩下自己品~

从豆瓣用 Python 获取了几千条影评数据,一起来看看大家是怎么说的吧。

顺便展示下数据可视化功底。

接下来的内容,偏重“分析”,代码只是简单注释。

涉及到的知识点不做详细讲解啦,大家可以去看小甲鱼老师的教程,链接我都会罗列出来滴。

主要就是两件事:


[*]数据爬取
[*]多维度可视化展示数据并进行分析

废话不多说,开始吧!

生动视频解说版:

https://www.bilibili.com/video/BV19N411X7ft

数据爬取

由于豆瓣现在有较强的反爬机制,这里小师妹不方便透露具体实现方式。

关键字:


[*]1、免费代理+代理池维护
[*]2、付费代理
[*]3、selenium 慢慢爬

付费的,如果自用也就几块而已~

出于稳定可用,用了付费代理构造一个 url 用 requests 去请求,主入口:

if __name__ == '__main__':
    proxies_list = get_ip()
    can_use_ip_list = check_ip(proxies_list)
    page = 200
    for i in range(1, page + 1):
      time.sleep(random.randint(1, 3))
      print('鱼C秘制小爬虫在爬取第%s页' % i)
      url = 'https://movie.douban.com/subject/27619748/comments?start=%s&limit=20&status=P&sort=new_score' % (
            (i - 1) * 20)
      print(url)
      tree = get_tree(url, can_use_ip_list)
      info_list = parse(tree)
      print('保存中....')
      save(info_list, i)

计划大概爬取 10 页,不到 200 条数据。

打开控制台查看标签:
(评论页面:https://movie.douban.com/subject/27619748/comments)



上面评论的标签都统一放在:

div[@class="comment"]/h3/span[@class="comment-info"]/a/text()
到时代码用循环就可以啦!

数据源找到了,写代码批量爬去上面 div 中的:用户名、星级、评论

def parse(tree):
    global comment_set
    info_list = []
    comment_list = tree.xpath(
      '//div[@id="comments"]/div[@class="comment-item "]')
    for com in comment_list:
      comments_user = com.xpath(
            './div[@class="comment"]/h3/span[@class="comment-info"]/a/text()')[
                0]# 评论者
      if comments_user in comment_set:
            pass
      else:
            stat_dict = {
                "10": "一星",
                "20": "二星",
                "30": "三星",
                "40": "四星",
                "50": "五星",
            }
            comment_star = com.xpath(
                './div[@class="comment"]/h3/span[@class="comment-info"]/span/@class'
            )# 星级
            for i in stat_dict:
                if i in comment_star:
                  comment_star = stat_dict
            try:
                comment_time = com.xpath(
                  './div[@class="comment"]/h3/span[@class="comment-info"]/span/text()'
                ).split()# 评论时间
            except:
                comment_time = ""
            comment = com.xpath(
                './div[@class="comment"]/p[@class=" comment-content"]/span/text()'
            )# 评论
            comment_set.add(comments_user)
            info_list.append(
                )
    return info_list
将数据存到 csv 中:

def save(item, title=None):
    # 创建文件对象
    try:
      if title == 1:
            content_list = ['评论者', '评论星级', '评论时间', '评论内容']
            with open('./唐探三.csv', 'a+', newline='',
                      encoding='utf-8-sig') as file:
                writer = csv.writer(file, delimiter=',')
                writer.writerow(content_list)
                writer.writerows(item)
      if title == 1:
            print('>>>创建表格成功,并加入标题成功!')
      else:
            print('>>>写入成功!')
    except:
      pass
搞定,看结果(节选):



很尴尬,至于多尴尬,我们用词云来看下。

不过先看下随着日期,评分的趋势变化。


评分趋势

从上面数据中我们可以看到有日期和星级。

咱们就可以用 Matplotlib,基于这两个数据做一个趋势图!

其中星级我们需要先按照进行求和算平均:

file = csv.reader(f)
      sum_start_12 = 0
      sum_start_13 = 0
      sum_start_14 = 0
      sum_start_15 = 0
      sum_start_16 = 0
      count_12 = 0
      count_13 = 0
      count_14 = 0
      count_15 = 0
      count_16 = 0
      date_list = []
      for line, comment in enumerate(file):
            if line != 0:
                date_list.append(comment)
                # print(line,comment)
                if comment == '2021-02-12':
                  sum_start_12 += movie_start_dict]
                  count_12 += 1
                elif comment == '2021-02-13':
                  sum_start_13 += movie_start_dict]
                  count_13 += 1
                elif comment == '2021-02-14':
                  sum_start_14 += movie_start_dict]
                  count_14 += 1
                elif comment == '2021-02-15':
                  sum_start_15 += movie_start_dict]
                  count_15 += 1
                elif comment == '2021-02-16':
                  sum_start_16 += movie_start_dict]
                  count_16 += 1
      star_list = [
            sum_start_12 / count_12, sum_start_13 / count_13,
            sum_start_14 / count_14, sum_start_15 / count_15,
            sum_start_16 / count_16
      ]
输出看结果:



很明显随着日期增长,评分一路下滑...

除了折线图,还可以适当修改代码(直接看评分占比):

with open('Ori.csv', 'r', encoding='utf-8') as f:
      file = csv.reader(f)
      one = 0
      two = 0
      three = 0
      four = 0
      five = 0
      for line, comment in enumerate(file):
            if line != 0:
                # print(line, comment)
                if comment == '一星':
                  one += 1
                elif comment == '二星':
                  two += 1
                elif comment == '三星':
                  three += 1
                elif comment == '四星':
                  four += 1
                elif comment == '五星':
                  five += 1
      groups = ["1星", "2星", "3星", "4星", "5星"]
      offsets =
      rng = np.random.RandomState(27)
      sj =
      plt.pie(sj,
                labels=groups,
                explode=offsets,
                autopct='%1.1f%%',
                startangle=90,
                shadow=True)
      plt.title(u"星级饼图")
      plt.show()
图:



五星好评占比 9.9%,剩下都是......


内容词云

词云文档:词云——将你的数据可视化的一种炫酷方案

小甲鱼老师已经讲过词云玩法,去看上面的文章。

词云往往能直观显示出内容中的高频词,上才艺:

import wordcloud
file = open(r"Ori.csv", encoding="utf-8")
text = file.read()
stopwords = {"一星", "二星", "三星", "四星", "五星", "world", "评论内容", "评论星数"}
wc = wordcloud.WordCloud(font_path=r"Hiragino Sans GB.ttc",
                         stopwords=stopwords)
wc.generate(text)
image = wc.to_image()
image.show()
结果:

**** Hidden Message *****

可以看到,影评者中对于 唐探3 的评论中几乎没有关于“喜欢”、“好看”等等关键词。

反而出现了XXX、XXXXX等关键词...

这......嗯...群众的眼睛是雪亮滴。

欢迎有看过的童鞋们在下方留言交流心得...

彩虹七号 发表于 2021-2-20 08:31:06

吐了好理解,这36D是个什么意思

qq1151985918 发表于 2021-2-20 08:37:04

{:9_227:}

鱼C-小师妹 发表于 2021-2-21 11:09:09

本帖最后由 鱼C-小师妹 于 2021-2-21 11:10 编辑

彩虹七号 发表于 2021-2-20 08:31
吐了好理解,这36D是个什么意思

{:9_233:} 我也母鸡啊

Minecraft程序猿 发表于 2021-2-22 12:15:38

{:10_256:}

永恒的蓝色梦想 发表于 2021-2-22 13:38:16

鱼C-小师妹 发表于 2021-2-21 11:09
我也母鸡啊

???车车

ruchu 发表于 2021-2-22 15:14:10

{:10_333:}

雨凌枫月 发表于 2021-2-22 20:16:53

观摩观摩

docjr 发表于 2021-2-23 09:35:54

为什么评星分布跟豆瓣显示的不一样 豆瓣三星比例比较多

鱼C-小师妹 发表于 2021-2-23 14:57:50

docjr 发表于 2021-2-23 09:35
为什么评星分布跟豆瓣显示的不一样 豆瓣三星比例比较多

豆瓣本身没有评星的数据哦,这个是自己算的

2788782936 发表于 2021-2-23 15:13:15

36D,这是撒哈子?

Lundaa 发表于 2021-2-23 15:58:10

看看

docjr 发表于 2021-2-24 09:02:46

docjr 发表于 2021-2-23 09:35
为什么评星分布跟豆瓣显示的不一样 豆瓣三星比例比较多

那这个代码可以用于别的电影吗

小乖乖大坏人 发表于 2021-2-24 13:45:30

2788782936 发表于 2021-2-23 15:13
36D,这是撒哈子?

可能是罩杯我没看过这部不知道瞎猜{:5_109:}

3102515355 发表于 2021-2-24 14:05:03

{:10_334:}

鱼C-小师妹 发表于 2021-2-24 16:44:49

docjr 发表于 2021-2-24 09:02
那这个代码可以用于别的电影吗

当然啦~方法一样的,稍做修改即可

鱼缸里的猫 发表于 2021-2-24 18:33:22

可以提供源码下载吗?

战斗吧团团 发表于 2021-2-25 09:19:48

关键词可太逗了

小伤口 发表于 2021-2-25 11:31:10

wow~

MRSCARLet 发表于 2021-2-25 15:59:27

{:7_112:}
页: [1] 2 3
查看完整版本: 《唐人街探案3》值得看吗?【Python+爬虫+可视化 30 秒出答案】