[超详细] Python3爬取豆瓣影评、去停用词、词云图、评论关键词绘图处理
爬取豆瓣电影《大侦探皮卡丘》的影评,并做词云图和关键词绘图
第一步:找到评论的网页url。
https://movie.douban.com/subject/26835471/comments?start=0&limit=20&sort=new_score&status=P
第二步:鼠标放在评论上右键检查,分析源代码,确定抓取的内容。
<span class="short">萌就行了!这个世界观感觉梦想成真了!</span>
1
如上,只要抓取该标签下的文本就好,这里可以用正则表达式,里面的文本内容用(.*?)抓取。
第三步:观察分页情况。
点击下一页,发现链接变为:
https://movie.douban.com/subject/26835471/comments?start=20&limit=20&sort=new_score&status=P
发现只有start=后面的数字改变,每页20条评论,每页*20即可
导入模块
这些模块可在cmd下输入pip install 模块名,或者pycharm中setting-Project Interpreter里右边的+号安装
import requests
import re
from wordcloud import WordCloud
import jieba
from PIL import Image
import jieba.analys
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
1
2
3
4
5
6
7
8
9
10
1、用requests获取url
因为爬虫次数较多可能IP被封,所以找了个代理IP,参数里习惯性加上headers伪装成浏览器访问。
def getHtml(url):
# 获取url页面
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'}
proxies = {'http': '61.135.217.7:80'}
response = requests.get(url, headers=headers, proxies=proxies)
response.encoding = 'utf-8'
return response.text
1
2
3
4
5
6
7
8
2、用正则解析网页,提取文本,返回评论列表
def getComment(url):
# 用正则提取评论文本,返回一个列表
html = getHtml(url) #调用上一个函数
comments = re.findall('<span class="short">(.*?)</span>', html, re.S) # re.S记得加上,空字符串
onepageComments = [] # 创建一个空列表,存放评论
#用正则表达式解析出来的是一个列表,遍历列表,将每一个评论取出,添加到空列表里,每个评论后面换行
for i in comments:
onepageComments.append(i + '\n')
return onepageComments
1
2
3
4
5
6
7
8
9
3、分页、函数回调,写入本地文件
if __name__ == '__main__':
f = open(r'大侦探皮卡丘部分影评.txt', 'w', encoding='utf-8')
#这里抓取10页内容,如果太多页可能需要登录豆瓣账号,然后在requests.get参数中增加一个cookies参数即可浏览后面的评论
for page in range(10):
url = 'https://movie.douban.com/subject/26835471/comments?start=' + str(
20 * page) + '&limit=20&sort=new_score&status=P' # 分页
# print('第%s页的评论:' % (page+1)) #这里可以知道正在爬取的是第几页的评论,方便自己核对
for i in getComment(url):
f.write(i) # 将每一页评论都写入本地文件中
# print(i) # 打印所有评论
# print('\n') # 每页换行
1
2
3
4
5
6
7
8
9
10
11
4、词云图
先将抓取的文件打开,注意编码
comments = open('大侦探皮卡丘部分影评.txt', 'r', encoding='utf-8').read()
1
以下词云图分几种情况,都可以尝试跑一遍看看效果,最全面的可以直接看第3小点。
4.1 如果不分词
wc = WordCloud(background_color='white', # 设置背景颜色
font_path="C:\Windows\Fonts\msyh.ttf", # 设置中文字体
max_font_size=60, # 设置字体最大值
random_state=30, # 设置有多少种随机生成状态,即有多少种配色方案
width=800,
height=600
).generate(comments) # 生成词云
# 展示词云图
plt.figure(figsize=(20, 10)) #设置画布大小
plt.imshow(wc, interpolation='bilinear')
plt.axis("off") #去掉坐标轴
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
4.2 jieba分词
wordlist = jieba.cut(str(comments), cut_all=False) #精确模式
wl = " ".join(wordlist)
wc = WordCloud(background_color='white', # 设置背景颜色
font_path="C:\Windows\Fonts\msyh.ttf", # 设置中文字体
max_font_size=60, # 设置字体最大值
random_state=30, # 设置有多少种随机生成状态,即有多少种配色方案
width=800,
height=600
).generate(wl) # 注意这里面的参数是wl
# 展示词云图
plt.figure(figsize=(20, 10)) #设置画布大小
plt.imshow(wc, interpolation='bilinear')
plt.axis("off") #去掉坐标轴
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
4.3 结巴分词,加上萌图,去停用词,并保存图片
相关的模块要导进来
这里有一个哈工大停用词表,可自行网上下载
然后下载一张词云用的背景图(我这里是pikaqiu.png,一张皮卡丘的图)
wordlist = jieba.cut(str(comments), cut_all=False) #精确模式
wl = " ".join(wordlist)
# 设置背景图
mask = np.array(Image.open('pikaqiu.png', 'r'))
# 设置停用词
stopwords_file = open('哈工大停用词表.txt', 'r')
stopwords = [words.strip() for words in stopwords_file.readlines()]
# 设置词云(里面多加了几个参数)
wc = WordCloud(background_color='white', # 设置背景颜色
mask=mask, # 设置背景图片
max_words=2000, # 设置最大词数
stopwords=stopwords, # 设置停用词
font_path="C:\Windows\Fonts\msyh.ttf", # 设置中文字体
max_font_size=60, # 设置字体最大值
random_state=30, # 设置有多少种随机生成状态,即有多少种配色方案
width=600,
height=800
).generate(wl) # 生成词云
# 展示词云图
plt.figure(figsize=(8, 6)) #设置画布大小
plt.imshow(wc, interpolation='bilinear')
plt.axis("off") #去掉坐标轴
plt.show()
wc.to_file('result.jpg') #存为图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
到这里基本就完成了
5、取前20个评论关键词
# withWeight=True一并返回关键词、权重值
keywords = jieba.analyse.extract_tags(
comments, topK=20, withWeight=True, allowPOS=("n", "v")) # 指定名词和动词
# 变成dataframe格式
comm = pd.DataFrame(keywords)
for item in keywords:
print(item[0], item[1])
# 设置画布大小
plt.figure(figsize=(10, 8))
#显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 画图
plt.bar(comm[0], comm[1], color="c")
# 设置标签,标题,调整大小
plt.xlabel('词语', fontsize=20)
plt.ylabel('权重', fontsize=20)
plt.title('评论词频', fontsize=20)
plt.tick_params(labelsize=10)
# 在每个直条上加标签
for a, b in zip(comm[0], comm[1]):
plt.text(a, b, '%.2f' % b, ha='center', va='bottom', fontsize=10)
plt.show(http://www.my516.com)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
---------------------
[超详细] Python3爬取豆瓣影评、去停用词、词云图、评论关键词绘图处理的更多相关文章
- Scrapy 通过登录的方式爬取豆瓣影评数据
Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...
- 【python数据挖掘】爬取豆瓣影评数据
概述: 爬取豆瓣影评数据步骤: 1.获取网页请求 2.解析获取的网页 3.提速数据 4.保存文件 源代码: # 1.导入需要的库 import urllib.request from bs4 impo ...
- python3爬取豆瓣top250电影
需求:爬取豆瓣电影top250的排名.电影名称.评分.评论人数和一句话影评 环境:python3.6.5 准备工作: 豆瓣电影top250(第1页)网址:https://movie.douban.co ...
- python 爬取豆瓣电影短评并wordcloud生成词云图
最近学到数据可视化到了词云图,正好学到爬虫,各种爬网站 [实验名称] 爬取豆瓣电影<千与千寻>的评论并生成词云 1. 利用爬虫获得电影评论的文本数据 2. 处理文本数据生成词云图 第一步, ...
- Python3爬取豆瓣网电影信息
# -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前250的电影的名称 Language: Python3.6 ...
- python3爬取豆瓣排名前250电影信息
#!/usr/bin/env python # -*- coding: utf-8 -*- # @File : doubanmovie.py # @Author: Anthony.waa # @Dat ...
- Python的scrapy之爬取豆瓣影评和排名
基于scrapy框架的爬影评 爬虫主程序: import scrapy from ..items import DoubanmovieItem class MoviespiderSpider(scra ...
- 爬取豆瓣电影影评,生成wordcloud词云,并利用监督学习根据评论自动打星
本文的完整源码在git位置:https://github.com/OceanBBBBbb/douban-ml 爬取豆瓣影评 爬豆瓣的影评比较简单,豆瓣没有做限制,甚至你都不用登陆就可以看全部,我这里用 ...
- python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法
本文旨在提供爬取豆瓣电影<我不是药神>评论和词云展示的代码样例 1.分析URL 2.爬取前10页评论 3.进行词云展示 1.分析URL 我不是药神 短评 第一页url https://mo ...
随机推荐
- Maven项目骨架搭建
1. 如何使用Maven的archetype快速生成一个新项目 2. Maven之自定义archetype生成项目骨架(一) 3. 使用maven3 创建自定义的archetype 4. 使用mave ...
- Tomcat服务器介绍及配置
一.Tomcat简介 Tomcat(Apache)是当前应用最广的JavaWeb服务器 1.Tomcat版本: 安装版:需要安装,一般不考虑使用.一个电脑只能安装一个,卸载也比较麻烦! 解压版: 直接 ...
- P3823_[NOI2017]蚯蚓排队 哈希+脑子
之前就写过一遍,今天却写挂了,查了半天发现是数组名写错啦$qwq$ 观察到$K$很小,所以使得我们可以哈希(怎么什么都能哈希$qwq$).我们把长度小于等于$50$的子串扔到哈希表里,并统计出现次数, ...
- Codeforces Round #363 (Div. 2) A
Description There will be a launch of a new, powerful and unusual collider very soon, which located ...
- Chapter13
package scala /** * Created by EX-CHENZECHAO001 on 2018-04-04. */class Chapter13 { // 13 集合 // 所有的集合 ...
- 如何自动更新SVN项目
在桌面新建“SVN Update.bat”文件,把下面的命令复制到该文件中,保存并退出,然后使用windows的“任务计划”功能,就可以实现定时自动更新SVN目录. 按此批处理文件的方法执行,一次可自 ...
- Options Menu的android3.0以上和以下版本显示刷新原理,刷新适配
一 显示区别: 2.3.x及以下版本,需要按菜单键显示菜单,当菜单打开时,第一个可见的部分是图标菜单,最多可容纳6个菜单项.如果你的菜单包括Android的地方超过6项,第六项,其余将被归到”More ...
- Gym 100886J Sockets 二分答案 + 贪心
Description standard input/outputStatements Valera has only one electrical socket in his flat. He al ...
- ELK(ElasticSearch, Logstash, Kibana) v5.3.2 分布式日志收集分析最佳解决方案 基于CentOS 7 ( 一 )
[root@localhost temp]# .tar.gz -C /usr/local/ [root@localhost temp]# vim logstatsh_test.conf ======= ...
- Storm概念学习系列之Stream消息流 和 Stream Grouping 消息流组
不多说,直接上干货! Stream消息流是Storm中最关键的抽象,是一个没有边界的Tuple序列. Stream Grouping 消息流组是用来定义一个流如何分配到Tuple到Bolt. Stre ...