评论

收藏

[python] 《一出好戏》讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何?

编程语言 编程语言 发布于:2021-06-23 21:30 | 阅读数:249 | 评论:0

DSC0000.png
  作者本人(汤小洋 )今天也走进了电影院,对这部电影做了亲身的观看,看完后的感觉是有些许失落的,本以为是喜剧片,结果发现笑点一般,从搞笑的角度来看,不如《西虹市首富》,影片更多的是反映人类本性的一部电影,不应当做喜剧片来看,影片中展现的人与人之间的关系倒是值得我们去深思。
  今天就跟着 汤老师 一起来揭秘影片《一出好戏》,看看“这出好戏”到底如何?
  我们将使用Python抓取猫眼近10万条评论数据,并对获取到的数据进行分析,看看观众对这部电影的评价究竟如何?
  整个数据分析的过程分为四步:

  • 获取数据
  • 处理数据
  • 存储数据
  • 数据可视化

一、获取数据

1. 简介

  ​    本次获取的是猫眼APP的评论数据,如图所示:

DSC0001.png
  ​       通过对评论数据进行分析,得到如下信息:

  • 返回的是json格式数据


  • 1203084表示电影的专属id;offset表示偏移量;startTime表示获取评论的起始时间,从该时间向前取数据,即获取最新的评论


  • cmts表示评论,每次获取15条,offset偏移量是指每次获取评论时的起始索引,向后取15条


  • hcmts表示热门评论前10条


  • total表示总评论数
  
2. 代码实现


  ​    这里先定义一个函数,用来根据指定url获取数据,且只能获取到指定的日期向前获取到15条评论数据
# coding=utf-8
__author__ = '汤小洋'
from urllib import request
import json
import time
from datetime import datetime
from datetime import timedelta

# 获取数据,根据url获取
def get_data(url):
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
  }
  req = request.Request(url, headers=headers)
  response = request.urlopen(req)
  if response.getcode() == 200:
    return response.read()
  return None
if __name__ == '__main__':
  html = get_data('http://m.maoyan.com/mmdb/comments/movie/1203084.json?_v_=yes&offset=0&startTime=2018-07-28%2022%3A25%3A03')
  print(html)
二、处理数据

  对获取的数据进行处理,转换为json
# 处理数据
def parse_data(html):
  data = json.loads(html)['cmts']  # 将str转换为json
  comments = []
  for item in data:
    comment = {
      'id': item['id'],
      'nickName': item['nickName'],
      'cityName': item['cityName'] if 'cityName' in item else '',  # 处理cityName不存在的情况
      'content': item['content'].replace('\n', ' ', 10),  # 处理评论内容换行的情况
      'score': item['score'],
      'startTime': item['startTime']
    }
    comments.append(comment)
  return comments
if __name__ == '__main__':
  html = get_data('http://m.maoyan.com/mmdb/comments/movie/1200486.json?_v_=yes&offset=0&startTime=2018-07-28%2022%3A25%3A03')
  comments = parse_data(html)
  print(comments)
三、存储数据

  ​    为了能够获取到所有评论数据,方法是:从当前时间开始,向前获取数据,根据url每次获取15条,然后得到末尾评论的时间,从该时间继续向前获取数据,直到影片上映日期(2018-08-10)为止,获取这之间的所有数据。
# 存储数据,存储到文本文件
def save_to_txt():
  start_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')  # 获取当前时间,从当前时间向前获取
  end_time = '2018-08-10 00:00:00'
  while start_time > end_time:
    url = 'http://m.maoyan.com/mmdb/comments/movie/1203084.json?_v_=yes&offset=0&startTime=' + start_time.replace(' ', '%20')
    html = None
    '''
      问题:当请求过于频繁时,服务器会拒绝连接,实际上是服务器的反爬虫策略
      解决:1.在每个请求间增加延时0.1秒,尽量减少请求被拒绝
         2.如果被拒绝,则0.5秒后重试
    '''
    try:
      html = get_data(url)
    except Exception as e:
      time.sleep(0.5)
      html = get_data(url)
    else:
      time.sleep(0.1)
    comments = parse_data(html)
    print(comments)
    start_time = comments[14]['startTime']  # 获得末尾评论的时间
    start_time = datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S') + timedelta(seconds=-1)  # 转换为datetime类型,减1秒,避免获取到重复数据
    start_time = datetime.strftime(start_time, '%Y-%m-%d %H:%M:%S')  # 转换为str
    for item in comments:
      with open('comments.txt', 'a', encoding='utf-8') as f:
        f.write(str(item['id'])+','+item['nickName'] + ',' + item['cityName'] + ',' + item['content'] + ',' + str(item['score'])+ ',' + item['startTime'] + '\n')

if __name__ == '__main__':
  # html = get_data('http://m.maoyan.com/mmdb/comments/movie/1200486.json?_v_=yes&offset=0&startTime=2018-07-28%2022%3A25%3A03')
  # comments = parse_data(html)
  # print(comments)
  save_to_txt()
  ​    有两点需要说明:

  • 服务器一般都有反爬虫策略,当请求过于频繁时,服务器会拒绝部分连接,我这里是通过增加每个请求间延时来解决,只是一种简单的解决方案,还望各位看客理解包涵
  • 根据数据量的多少,抓取数据所需时间会有所不同,我抓取的是2018-8-19到2018-8-10(上映当天)之间的数据,大概花了2个小时,共抓取约9.2万条评论数据

DSC0002.png

DSC0003.gif
  从上图可以看出,《一出好戏》的观影人群主要集中在沿海一带,这些地方经济相对发达,城市人口基数庞大,极多的荧幕数量和座位、极高密度的排片场次,让观众便捷观影,活跃的观众评论也多,自然也就成为票房的主要贡献者。

DSC0004.jpg
  ​    从词云图中可以看到:

  • 评论中多次出现“可以”、“好看”、“不错”等热词,说明观众对《一出好戏》的总体评价还是很不错的
  • 同时对该影片中“张艺兴”的“演技”也给予了很大的认可,我本人今天在观看后也有同感,让我们看到了不一样的张艺兴,实力演员
  • 对于初次“导演”电影的“黄渤”,能拍出这样的影片,粉丝们也是比较肯定的,同时其本身就是票房的保障
  • 至于剧情方面,“现实”、“喜剧”、“搞笑”、“故事”等词语,能看出这是一部反映现实的故事片,同时也兼具喜剧搞笑
  • 对于评论中出现的“一般”、“失望”等,这些粉丝或许是和我一样,本以为这是一部爆笑喜剧片,笑点应该会很多(毕竟在我们心中,黄渤、王宝强等就是笑星),没想到笑点并不很多,至少与期待的有差距,导致心里有落差的原因吧^_^

DSC0005.jpg
  附:今天看电影的票根 ^_^
关注下面的标签,发现更多相似文章