[超详细] 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 ...
随机推荐
- 2017-10-20 NOIP模拟赛2
P98 a [问题描述]你是能看到第一题的 friends 呢.——hja世界上没有什么比卖的这么贵的弹丸三还令人绝望的事了,所以便有了这么一道题.定义?(?)为满足(? × ?)|?的有序正整数对( ...
- 洛谷P5170 【模板】类欧几里得算法(数论)
传送门 此题剧毒,公式恐惧症患者请直接转去代码→_→ 前置芝士 基本数论芝士 题解 本题就是要我们求三个函数的值 \[f(a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac ...
- 全网排名第一的免费开源ERP Odoo Git源代码部署教程
文/开源智造联合创始人老杨 本文来自<开源自主OdooERP部署架构指南>试读:第三章-Git源代码部署 .书籍尚未出版,请勿转载.欢迎您反馈阅读意见. 我们将从git源代码部署Odoo ...
- [WebShow系列] Web浏览器最大化满屏及比例缩放方法
如果要在大屏上展示,大屏所带电脑的浏览器应该处于满屏,此时就不会显示浏览器软件的边框了.个别浏览器在满屏状态下,某些边栏等还继续保留,此时应设置此浏览器的显示选项方可消除. 如果屏幕中的显示对象过小或 ...
- screen命令常用参数使用
screen简要说明 screen 会话命令可以保持本地和服务器断开后,程序继续在服务器上运行,并且运行结束后,输出最后的结果.功能结果相当于 nohup command &,但是功能远比no ...
- Ehab and subtraction(思维题)
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- 一个基于 easyui, vue 和 maptalks 的简单地图应用
一个基于 easyui, vue 和 maptalks 的简单地图应用 做了一个小应用,结合 easyui , vue 和 maptalks 的简单的地图应用.可以用来画图,什么的. 地址
- Soft skill
不要害怕让别人看到自己的无知 作为高级程序员的一个好处是,当别人问一些我不懂的问题时,我可以很淡然地告诉他们: 这个东西我也不懂,因为以前没有遇到过,不过我可以看一下,然后再告诉你. 当我还是一个初级 ...
- 动态页面技术----JSP技术
1995年java诞生,没有jsp,只有Servlet, Servlet开发:Servlet上嵌套html代码,非常繁琐. 1998年,出现jsp,方便写html代码,并且可以在html代码中嵌套ja ...
- java8 api简介(一)
from https://www.aliyun.com/jiaocheng/785076.html 摘要:函数式编程详解:前言:现在有很多公司都用了jdk8,但是函数式编程也许没有用上,jdk8也提供 ...