爬取豆瓣电影《大侦探皮卡丘》的影评,并做词云图和关键词绘图
第一步:找到评论的网页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爬取豆瓣影评、去停用词、词云图、评论关键词绘图处理的更多相关文章

  1. Scrapy 通过登录的方式爬取豆瓣影评数据

    Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...

  2. 【python数据挖掘】爬取豆瓣影评数据

    概述: 爬取豆瓣影评数据步骤: 1.获取网页请求 2.解析获取的网页 3.提速数据 4.保存文件 源代码: # 1.导入需要的库 import urllib.request from bs4 impo ...

  3. python3爬取豆瓣top250电影

    需求:爬取豆瓣电影top250的排名.电影名称.评分.评论人数和一句话影评 环境:python3.6.5 准备工作: 豆瓣电影top250(第1页)网址:https://movie.douban.co ...

  4. python 爬取豆瓣电影短评并wordcloud生成词云图

    最近学到数据可视化到了词云图,正好学到爬虫,各种爬网站 [实验名称] 爬取豆瓣电影<千与千寻>的评论并生成词云 1. 利用爬虫获得电影评论的文本数据 2. 处理文本数据生成词云图 第一步, ...

  5. Python3爬取豆瓣网电影信息

      # -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前250的电影的名称 Language: Python3.6 ...

  6. python3爬取豆瓣排名前250电影信息

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : doubanmovie.py # @Author: Anthony.waa # @Dat ...

  7. Python的scrapy之爬取豆瓣影评和排名

    基于scrapy框架的爬影评 爬虫主程序: import scrapy from ..items import DoubanmovieItem class MoviespiderSpider(scra ...

  8. 爬取豆瓣电影影评,生成wordcloud词云,并利用监督学习根据评论自动打星

    本文的完整源码在git位置:https://github.com/OceanBBBBbb/douban-ml 爬取豆瓣影评 爬豆瓣的影评比较简单,豆瓣没有做限制,甚至你都不用登陆就可以看全部,我这里用 ...

  9. python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法

    本文旨在提供爬取豆瓣电影<我不是药神>评论和词云展示的代码样例 1.分析URL 2.爬取前10页评论 3.进行词云展示 1.分析URL 我不是药神 短评 第一页url https://mo ...

随机推荐

  1. Isolation Forest算法实现详解

    本文介绍的 Isolation Forest 算法原理请参看我的博客:Isolation Forest异常检测算法原理详解,本文中我们只介绍详细的代码实现过程. 1.ITree的设计与实现 首先,我们 ...

  2. Eclipse中新建Maven Web项目报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    在maven web项目中的index.jsp中的错误信息如下: The superclass "javax.servlet.http.HttpServlet" was not f ...

  3. Jmeter 线程组、运行次数参数化(转)Jpara1=4 -Jpara2=5

    Jmeter的jmx文件保存了线程数和运行次数等参数,这个参数可以在命令行中传入参数的方式来修改数值 步骤如下 1.生成线程和运行次数的参数 Jmeter选项中函数助手对话框,选中__P参数,这个参数 ...

  4. c/c++中define用法详解及代码示例

    https://blog.csdn.net/u012611878/article/details/52534622   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  5. leetcode 91. 解码方法

    题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数 ...

  6. Hello ASP.NET on Docker -- CentOS

    1.docker pull microsoft/aspnet 2.docker run -p 5004:2015 microsoft/aspnet --穿越后 3.cd ~ && wg ...

  7. 牛客网Java刷题知识点之基本类型、引用类型

    不多说,直接上干货! byte-short-int-long,方便识记.

  8. SpringBoot | 第五章:多环境配置

    前言 写上一篇看英文资料,耗费了心力呀,这章,相对来说简单点.也比较熟悉,但是这很实用.不扯了,开始~ 多环境配置 maven的多环境配置 springboot多环境配置 总结 老生常谈 多环境配置 ...

  9. xenserver 更新源

    在xenserver上安装vnc软件时,报错 [root@cloud yum-3.4.3]# ./yummain.py install yumThere are no enabled repos.Ru ...

  10. JQuery使用正则表达式验证手机号,邮箱,身份证(含有港澳台),网址

    自己对正则验证也没系统用过,这次自己做个demo,一下子把这些全都用上了,下次有需要直接来拿了. 以下代码是在页面使用JQuery进行验证的,也有在后台进行验证的,可以试试,都一样的原理. 直接上代码 ...