爬虫:python采集豆瓣影评信息并进行数据分析

2023-10-28 06:59

本文主要是介绍爬虫:python采集豆瓣影评信息并进行数据分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:最近比较有时间,替一个同学完成了一个简单的爬虫和数据分析任务,具体的要求是爬取复仇者联盟4 的豆瓣影评信息并进行简单的数据分析,这里的数据分析指的是提取关键词并进行词云分析以及按照时间进行热度分析,分析比较简单,后续可以继续完善。

首先,献上数据采集和分析的结果。

短评数据

按照该同学的要求,只采集了1000条数据,有需要更多数据的同学可自行修改采集的限制即可

下面,我们就来详细描述下如何完成数据采集和数据分析的工作的

首先,爬虫的第一步,分析页面元素,打开网页,按下F12,查看数据请求

 

从上往下,依次寻找,我们可以发现数据就存在于第一个请求中

我们可以分析下这个请求,点击翻页,多请求几个页面

 

我们可以知道他的翻页规律是由start和limit这两个参数来控制的,start表示第几页,limit表示每页多少条

知道他的分页规律后,我们需要定位我们需要采集的元素,我们这里需要采集短评内容、发布人信息、评价指数、评价时间,赞同数等

这里我们选择的是etree+xpath解析数据,这里我给大家演示下如何定位短评内容,我们采用浏览器上的选中元素的功能,选中元素后,查看元素的位置

 

分析对应的html元素,首先找到改元素最可靠的顶级元素,这里我们可以很容易的发现这个元素是位于id="comments"这个div元素下面,一般而言,以id为准的元素不会发生太大的变化,接着,我们继续往下找,找到对应元素的上级中比较可靠的元素,比如class,这里有个小技巧,我们可以利用浏览器的$x方法验证我们的xpath是否正确,像下面这样

 

这样我们就可以很容易的采集到短评数据了,代码如下

def start_spider(self):result_list = []for i in range(0,50):start = ireponse = requests.get(self.target_url.format(start),headers=self.headers)# print(reponse.text)html = etree.HTML(str(reponse.content,'utf-8'))# 短评列表short_list = html.xpath('//div[@id="comments"]/div[@class="comment-item"]//span[@class="short"]/text()')print(short_list)times = html.xpath('//div[@class="comment-item"]//span[@class="comment-info"]/span[2]/@class')complte_times = html.xpath('//div[@class="comment-item"]//span[@class="comment-info"]/span[3]/@title')votes = html.xpath('//div[@class="comment-item"]//div[@class="comment"]/h3/span[@class="comment-vote"]/span[@class="votes"]/text()') # 赞同量

采集了短评数据,我们还需要采集发布人的一些其他信息,比如注册时间,常驻城市等等

因此我们需要根据这个链接去用户的主页完成信息采集

 

采集的原理也是一样,利用xpath解析网页数据,不过这个链接需要注意的是,需要登录后才能请求,我这个爬虫里面的解决办法是利用cookie,

当我们用账户登录后,随便查看一个请求,都能发现我们的cookie信息

 

直接复制这段请求到请求的header里就行

代码如下

headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",'Cookie': 'll="118281"; bid=1E8tHh1UO7k; __utma=30149280.787827060.1593838175.1593838175.1593838175.1; __utmc=30149280; __utmz=30149280.1593838175.1.1.utmcsr=so.com|utmccn=(referral)|utmcmd=referral|utmcct=/link; ap_v=0,6.0; _vwo_uuid_v2=DFE5584FB8092E19E1C48ACB6A8C99E62|d5d4f0c4ca4c47a6ddcacacff97040ad; __gads=ID=5490f395fcb95985:T=1593838190:S=ALNI_Mbd_y4lD5XgT1pqnwj9gyQQasX2Nw; dbcl2="218965771:ytN/j1jGo58"; ck=7U_Q; __guid=236236167.3893834060458141000.1593840219409.0322; _pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1593840220%2C%22https%3A%2F%2Faccounts.douban.com%2Faccounts%2Fpassport%2Fregister%22%5D; _pk_ses.100001.8cb4=*; push_noty_num=0; push_doumail_num=0; __utmt=1; __utmv=30149280.21896; __yadk_uid=5q5tgoXkHZk2p7qqUcXhzcqZF8yK4kpa; monitor_count=4; _pk_id.100001.8cb4=a34ccb6950d8365b.1593840220.1.1593840306.1593840220.; __utmb=30149280.9.10.1593838175'}

 

            # 用户链接列表user_list = html.xpath('//div[@id="comments"]/div[@class="comment-item"]//span[@class="comment-info"]/a/@href')for i in range(len(user_list)):url = user_list[i]item = {'short':self.clear_character_chinese(str(short_list[i]))}reponse = requests.get(url,headers=self.headers)html = etree.HTML(reponse.text)city = html.xpath('//div[@class="user-info"]/a/text()')join_date = html.xpath('//div[@class="user-info"]/div[@class="pl"]/text()')if(city != None):if(len(city) > 0):item['city'] = self.clear_character_chinese(city[0])else:continueif(join_date != None):if(len(join_date)>1):item['join_date'] = self.clear_character_chinese(join_date[1]).replace("加入","")elif(len(join_date)>0):item['join_date'] = self.clear_character_chinese(join_date[0]).replace("加入","")else:continueuser_name = html.xpath('//div[@class="info"]/h1/text()')

爬虫的代码基本就这些,我们这里是存储为excel文件,代码如下

    # # 保存数据到excel文件def saveToCsv(self,data):print(data)wb = Workbook()ws = wb.activews.append(['短评内容','评分','赞同量','评价日期','评价时间', '用户名', '常住地址','注册时间'])for item in data:line = [item['short'], item['time'],item['vote'],item['complete_time'],item['detail_time'], item['userName'],item['city'],item['join_date']]ws.append(line)wb.save('douban.xlsx')

保存的数据如开篇所示

获得了数据之后,我们利用wordcloud进行词云分析,分别分析出全部、好评、中评、差评等数据的词云,代码如下

    # 读取短评内容def read_short_data(self,word_type):data = []workbook1=load_workbook('douban.xlsx')sheet=workbook1.get_sheet_by_name("Sheet")count = 0for row in sheet.iter_rows():if(count == 0):count = 1continueprint(row[0].value)short = row[0].valueshort_type = row[1].valueif (word_type == 1):if (int(short_type)<40):continueelif(word_type == 2):if (int(short_type)>=40 or int(short_type)<=20):continueelif(word_type == 3):if (int(short_type)>20):continueshort = self.clean_stopwords(short)data.append(short)return ";".join(data)def generWord(self,word_type):# 查询数据content = self.read_short_data(word_type)msg = "全部"if(word_type == 1):msg = "好评"elif(word_type == 2):msg = "中评"elif(word_type == 3):msg = "差评"self.get_image(content,"douban_{}.png".format(msg))# 生成词云def get_image(self,data,savePath):text  = self.trans_CN(data)wordcloud = WordCloud(background_color="white",font_path = "C:\\Windows\\Fonts\\msyh.ttc").generate(text)# image_produce = wordcloud.to_image()# image_produce.show()wordcloud.to_file(savePath)

词云出来的结果如下所示

分析了词云,我们接着完成时间分析,因为采集的数据太少,分析结果不是很好,代码如下

   # 时间分析def group_by(self,column):workbook1=load_workbook('douban.xlsx')sheet=workbook1.get_sheet_by_name("Sheet")count = 0item={}for row in sheet.iter_rows():if(count == 0):count = 1continueprint(row[0].value)join_time = row[column].valueif (column == 4):join_time_str = join_time.split(':')[0]join_time = int(join_time_str)if(join_time in item):item[join_time] = item[join_time]+1else:item[join_time] = 1x = []y = []for i in sorted (item) : if(column == 4):join_time = str(int(i))+'点至'+str(int(i)+1)+'点'x.append(join_time)else:x.append(i)y.append(item[i])if(column == 4):plt.xlabel('日期')else:plt.xlabel('时刻')plt.ylabel('短评数量')print(y)plt.plot(x, y)plt.xticks(x, x, rotation=30)if(column == 4):plt.title('短评数量随着时刻的变化关系')else:plt.title('短评数量随着日期的变化关系')plt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = Falseif(column == 4):plt.savefig('group_bytime.png')else:plt.savefig('group_bydate.png')

这里只分析了短评数量的变化,实际上数据中还有很多可以分析的内容,分析结果如下

通过这两个分析结果,我们可以大致看出,复仇者联盟这部电影关心的人数随着时间的推进,下降很多,这说明大家都是奔着第一天的热度去的,毕竟被剧透了就没啥好看的了,分析这个时刻的变化,发现人们都喜欢在深夜2、3点的时候进行评价,可能夜猫子比较多,由于这只是一个学生的简单作业,就没有做太多的分析工作。

以上就是本文的全部内容,如果需要完整源码的可联系站长或者访问右侧的爬虫开源项目,上面有该项目的完整代码及分析结果,如果对你有帮助,不妨star一下

本文首发于

爬虫:python采集豆瓣影评信息并进行数据分析

 

这篇关于爬虫:python采集豆瓣影评信息并进行数据分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291495

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',