Python制作词云图

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()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359