【爬虫系列】爬虫实战--获取电影短评并生成词云

article/2025/10/4 4:33:49

最近看完了口碑大赞的国产科幻电影,感觉非常的不错,刷新了对未来科幻的认知啊。在大饱眼福的同时,也想着大家对这部电影都是怎么评价的呢?

打开豆瓣网,找到电影短评页面,该网页是分页类型的,我打算使用 requests 与 BeautifulSoup 爬取到文本文件中,然后通过 jieba 抽取关键字和生成词云进行可视化展示。

一、requests+BeautifulSoup爬取目标数据

需求分析:

  • 目标地址分页展示,每页20条,通过start参数标记;经测试,当爬取到220条之后就需要登录,这里就使用游客身份爬取前220条。
  • 先使用requests请求获取到html,再使用BeautifulSoup解析html的数据,最终封装成JSON格式返回。

代码实现

<1>. 实现获取短评数据的主体方法,流程有获取html网页数据、将html网页数据保存到txt文件、解析html网页数据并以json格式保存等步骤,如下

def get_comment(html_url, html_path, txt_path, size, header):for i in range(size):param_start = i * 20url = html_url + str(param_start)print(f'url is {url}')text = requests.get(url, headers=header).text# 把html文档保存为.txt,便于查看saveHtml2Txt(text, i, html_path)# 解析响应数据,保存为json格式soup = bs(text, "html.parser")comment_list = soup.find_all("div", class_="comment-item")print(f'comment list is {len(comment_list)}')process_comment(soup, comment_list, txt_path)

<2>. 将html网页数据保存到txt文件,如下

def saveHtml2Txt(text, i, html_path):# 没有该路径就自动创建目录h_path = Path(html_path)if not h_path.exists():h_path.mkdir(parents=True)# 将每个html写入txt文件保存with open(html_path + f'lldq2_comment_html_{i + 1}.txt', 'w', encoding='utf-8') as wf:wf.write(text)print(f'lldq2_comment_html_{i + 1}.txt, 写入成功!!!')

<3>. 解析html网页数据,如下

def process_comment(soup, comment_list, txt_path):for j in range(0, len(comment_list)):# print(f'j is {j+1}')vote_count = soup.select(f'div #comments > div:nth-child({j + 1}) > div.comment > h3 > span.comment-vote > span')[0].get_text().strip()comment_time = soup.select(f'div #comments > div:nth-child({j + 1}) > div.comment > h3 > span.comment-info > span.comment-time')[0].get_text().strip()comment = soup.select(f'div #comments > div:nth-child({j + 1}) > div.comment > p > span')[0].get_text().strip()print(f"第{j + 1}条解析OK,投票数:{vote_count},时间:{comment_time}")# 封装成字典,并转json保存dicts = {"collection_time": time.strftime("%Y-%m-%d %H:%M", time.localtime()),"vote_count": int(vote_count),"comment_time": comment_time,"comment": comment}# 保存解析的数据,格式jsonsaveJson2Txt(dicts, txt_path)

<4>. 以json格式保存数据,如下

def saveJson2Txt(dicts, txt_path):with open(txt_path, 'a', encoding='utf-8') as f:# 含有中文,ensure_ascii=Falsejson_data = json.dumps(dicts, ensure_ascii=False)# 每次写入都换行f.write(json_data + '\n')print(f'成功写入当前评论!')

需要导入的模块有:

import json, requests, time
from pathlib import Path
from bs4 import BeautifulSoup as bs

实现效果1:

e8866584901b400c94b5eb189dd277cb.png实现效果2:

bd50968b02604579ac962d5ab61b2e1a.png

接下来,打算使用 jieba 进行分词,并生成词云,看下评论里讨论最多的关键字是什么,由于样本数量有限,只能代表前220条的热门评论哦。

我目的是获取评论内容,而封装成 JSON 格式不利于进行关键词抽取。因此,需要进一步处理,把评论内容按行写入文本文件。写个转换方法,如下:

def processJson2Txt(json_path, save_txt_path):comment_list = []with open(json_path, mode='r', encoding='utf-8') as f:# 读取一行json数据context = f.read()comment_list = list(context.split("\n"))print(comment_list)for i in comment_list:if i != "":comment_dict = json.loads(i)print(comment_dict)with open(save_txt_path, 'a', encoding='utf-8') as fa:fa.write(comment_dict["comment"] + "\n")

处理之后,效果如下:

da9d3cd5b3ce49829bce7991e49a0263.png

二、使用jieba抽取关键字和生成词云

在之前的 jieba 博文里,介绍过两种抽取关键词的方式,这里使用基于 TextRank 算法的关键词抽取。

实现代码,如下:

def process_jieba(path):with open(path, mode='r', encoding='utf-8') as f:context = f.read()# 关键词抽取rank = analyse.textrank(context, topK=100)print(f'top100:: {rank}')# 构造词云对象,并调节显示词云的参数wc_text = ' '.join(rank)wc_Obj = wc.WordCloud(font_path=r'.\simhei.ttf',background_color='white',width=1000,height=900,).generate(wc_text)# 可视化显示plt.imshow(wc_Obj, interpolation='bilinear')plt.axis('off')plt.show()

需要导入的模块:

import jieba.analyse as analyse
import wordcloud as wc
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

生成词云的效果:

f152a5b310464a2a9ae65f7196522751.png

嗯~~,通过词云展示的效果还不错!当然,如果样本评论数据越多,展示的结果就会越客观和准确。


http://chatgpt.dhexx.cn/article/PaBmJakB.shtml

相关文章

selenium 快乐爬虫实战之 电影链接的爬取

文章目录 思路源码分析初始化 Chrome获取搜索引擎页面给出的网页链接循环遍历网页链接&#xff0c;过滤电影链接第二次过滤并输出链接最后加上程序入口 完整源码 复制即用效果 思路 手动用搜索引擎找电影链接慢而且不方便&#xff0c;找到的链接也有限。各大电影网站的链接不是…

作为一名爬虫人如何实现千万级数据爬取?

爬虫人,爬虫魂!爬虫路上莫乱行 爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃 在这个大数据智能时代,数据就是金钱!所以越来越多的企业都很重视数据,然后通过爬虫技术等手段获取一些公开数据,为公司业务及项目进行赋能 在原始资本积累的初期,使用一些低…

爬虫攻守道 - 2023最新 - JS逆向 - Python Scrapy实现 - 爬取某天气网站历史数据

目录 背景介绍 网站分析 第1步&#xff1a;找到网页源代码 第2步&#xff1a;分析网页源代码 Python 实现 成果展示 后续 Todo 背景介绍 今天这篇文章&#xff0c;3个目的&#xff0c;1个是自己记录&#xff0c;1个是给大家分享&#xff0c;还有1个是向这个被爬网站的前…

如何使用爬虫一键批量采集新浪微博内容

信息时代如何真正做到&#xff0c;秀才不出门&#xff0c;能知天下事。不知道你们用的是啥&#xff0c;反正小喵我用的是微博。现在微博上新闻是多的不得了&#xff0c;国家大事&#xff0c;社会日常&#xff0c;娱乐新闻。微博热搜上随便一个话题都可以引起网民们的激烈讨论。…

scrapy爬虫实战——米哈游官网数据爬取

项目总览 前言项目建立爬虫代码编写爬虫运行导出到Excel后记 前言 scrapy是一个强大的爬虫框架&#xff0c;熟练地使用它几乎可以随心所欲地抓取任何网页上想要获得的数据。笔者初学爬虫&#xff0c;需要项目练手&#xff0c;适逢有不少朋友热衷于《原神》这款由米哈游开发的游…

一个神器,大幅提升爬虫爬取效率!

这是「进击的Coder」的第 575 篇技术分享 作者&#xff1a;崔庆才 在做爬虫的时候&#xff0c;我们往往可能这些情况&#xff1a; 网站比较复杂&#xff0c;会碰到很多重复请求。有时候爬虫意外中断了&#xff0c;但我们没有保存爬取状态&#xff0c;再次运行就需要重新爬取。 …

python爬虫基本功(一)--初识python爬虫与爬虫学习路径

大家好&#xff0c;这里是Kaiser。&#x1f44f;&#x1f44f;今天想给大家介绍下python爬虫的知识&#xff0c;我将与大家一起去揭开python爬虫的神秘面纱&#xff0c;字不多敲&#xff0c;让我们进入今天的主题&#xff1a;初识python爬虫。 文章目录 1️⃣什么是爬虫2️⃣爬…

神箭手 爬虫操作(1)

今天有一个任务&#xff0c;是要将微博用户的昵称从数据库导入到神箭手中。 以前一直是手动操作&#xff0c;现在有一个需求是要直接导入到设置中。 数据库使用的是mysql&#xff0c;数据库连接使用的是JDBCtemplate&#xff0c;使用spring构建&#xff0c;还要用到神箭手的S…

如何在神箭手云爬虫上写爬虫

摘要 上一篇博客跟大家详细介绍了如何写出《黄焖鸡米饭是怎么火起来的》这样的数据分析类的文章&#xff0c;相信很多人都对数据来源也就是如何爬取到黄焖鸡米饭商家信息很感兴趣。那么今天我就跟大家具体讲一讲怎么使用神箭手云爬虫写爬虫&#xff0c;以上篇博客的…

神箭手云爬虫平台 如何在1小时内编写简单爬虫

既然你来到了这里&#xff0c;想必你肯定已经知道了神箭手云爬虫平台是干什么的&#xff0c;目的也是非常的明确。 那么接下来的过程中&#xff0c;我将给你演示如何在最快时间内编写一个简单的爬虫&#xff0c;每一个属性的讲解&#xff0c;将会让你一路顺风。 demo项目GitHu…

神箭手云爬虫工具

title: 神箭手云爬虫 categories: 神箭手 tags:爬虫 分为&#xff1a; 入口页&#xff0c;帮助页&#xff0c;内容页 入口页&#xff1a; scanUrl 爬虫网页的入口 帮助页&#xff1a;helperurl 一帮包含大量的内容页&#xff08;列表&#xff09;&#xff0c;多数情况下事业…

JS求绝对值

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 需求&#xff0c;一个变量&#xff0c;需要判断它的值为负数时不能小于-20&#xff0c;正数也不能小于20&#xff0c;这个时候就需要用到求绝对值了。 Math.abs(num) > 求绝对值 使用示例&#xf…

javascript:求绝对值最小的数

问题来源&#xff1a;http://androidguy.blog.51cto.com/974126/1129543 有一个已经排序的数组&#xff08;升序&#xff09;&#xff0c;数组中可能有正数、负数或0&#xff0c;求数组中元素的绝对值最小的数&#xff0c;要求&#xff0c;不能用顺序比较的方法&#xff08;复杂…

力扣 -----最小绝对值(JavaScript解法)

一、题目描述 二、示例 三、解题思路 先进行一个排序&#xff0c;然后使用双指针&#xff0c;依次进行比较&#xff0c;将比较的值进行存储&#xff0c;最小值改变的话&#xff0c;数组置空&#xff0c;最小值改变&#xff0c;如果和最小值相等的话直接push。我刚开始写的排序…

python3 绝对值_python3对序列求绝对值

原博文 2018-11-08 11:27 − http://www.cnblogs.com/itdyb/p/5731804.html 一开始我是这样写的&#xff0c;据说这样写python2是可以的&#xff1a; myList [-1,2,-3,4,-5,6]absList map(abs, myList) &... 0 1936 相关推荐 2019-12-23 10:33 − ## Python3使用sud…

【前端】JavaScript基础(二)

目录 一、内置对象 Math对象 Data日期 数组对象 字符串对象 字符串的不可变 根据字符返回位置 根据位置返回字符&#xff08;重点&#xff09; 字符串基本方法&#xff08;重点&#xff09; 字符串的替换与转换 二、简单类型和复杂类型 简单类型传参 复杂类型传参 一、内…

LeetCode 任意子数组和绝对值的最大值(JavaScript)

这道题目&#xff0c;我是通过看题解&#xff0c;然后通过自己思考才写出来的&#xff0c;第一次写博客&#xff0c;如果有不好之处&#xff0c;请谅解。 写这个题目之前&#xff0c;我们先了解一下前缀和&#xff0c;通过下面例子&#xff0c;或许你就明白了什么是前缀和了。…

常用JavaScript控制结构语句,绝对值,累加,阶乘,循环

计算一个数的绝对值 function abs(x) {if (x > 0) {return x;} else {return -x;} } console.log(abs(10) abs(-10)); //>true计算数组元素之和 let arr [1, 3, 5];function sum(array) {let sum 0;for (let x of array) { //循环数组把每个元素赋给xsum x;}return…

02-Node.js基础(一)

目录 一、什么是Node.js二、Node.js在软件架构中的地位三、Node.js 可以做什么&#xff08;作用&#xff09;浏览器端的 JavaScriptNode端的JavaScript 四、Node.js APIsWeb端APINode.js端APIWeb端JS与Node端JS对比 五、安装 Node.js第一步&#xff1a;在官网下载 Node.js 安装…