import random # 随机功能包
import time # 时间功能包
import numpy as np # nd.array数组处理包
import requests # 网络请求包
from lxml import etree # 页面解析包
import wordcloud # 词云图包
import matplotlib.pyplot as plt # 画图包
from PIL import Image # 图片处理包
import jieba # 中文分词包
class Douban:
def __init__(self):
# 50部高分电影的信息 (名称 id url 评分) 等等
self.base_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E8%B1%86%E7%93%A3%E9%AB%98%E5%88%86&page_limit=50&page_start=0'
self.comment_base_url = 'https://movie.douban.com/subject/%s/comments?start=%s&limit=20&sort=new_score&status=P'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
}
self.font = 'C:\Windows\Fonts\simhei.ttf'
##############################################################
##############################################################
##############################################################
# 注意需要改 这里的代码 把图片的地址 名称 换一下 就可以了 例如
# self.image_list = ['C:\Users\Public\Desktop\测试.jpg']
#############################################################
#############################################################
#############################################################
self.image_list = ['./chunyin.jpg','./nezha.jpeg','./panda.png','./pingtou.jpg','./xin.jpg','./zhongguo.jpg']
def get_comment(self, movie_id): # 获取该部电影影评
conments_list = []
for i in range(5): # 取5页评论数据
comment_url = self.comment_base_url % (movie_id, i * 20) # 拼成评论页面的完整链接
resp = requests.get(comment_url, headers=self.headers) # 请求评论的链接地址
html = etree.HTML(resp.content) # 解析网页
comment_list = html.xpath('//*[@id="comments"]/div/div[2]/p/span/text()') # 获取 网页里的 评论
conments_list.extend(comment_list) # 合并列表
time.sleep(3) # 等待3秒 以免速度太快 被反爬虫
return ''.join(conments_list) # 返回列表合并后的字符串
def cut_words(self, data): # 结巴分词处理字符串
words_dict = {} # 新建一个空字典 用来之后存数据
words_list = jieba.lcut(data) # 处理 评论字符
for word in words_list: # 遍历 已经处理完成的 词语
if len(word) == 1: # 单个词语排除
continue # 开始下次循环
else: # 把词语加入字典
words_dict[word] = words_dict.get(word, 0) + 1 # 遍历所有词语,每出现一次其对应的值加 1
return words_dict # 返回{词语:数量}的字典 数量越大 字体越大
def make_word_img(self,word_dict): # 制作图片
mask = np.array(Image.open(random.choice(self.image_list))) # 随机打开一张照片(背景图,用于生成不同的词云图形状)
wc = wordcloud.WordCloud(font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式,一般windows都有这个
mask=mask, # 设置背景图
background_color='white', # 设置背景颜色 (背景图空白部分的颜色)
max_words=80, # 最多显示词数 (每张图片有多少个词)
max_font_size=100, # 设置字体最大值
random_state=20, # 设置有多少种随机生成状态,即有多少种配色方案
scale=6 # 设置生成的词云图的大小
)
wc.generate_from_frequencies(word_dict) # 从字典生成词云
plt.figure(figsize=(7, 7)) # 设置图片大小
plt.imshow(wc) # 把词云加载成图片
plt.axis('off') # 关闭坐标轴
return plt # 返回已经处理过的 词云图数据流
def start(self):
resp = requests.get(self.base_url, headers=self.headers) # 请求链接地址
try:
resp_dict = resp.json()
movies_list = resp_dict.get('subjects')
for i in movies_list: # 遍历 这50部电影
movie_name = i.get('title') # 名称
movie_id = i.get('id') # id
movie_rate = i.get('rate') # 评分
comments = self.get_comment(movie_id) # 去获取对应id 的评论
words_dict = self.cut_words(comments) # 拿到字符串 用结巴中文分词 处理
plt = self.make_word_img(words_dict) # 把分词完成后的字典拿去词云图处理
plt.savefig(''.join(['./wordcloud/', movie_name, movie_rate, '.jpg'])) # 把词云图数据流保存图片
except:
print('请求失败,被反爬了')
if __name__ == '__main__':
douban = Douban()
douban.start()
Python制作词云图
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...