[超详细] 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 ...
随机推荐
- 图解SSH上传安装eclipse
安装eclipse 步骤: 1.SSH上传eclipse tar文件 2.linux下Computer-->FilesSystem-->soft显示上传的压缩包 3.解压eclipse文件 ...
- UDP可靠传输简易设计
UDP,鉴于其丢包和乱序(后发先至)问题,为保证其可靠性设计如下报头协议,供大家参考 数据包设计 数据包总大小按照MTU设计设置,小于1500字节 数据包示意图 包头类型说明 1.类型(1字节) 数值 ...
- 剑指offer刷题记录
目录 二维数组中的查找 替换空格 从尾到头打印链表 反转链表 重建二叉树 用两个栈实现队列 旋转数组的最小数字 斐波拉切数列 跳台阶 变态跳台阶 矩形覆盖 二进制中1的个数 数值的整次方 链表中倒数第 ...
- linux中的三种时间
mtime [修改时间] 文件/目录的修改时间 ctime [属性修改时间] 文件目录的属性的修改时间 atime [访问时间]文件/目录的访问时间 stat 123.txt File: `1 ...
- Unity MonoBehaviour.Invoke 调用
使用 Invoke() 方法需要注意 3点: 1 :它应该在 脚本的生命周期里的(Start.Update.OnGUI.FixedUpdate.LateUpdate)中被调用: 2:Invoke(); ...
- (转)centos7优化内核参数详解
centos7优化内核参数详解 原文:http://blog.csdn.net/xiegh2014/article/details/52132863 cat /etc/sysctl.conf #CTC ...
- 对象拷贝 - 优雅的解决方案 Mapstruct
MapStruct GitHub 访问地址 : https://github.com/mapstruct/mapstruct/ 使用例子 : https://github.com/mapstruct/ ...
- Python 为threading.Thread添加 terminate
import threading import inspect import ctypes def _async_raise(tid, exc_type): """rai ...
- Oracle数据库SQL语句操作大全汇总
数据库各个表空间增长情况的检查: SQL >SELECT A.TABLESPACE_NAME,( 1-(A.TOTAL)/B.TOTAL)* 100 USED_PERCENT FROM (SEL ...
- SpringMVC03 ParameterMethodNameResolver(参数方法名称解析器) And XmlViewResolver(视图解析器)
参数方法名称解析器 1.配置依赖包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...