0x00目标

对<<功夫>>影片的短评进行数据分析,算是童年回忆吧。
站点: aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tL2Jhbmd1bWkvbWVkaWEvbWQyODIyNzgyMC8/c3BtX2lkX2Zyb209NjY2LjI1LmJfNzI2NTc2Njk2NTc3NWY2ZDZmNjQ3NTZjNjUuMSNzaG9ydA==
项目结构如下:

0x01爬虫部分

1.1接口分析

在源代码里也有部分数据,但应该不够。

这里可以看到是xhr。

直接在浏览器访问这个接口,可以发现数据全给我们了,因此可以判定没啥反爬。


对下一次请求需要拿到cursor,但是最后一次的cursor不知道是什么。那就换一个少评论的影片,观察即可。是0

总结一下:请求方式为get.携带的参数有media_id,ps,sort,cursor,均不难得到。返回的数据类型是json格式。没什么特别的反爬,注意模拟浏览器即可。

1.2存储设计

这里我将uname,score,disliked,liked,likes,ctime,content写入xls文件里,后面转成了csv方便读取数据,感觉xls还是比csv慢。

1.3程序运行的情况

有如下error:


recursion的默认最大深度应该是1000,导入sys 修改下即可,但是这里就浪费了40分钟了,因为没写日志…后面开了个线程

1.4代码

# !/usr/bin/env python
# -*- coding: utf-8 -*-# @author: yjp
# @software: PyCharm
# @file: main.py
# @time: 2022-09-30 22:57
import sys
import os
import xlwt
import xlrd
from xlutils.copy import copy
from requests_html import HTMLSession
import time
from threading import *
sys.setrecursionlimit(3000)  # 将默认的递归深度修改为3000
session = HTMLSession()class plSpider(object):def __init__(self):self.start_url = "https://api.bilibili.com/pgc/review/short/list?media_id=28227820&ps=20&sort=0&cursor={}"self.headers = {'user-agent' : 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}self.cnt = 0def parse_start_url(self):start_url = self.start_url.format(0)response = session.get(start_url,headers = self.headers).json()self.parse_start_response(response)def parse_start_response(self,response):data = response["data"]['list']cursor = response["data"]["next"]self.parse_data(data)self.get_next_url(cursor)def get_next_url(self,cursor):next_url = self.start_url.format(cursor)response = session.get(next_url, headers=self.headers).json()self.parse_next_response(response)def parse_next_response(self,response):data = response["data"]['list']cursor = response["data"]["next"]if cursor == 0:exit(0)self.parse_data(data)self.get_next_url(cursor)def parse_data(self,data):"""提取 uname,score,disliked,liked,likes,ctime,content:param data::return:"""for item in data:self.cnt += 1print(f"{self.cnt}")uname = item['author']['uname']content = item['content']score = item['score']ctime = item['ctime']timeArray = time.localtime(int(ctime))otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray)disliked, liked, likes = item["stat"]["disliked"],item["stat"]["liked"],item["stat"]["likes"]dict = {'评论数据':[uname,score,disliked,liked,likes,otherStyleTime,content]}self.save_excel(dict)def save_excel(self, data):#传入的是字典# data = {#     '基本详情': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']# }os_path_1 = os.getcwd() + '/短评数据/'if not os.path.exists(os_path_1):os.mkdir(os_path_1)# os_path = os_path_1 + self.os_path_name + '.xls'os_path = os_path_1 + '功夫短评数据1.xls'if not os.path.exists(os_path):# 创建新的workbook(其实就是创建新的excel)workbook = xlwt.Workbook(encoding='utf-8')# 创建新的sheet表worksheet1 = workbook.add_sheet("评论数据", cell_overwrite_ok=True)borders = xlwt.Borders()  # Create Borders"""定义边框实线"""borders.left = xlwt.Borders.THINborders.right = xlwt.Borders.THINborders.top = xlwt.Borders.THINborders.bottom = xlwt.Borders.THINborders.left_colour = 0x40borders.right_colour = 0x40borders.top_colour = 0x40borders.bottom_colour = 0x40style = xlwt.XFStyle()  # Create Stylestyle.borders = borders  # Add Borders to Style"""居中写入设置"""al = xlwt.Alignment()al.horz = 0x02  # 水平居中al.vert = 0x01  # 垂直居中style.alignment = al# 合并 第0行到第0列 的 第0列到第13列'''基本详情13'''# worksheet1.write_merge(0, 0, 0, 13, '基本详情', style)excel_data_1 = ('uname','score','disliked','liked','likes','ctime','content')for i in range(0, len(excel_data_1)):worksheet1.col(i).width = 2560 * 3#               行,列,  内容,            样式worksheet1.write(0, i, excel_data_1[i], style)workbook.save(os_path)# 判断工作表是否存在if os.path.exists(os_path):# 打开工作薄workbook = xlrd.open_workbook(os_path)# 获取工作薄中所有表的个数sheets = workbook.sheet_names()for i in range(len(sheets)):for name in data.keys():worksheet = workbook.sheet_by_name(sheets[i])# 获取工作薄中所有表中的表名与数据名对比if worksheet.name == name:# 获取表中已存在的行数rows_old = worksheet.nrows# 将xlrd对象拷贝转化为xlwt对象new_workbook = copy(workbook)# 获取转化后的工作薄中的第i张表new_worksheet = new_workbook.get_sheet(i)for num in range(0, len(data[name])):new_worksheet.write(rows_old, num, data[name][num])new_workbook.save(os_path)def Thread_Run(self):Thread(target=self.parse_start_url()).start()if __name__ == '__main__':p = plSpider()p.parse_start_url()

0x02数据分析部分

做点简单的分析。
主要从评分情况,评论时间,评论字数,情感分析等入手

可以看到五星率到达了99.28%,绝大部分人对这部作品还是很认可的。

评论字数的话,因为是短评,所以每条评论的字数都不多。
出现最多的关键字如下:

星爷经典电影!!!
词云图如下:

情感分析的话就不做了,得选一个负面评论多点的例子。

0x03总结

可视化是对数据的进一步挖掘,也是数据价值的体现,可以让人轻松地捕捉到自己想看到的内容。

使用python进行数据分析(二)相关推荐

  1. 用python进行数据分析——第十二章.高阶pandas

    文章目录 文章推荐: 数据可视化--利用pandas和seaborn绘图基础 利用python进行数据分析--第十章.GroupBy机制(数据聚合与分组操作) 利用python进行数据分析--第十一章 ...

  2. 用python进行数据分析举例说明_《利用python进行数据分析》读书笔记 --第一、二章 准备与例子...

    第一章 准备工作 今天开始码这本书--<利用python进行数据分析>.R和python都得会用才行,这是码这本书的原因.首先按照书上说的进行安装,google下载了epd_free-7. ...

  3. 使用Python对股票数据进行数据分析(二)-使用ta-lib库获取日线行情、5日均线、10日均线行情并显示

    使用Python对股票数据进行数据分析(二)-使用ta-lib库获取日线行情.5日均线.10日均线行情并显示 这个文章其实和我的上一篇文章,https://blog.csdn.net/lost0910 ...

  4. python(数据分析与可视化)二

    python(数据分析与可视化)二 爬取网页内容的前期技术储备 1.pip包管理 (1)内置库 包/库:别人写好的代码,直接引用,加快开发效率. 内置包:python解释器内置常用功能库. – 解释器 ...

  5. 送你8个Python高效数据分析的技巧(附代码)

    来源:专知 本文共1300字,建议阅读5分钟. 本文介绍的数据分析方法,不仅能够提升运行效率,还能够使代码更加"优美". 不管是参加Kaggle比赛,还是开发一个深度学习应用,第一 ...

  6. 想学python看什么书-想学习Python做数据分析,应该看哪些书?

    一.Python编程 /> 本书是一本针对所有层次的Python 读者而作的Python 入门书.全书分两部分:第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib.N ...

  7. python 数据分析学什么-学好python和数据分析有什么关系?

    原标题:学好python和数据分析有什么关系? 没有一毛钱关系,可能存在一分钱的关系 先从2则高级数据分析师的招聘看起: 第一个: 任职要求: 1.统计学,数学,计算机等专业本科及以上学历,3~8年或 ...

  8. 如何自学python数据分析-Python学习干货 |如何用Python进行数据分析?

    为什么选择Python进行数据分析? Python是一门动态的.面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言.Python入门简单,代码可读性强,一段好的Python代码,阅读起来像是在读 ...

  9. keil obj 文件 结构_【Python】数据分析前的入门教程 Python For Everybody P2:数据结构...

    这是密歇根大学课程Python For Everybody总结的P2部分.课程总结P1部分的地址如下: P1: 零基础程序设计(Python 入门) carolinezhq:[Python]数据分析前 ...

最新文章

  1. 开发日记-20190715 关键词 读书笔记 《Perl语言入门》Day 9
  2. wait放弃对象锁_终于搞懂了sleep/wait/notify/notifyAll,真的是不容易
  3. c#数据库訪问返回值类型为SqlDataReader时使用using时注意的问题
  4. iTunes 11.2更新下载:改善播客阅读
  5. JAVA中堆和栈的区别
  6. 强烈建议有孩子的看看
  7. 阿里云创新产品团队招聘!一大波岗位呼唤你
  8. Linux系统-Ubuntu的下载和安装
  9. [HDU - 3709] Balanced Number (数位dp)
  10. 关于嘉立创的贴片小总结
  11. 腾讯云技术认证考试综述 腾讯云技术认证题库
  12. 沐风:微信小程序火了,小心掉入陷井!
  13. 【无标题】文档转成二维码添加到公众号文章(Word、Excel、PPT、PDF等)
  14. CSS 为图片 增加边框效果
  15. 关闭无限局域网配置服务器,无线局域网无线控制器MAC地址过滤配置实例-Cisco.PDF...
  16. 微软sql服务器如何安装,Microsoft SQL Server 2012 数据库安装图解教程
  17. [目标检测知识蒸馏2] [CVPR19] Distilling Object Detectors with Fine-grained Feature Imitation
  18. C课程设计——魔塔游戏
  19. 使用nlite自己diy操作系统
  20. informatica元数据库常用查询

热门文章

  1. 如何使用Snap功能同时运行两个Windows 8应用程序
  2. verilog学习五点经验分享 http://bbs.21ic.com/icview-402231-1-1.html
  3. 《自卑与超越》阅读笔记与思考
  4. oracle永久解scott,Oracle 11g中解决被锁定的scott用户的方法
  5. 02 GitHub的基本使用与踩坑-从零创建项目,第一次的各种提示报错,一铲子填平!
  6. Windows PATH 环境变量的长度限制
  7. 无人驾驶特斯拉如何布局?
  8. Python 经典面试题汇总之框架篇
  9. Java与模式学习笔记 —— 桥梁(Bridge)模式
  10. EasyNVR无插件直播流媒体服务器云端集中管控的EasyNVS云管理平台安装使用文档