[Python] 通过采集两万条数据,对《无名之辈》影评分析

2023-05-16

 

、说明

  本文主要讲述采集猫眼电影用户评论进行分析,相关爬虫采集程序可以爬取多个电影评论。

  运行环境:Win10/Python3.5。

  分析工具:jieba、wordcloud、pyecharts、matplotlib。

  基本流程:下载内容 ---> 分析获取关键数据 ---> 保存本地文件 ---> 分析本地文件制作图表

  注意:本文所有图文和源码仅供学习,请勿他用,转发请注明出处!

  本文主要参考:https://mp.weixin.qq.com/s/mTxxkwRZPgBiKC3Sv-jo3g

       本文首发地址:https://www.cnblogs.com/reader/p/10070629.html

  

 

二、开始采集

  2.1、分析数据接口:

    为了健全数据样本,数据直接从移动端接口进行采集,连接如下,其中橙色部分为猫眼电影ID,修改即可爬取其他电影。

    链接地址:http://m.maoyan.com/mmdb/comments/movie/1208282.json?v=yes&offset=15&startTime=

    

    

    接口返回的数据如下,主要采集(昵称、城市、评论、评分和时间),用户评论在 json['cmts'] 中:

    

 

  2.2、爬虫程序核心内容(详细可以看后面源代码):

    >启动脚本需要的参数如下(脚本名+猫眼电影ID+上映日期+数据保存的文件名):.\myMovieComment.py 1208282 2016-11-16 myCmts2.txt

    

    >下载html内容:download(self, url),通过python的requests模块进行下载,将下载的数据转成json格式  

def download(self, url):
        """下载html内容"""

        print("正在下载URL: "+url)
        # 下载html内容
        response = requests.get(url, headers=self.headers)

        # 转成json格式数据
        if response.status_code == 200:
            return response.json()
        else:
            # print(html.status_code)
            print('下载数据为空!')
            return ""

    

    >然后就是对已下载的内容进行分析,就是取出我们需要的数据:

def parse(self, content):
        """分析数据"""

        comments = []
        try:
            for item in content['cmts']:
                comment = {
                    'nickName': item['nickName'],       # 昵称
                    'cityName': item['cityName'],       # 城市
                    'content': item['content'],         # 评论内容
                    'score': item['score'],             # 评分
                    'startTime': item['startTime'],    # 时间
                }
                comments.append(comment)

        except Exception as e:
            print(e)

        finally:
            return comments

 

    >将分析出来的数据,进行本地保存,方便后续的分析工作: 

  def save(self, data):
         """写入文件"""
 
         print("保存数据,写入文件中...")
         self.save_file.write(data)

   

    > 爬虫的核心控制也即爬虫的程序启动入口,管理上面几个方法的有序执行:

def start(self):
        """启动控制方法"""

        print("爬虫开始...\r\n")

        start_time = self.start_time
        end_time = self.end_time

        num = 1
        while start_time > end_time:
            print("执行次数:", num)
            # 1、下载html
            content = self.download(self.target_url + str(start_time))

            # 2、分析获取关键数据
            comments = ''
            if content != "":
                comments = self.parse(content)

            if len(comments) <= 0:
                print("本次数据量为:0,退出爬取!\r\n")
                break

            # 3、写入文件
            res = ''
            for cmt in comments:
                res += "%s###%s###%s###%s###%s\n" % (cmt['nickName'], cmt['cityName'], cmt['content'], cmt['score'], cmt['startTime'])
            self.save(res)

            print("本次数据量:%s\r\n" % len(comments))

            # 获取最后一条数据的时间 ,然后减去一秒
            start_time = datetime.strptime(comments[len(comments) - 1]['startTime'], "%Y-%m-%d %H:%M:%S") + timedelta(seconds=-1)
            # start_time = datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")

            # 休眠3s
            num += 1
            time.sleep(3)

        self.save_file.close()
        print("爬虫结束...")

 

    

  2.3 数据样本,最终爬取将近2万条数据,每条记录的每个数据使用 ### 进行分割:

  

 

 

三、图形化分析数据

  3.1、制作观众城市分布热点图,(pyecharts-geo):

    从图表可以轻松看出,用户主要分布地区,主要以沿海一些发达城市群为主:

 

    

def createCharts(self):
        """生成图表"""

        # 读取数据,格式:[{"北京", 10}, {"上海",10}]
        data = self.readCityNum()

        # 1 热点图
        geo1 = Geo("《无名之辈》观众位置分布热点图", "数据来源:猫眼,Fly采集", title_color="#FFF", title_pos="center", width="100%", height=600, background_color="#404A59")

        attr1, value1 = geo1.cast(data)

        geo1.add("", attr1, value1, type="heatmap", visual_range=[0, 1000], visual_text_color="#FFF", symbol_size=15, is_visualmap=True, is_piecewise=False, visual_split_number=10)
        geo1.render("files/无名之辈-观众位置热点图.html")

        # 2 位置图
        geo2 = Geo("《无名之辈》观众位置分布", "数据来源:猫眼,Fly采集", title_color="#FFF", title_pos="center", width="100%", height=600,
                   background_color="#404A59")

        attr2, value2 = geo1.cast(data)
        geo2.add("", attr2, value2, visual_range=[0, 1000], visual_text_color="#FFF", symbol_size=15,
                is_visualmap=True, is_piecewise=False, visual_split_number=10)
        geo2.render("files/无名之辈-观众位置图.html")

        # 3、top20 柱状图
        data_top20 = data[:20]
        bar = Bar("《无名之辈》观众来源排行 TOP20", "数据来源:猫眼,Fly采集", title_pos="center", width="100%", height=600)
        attr, value = bar.cast(data_top20)
        bar.add('', attr, value, is_visualmap=True, visual_range=[0, 3500], visual_text_color="#FFF", is_more_utils=True, is_label_show=True)
        bar.render("files/无名之辈-观众来源top20.html")

        print("图表生成完成")

 

 

  3.2、制作观众人数TOP20的柱形图,(pyecharts-bar):

    

 

 

  3.3、制作评论词云,(jieba、wordcloud):

    

    生成词云核心代码:

def createWordCloud(self):
        """生成评论词云"""
        comments = self.readAllComments()  # 19185

        # 使用 jieba 分词
        commens_split = jieba.cut(str(comments), cut_all=False)
        words = ''.join(commens_split)

        # 给词库添加停止词
        stopwords = STOPWORDS.copy()
        stopwords.add("电影")
        stopwords.add("一部")
        stopwords.add("无名之辈")
        stopwords.add("一部")
        stopwords.add("一个")
        stopwords.add("有点")
        stopwords.add("觉得")

        # 加载背景图片
        bg_image = plt.imread("files/2048_bg.png")

        # 初始化 WordCloud
        wc = WordCloud(width=1200, height=600, background_color='#FFF', mask=bg_image, font_path='C:/Windows/Fonts/STFANGSO.ttf', stopwords=stopwords, max_font_size=400, random_state=50)

        # 生成,显示图片
        wc.generate_from_text(words)
        plt.imshow(wc)
        plt.axis('off')
        plt.show()

    

 

四、修改pyecharts源码

  4.1、样本数据的城市简称与数据集完整城市名匹配不上:

    使用位置热点图时候,由于采集数据城市是一些简称,与pyecharts的已存在数据的城市名对不上, 所以对源码进行一些修改,方便匹配一些简称。

    黔南 => 黔南布依族苗族自治州

    模块自带的全国主要市县经纬度在:[python安装路径]\Lib\site-packages\pyecharts\datasets\city_coordinates.json

    由于默认情况下,一旦城市名不能完全匹配就会报异常,程序会停止,所以对源码修改如下(报错方法为 Geo.add()),其中添加注析为个人修改部分:

def get_coordinate(self, name, region="中国", raise_exception=False):
        """
        Return coordinate for the city name.

        :param name: City name or any custom name string.
        :param raise_exception: Whether to raise exception if not exist.
        :return: A list like [longitude, latitude] or None
        """
        if name in self._coordinates:
            return self._coordinates[name]


        coordinate = get_coordinate(name, region=region)

        # [ 20181204 添加
        # print(name, coordinate)
        if coordinate is None:
            # 如果字典key匹配不上,尝试进行模糊查询
            search_res = search_coordinates_by_region_and_keyword(region, name)
            # print("###",search_res)
            if search_res:
                coordinate = sorted(search_res.values())[0]
        # 20181204 添加 ]

        if coordinate is None and raise_exception:
            raise ValueError("No coordinate is specified for {}".format(name))

        return coordinate

   

    相应的需要对 __add()方法进行如下修改:

 

  

五、附录-源码

  *说明:源码为本人所写,数据来源为猫眼,全部内容仅供学习,拒绝其他用途!转发请注明出处!

      源码请移步博客园:https://www.cnblogs.com/reader/p/10070629.html

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Python] 通过采集两万条数据,对《无名之辈》影评分析 的相关文章

  • ubuntu x86搭建 麒麟arm QT6交叉编译

    ubuntu搭建QT6交叉编译 使用QT6搭建arm交叉编译平台 编译环境准备 交叉编译器 qt源码准备 开始编译QT 使用QT6搭建arm交叉编译平台 近期项目需求开发平台是unbuntu x86 目标机器是UOS arm架构 由于需要在
  • java分解质因数

    一个数的因数就是能与别的数相乘得到这个数的数 比如30 xff0c 它的因数就是1 xff0c 2 xff0c 3 xff0c 5 xff0c 6 xff0c 10 xff0c 15 xff0c 30 质因数 xff0c 首先 xff0c
  • Mac上pip/pip3设置国内源

    pip3 config set global index url https pypi tuna tsinghua edu cn simple
  • WSL基本使用配置

    前提 相信很多同学已经体验了wsl的强大 能让win电脑上少装一个虚拟机软件 xff0c 但是原生的wsl操作窗口复制粘贴很不方便 xff0c 对于使用习惯ssh的人来说用原生的确实有些难受 xff0c 故需要配置下使用ssh进行连接操作
  • 创建ECS服务器

    阿里云服务器 作业一 xff1a ECS之初体验 xff08 Linux xff09 任务一 xff1a 创建弹性云服务器 任务二 xff1a 登录云服务器 分别使用vnc Workbench和xshell登录云服务器 任务三 xff1a
  • Python报错:ModuleNotFoundError: No module named ‘xxx‘可能的解决方案大全

    Python报错 xff1a 34 ModuleNotFoundError No module named 39 xxx 39 34 这个报错是个非常常见的报错 xff0c 几乎每个python程序员都遇到过 xff0c 导致这个报错的原因
  • 反证法证明:为什么KMP算法不会跳过(漏掉)正确的答案

    KMP算法用于在母串中查找子串的出现位置 KMP算法 xff1a 字符串匹配问题 有详细的引入过程 xff0c 很容易理解掌握 首先我们都知道 xff0c KMP算法的next数组可以指导匹配失败情况下 xff0c 子串 xff08 模式串
  • 详解介绍Selenium常用API的使用--Java语言(完整版)

    参考 xff1a http www testclass net selenium java 一共分为二十个部分 xff1a 环境安装之Java 环境安装之IntelliJ IDEA 环境安装之selenium selenium3浏览器驱动
  • 华为OD2023机试真题【字符串重新排序】

    华为OD2023机试真题 全题库点这里 题目名称 字符串重新排序 知识点 排序数组 时间限制 1s 空间限制 256M 题目描述 给定一个字符串s s包含以空格分隔的若干单词 请对s进行如下处理后输出 span class token nu
  • 解决WSL2中Vmmem内存占用过大问题

    一 问题描述 在 Windows 系统中 xff0c 感觉卡顿得厉害 查看任务管理器 xff0c 内存占用 98 而名为 Vmmem 的进程占用内存高达 2 1 GB 如图 xff1a 二 Vmmem介绍 Vmmem 进程是系统合成的一个虚
  • 5款最佳Linux桌面环境的优缺点比较

    如果你刚接触Linux xff0c 那么我确信你准花了大量的时间为你的Linux发行版选择桌面环境 你可能在想每一种桌面环境都试一下 xff0c 不过这很耗费时间 外头有好多优秀的桌面环境 这就是为什么我测评了5款最佳Linux桌面环境 x
  • vue3.2中setup语法糖<script lang=“ts“ setup>

    推荐阅读 xff1a 怎样使用 Vue 3 的 xff1c script setup xff1e 语法糖功能 南北极之间的博客 CSDN博客 在 Vue 3 中 xff0c 它引入了一个 功能 它是编译时语法糖 xff0c 用于在单个文件组
  • libc++abi.dylib`__cxa_throw:毫无预兆崩溃

    最近在接一款第三方直播api 一开始很正常 xff0c 从来调试的时候意外的出现了一下崩溃 经过一段时间的摸索 xff0c 各种找资料 xff0c 发觉是由于xcode中设置了当所有异常出现时的断点 解决办法是将all改为Objective
  • UOS安装最新 向日葵(ubuntu20.04也试用)

    下载依赖 libicu57 57 1 6 43 deb9u4 amd64 deb xff08 http mirrors aliyun com debian pool main i icu libicu57 57 1 6 43 deb9u4
  • UOS 安装 vscode

    商店安装版同官网冲突 官网下载缓慢 Selecting previously unselected package code An error occurred while applying changes An error occurre
  • org.freedesktop.timedate1: Launch helper exited

    WSL UBUNTU org freedesktop timedate1 Launch helper exited bin bash sudo hwclock w hwclock r date sudo service dbus resta
  • 扔掉 Electron,拥抱基于 Rust 开发的 Tauri

    Tauri 是什么 Tauri 是一个跨平台 GUI 框架 xff0c 与 Electron 的思想基本类似 Tauri 的前端实现也是基于 Web 系列语言 xff0c Tauri 的后端使用 Rust Tauri 可以创建体积更小 运行
  • Adobe Acrobat 图标异常的问题

    造成异常原因 xff1a 修改了 acrobat 图标 xff08 SC Acrobat ico xff09 的默认打开方式 xff08 和传统的图标不同 xff09 恢复默认 xff08 正常 xff09 方法 explore有缓存因而完
  • 关于 Mac Android Studio svn报错 E230001: Server SSL certificate verification failed: certificate is...

    问题 Mac 端 Android Studio 使用svn checkout 代码报错 96 E230001 Server SSL certificate verification failed certificate issued for
  • 转:远程登录Windows蓝屏,如何解决

    1 windows 43 r xff0c 打开 运行 xff0c 输入mstsc xff0c 回车 xff0c 输入对应的服务器登录 2 登录后出现蓝屏 xff0c 无法显示桌面 xff0c 按 Ctrl 43 Alt 43 End xff

随机推荐