一、爬取豆瓣《长津湖》网页评论

(由于存在一定的反爬机制,以下代码最多只能爬取210条评论)

# 导入工具包
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
import numpy as np# 请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'}
# =============================================================================
# 爬取一页
# =============================================================================
# 爬取的网址
url = 'https://movie.douban.com/subject/25845392/comments?start=20&limit=20&status=P&sort=new_score'# 获取信息
html = requests.get(url, headers=headers)
# 获取内容
data = html.text
soup = BeautifulSoup(data, 'html.parser')# 信息
# 用户
names = soup.select('#comments > div > div.comment > h3 > span.comment-info > a')
# 评级
pingjis = soup.select('#comments > div > div.comment > h3 > span.comment-info')
# 日期
riqis = soup.select('#comments > div > div.comment > h3 > span.comment-info > span.comment-time')
# 内容
neirongs = soup.select('#comments > div > div.comment > p > span')# 空list
lis = []
for name, pingji, riqi, neirong in zip(names, pingjis, riqis, neirongs):pingji_re = pingji.find_all('span')lis.append([name.get_text(),pingji_re[1]['class'],pingji_re[1]['title'],riqi.get_text().strip(),neirong.get_text()])result1 = pd.DataFrame(lis, columns=['用户', '评级', '等级', '日期', '内容'])
# print(result1)
# =============================================================================
# 利用循环结构爬取多页
# =============================================================================url = ['https://movie.douban.com/subject/25845392/comments?start={}&limit=20&status=P&sort=new_score'.format(i) for i inrange(0, 500, 20)]lis2 = []for urli in url:# 获取信息html = requests.get(urli, headers=headers)# 获取内容data = html.textsoup = BeautifulSoup(data, 'html.parser')# 用户names = soup.select('#comments > div > div.comment > h3 > span.comment-info > a')# 评级pingjis = soup.select('#comments > div > div.comment > h3 > span.comment-info')# 日期riqis = soup.select('#comments > div > div.comment > h3 > span.comment-info > span.comment-time')# 内容neirongs = soup.select('#comments > div > div.comment > p > span')for name, pingji, riqi, neirong in zip(names, pingjis, riqis, neirongs):pingji_re = pingji.find_all('span')lis2.append([name.get_text(),pingji_re[1]['class'],pingji_re[1]['title'],riqi.get_text().strip(),neirong.get_text()])print('完成:', urli)time.sleep(np.random.randint(5, 10))result2 = pd.DataFrame(lis2, columns=['用户', '评级', '等级', '日期', '内容'])
# 写入excel
frame = pd.DataFrame(result2)
file = frame.to_csv('movie.csv')

二、文本分析

# -*- coding: utf-8 -*-
import pandas
import jieba
import re# loading data
data = pandas.read_excel("C:\\Users\\Lenovo\\Documents\\comments.xlsx"
)# 1.文本内容清洗,清楚特殊符号,用正则表达式
pattern = r"[!\"#$%&'()*+,-./:;<=>?@[\\\]^_^{|}~—!,。?、¥…():【】《》‘’“”\s]+"
re_obj = re.compile(pattern)def clear(text):return re.sub(pattern, "", text)data['comment'] = data['comment'].apply(clear)
print(data.head())def cut_word(text):  # 返回生成器return jieba.cut(text)# 2.分词 用jieba来实现分词
data['comment'] = data['comment'].apply(cut_word)# 3.停用词处理,这里我用的是中文停词用表(文末附)def get_stopword():  # 使用sets = set()with open('C:\\Users\\Lenovo\\Desktop\\cn_stopwords.txt', encoding='UTF-8') as f:for line in f:s.add(line.strip())return sdef remove_stopword(words):return [word for word in words if word not in stopword]stopword = get_stopword()
data['comment'] = data['comment'].apply(remove_stopword)# 4.词汇统计
from itertools import chain
from collections import Counterli_2d = data['comment'].tolist()
# 将二维列表转换为一维
li_1d = list(chain.from_iterable(li_2d))
print(f'总词汇量:{len(li_1d)}')
c = Counter(li_1d)
print(f'不重复词汇量:{len(c)}')
common = c.most_common(50)
# print(common)
import pandas as pd
frame = pd.DataFrame(common)
file = frame.to_csv('common11.csv')
# 计算每个评论的用词数
num = [len(li) for li in li_2d]import matplotlib.pyplot as plt
# 绘制所有用户在评论时所用词汇书,绘制直方图
# n, bins, patches = plt.hist(num, bins=20, alpha=0.5)
# plt.yscale('log')
# plt.show()# 生成词云图
from wordcloud import WordCloud
# 导入图像处理库
import PIL.Image as image
# 导入数据处理库
import numpy as np
import matplotlib.colors as colors  # 处理图片相关内容
# 文末附颜色对照表
colormaps = colors.ListedColormap(['#FF4500', '#FF7F50', '#FFD700'])
# mask可以用PPT画自己想要的图形(我这里是用来“长津湖”的艺术字)
mask1 = np.array(image.open('C:\\Users\\Lenovo\\Desktop\\aa.png'))
wc = WordCloud(font_path="simsun.ttc", background_color="white",mask=mask1, colormap=colormaps)img = wc.generate_from_frequencies(c)
plt.figure(figsize=(15, 10))
plt.imshow(img)
plt.axis('off')
plt.show()

下图为我的代码词云图:

三、加入自己的自定义词典

(毕竟计算机不一定能满足我们的需求)

# 加载词典
jieba.load_userdict('my_dictionary.txt')
# 也可以添加自定义词典
jieba.add_word('易烊千玺')
jieba.add_word('长津湖')

四、分本情感分析

snownlp是对一个评论进行情感分析输出一个[0,1]之间的值,越高越表示评论越偏向于积极好的方面。

from snownlp import SnowNLP
# 示例:
# a = SnowNLP(u'确实很满意的一次购物。做工很好很精致。内外都很特别。这几天穿着很暖和的。而且轻薄。包装都很好。').sentiments
# print(a)# 打开文件
fp = open(r"movie.txt", "r", encoding='utf-8')
lines = fp.readlines()
k = 0
m = 0
# 逐行读入
for line in lines:try:s = SnowNLP(line)# 进行对没条评论情感分析打分累加k = k+s.sentiments# 对评论总数进行累加m = m+1except:print("")
print(round(k/m, 3))   # 得到平均分

从输出结果为0.827,可以得出结论:《长津湖》广受好评。

五、附录

1.停用词:

2.颜色代码:(很全很好用!)
百度文库链接

实例:爬取豆瓣评论、绘制词云图以及情感分析——以《长津湖》为例相关推荐

  1. 贴吧评论敏感词识别及情感分析初级实现之评论获取

    贴吧评论敏感词识别及情感分析初级实现之评论获取 分三个模块实现贴吧评论敏感词识别及情感分析研究:"评论爬虫抓取"."评论敏感词识别"."评论情感分析( ...

  2. python爬取豆瓣影评生成词云的课程设计报告_Python爬取豆瓣影评,生成词云图,只要简单一步即可实现。...

    最近看了一部电影<绣春刀>,里面的剧情感觉还不错,本文爬取的是绣春刀电影的豆瓣影评,1000个用户的短评,共5W多字.用jieba分词,对词语的出现频率进行统计,再通过wordcloud生 ...

  3. python爬取豆瓣评论,并制作成词云

    一.爬取豆瓣热评 该程序进行爬取豆瓣热评,将爬取的评论(json文件)保存到与该python文件同一级目录下 注意需要下载这几个库:requests.lxml.json.time import req ...

  4. BeautifulSoup及爬取豆瓣评论

    BS4的理解 BS4会将html文档对象转换为python可以识别的四种对象: Tag: 标签对象 NavigableString : 字符内容操作对象 BeautifulSoup: 文档对象 Com ...

  5. Python3.6+jieba+wordcloud 爬取豆瓣影评生成词云

    在上一篇介绍了如何通过Python爬虫抓取豆瓣电影榜单.Python3.6+Beautiful Soup+csv 爬取豆瓣电影Top250 此篇博客主要抓取豆瓣某个电影的影评,利用jieba分词和wo ...

  6. Python爬虫实例-爬取豆瓣电影Top250

    这是本人Python爬虫实例的第二个实例,不过想来好像没有很大的难度所以适合当做新手入门的第一个爬虫.放在这里供大家参考. 本次实例爬取的网站为豆瓣电影Top250,使用到的第三方库有urllib,B ...

  7. Scrapy 实例——爬取豆瓣图书排名top250

    1.安装 pip install E:\python\lxml-4.2.6-cp36-cp36m-win_amd64.whl pip install E:\python\Twisted-18.9.0- ...

  8. 爬取豆瓣评论连接mysql_Python3.5爬取豆瓣电视剧数据并且同步到mysql中

    #!/usr/local/bin/python#-*- coding: utf-8 -*-#Python: 3.5#Author: zhenghai.zhang@xxx.com#Program: 爬取 ...

  9. Python 爬虫实例+爬取豆瓣小组 + wordcloud 制作词云图

    目标 利用PYTHON爬取如下图中所有回答的内容,并且制作词云图. 用到的库 import requests # import jsonfrom PIL import Image from pyque ...

最新文章

  1. 做好面试前的准备工作
  2. jstl fn:replace替换换行符
  3. Python中json模块,字典和字符串相互转换
  4. java匿名对象赋初值_不想进BAT的Java程序员不是好程序员,BAT后端Java岗面试真题分享
  5. SAP CRM WebClient UI控制器方法DETACH_STATIC_OVW_VIEWS的作用
  6. 三维重建中旋转矩阵与平移矩阵思想误区(转载)
  7. simulink同步发电机模型_基于Speedgoat的永磁同步电机控制Demo
  8. 有效数据包含额外数据_1-2-5 转换数据以包含在报表中
  9. scala 抽象方法_Scala抽象类型
  10. soc设计方法与实现_冷轧钢板局部激光热处理实现汽车轻量化设计新方法
  11. configure: error: Can‘t find ext2fs library
  12. 2022年十大突破性技术,“无密码”排名第一
  13. 平面坐标转大地坐标(经纬度)
  14. 万凯新材深交所上市破发:募资超30亿 公司市值101亿
  15. win7安装android驱动失败怎么办,win7未能成功安装设备驱动程序怎么办
  16. flutter从零开发完整好客租房App(已完结)
  17. 初窥MySQL的索引与事务
  18. 办公和设计必备|矢量图设计软件
  19. UE4 蓝图Structure与Json的读写
  20. Vue-router中对path的误解和说明-path的正确理解。

热门文章

  1. 水冒泡了几度_水开了为什么会冒泡?
  2. mysql_check_mysql CHECK约束 语法
  3. Visa联合几大银行测试区块链B2B支付平台
  4. 【5年Android从零复盘系列之二十】Android自定义View(15):Matrix详解(图文)【转载】
  5. 邻域闭包matlab,拓扑空间、开集、闭集、闭包、聚点、邻域
  6. 大创项目前传——爬虫阶段(1)
  7. python用input输入字典_python输入字典_输入字典python_python用input输入字典 - 云+社区 - 腾讯云...
  8. mysql查询性别语句_MySQL查询语句简单操作示例
  9. 如何修改京东绑定的手机号,看这里就够了,怎样更改京东绑定的手机号
  10. RabbitMQ ——基于Stomp实现与MQTT客户端通信