python django框架-maoyan项目添加tangshi应用

一.实现功能

1. 诗人作品数排名列表

根据爬虫数据抓取的总作品数排序生成排名,前端以表格显示

python django框架-maoyan项目添加tangshi应用_第1张图片
排名
2. 词云.

将每个诗人的所有作品进行文本处理,使用jieba和wordcloud模块生成词云

python django框架-maoyan项目添加tangshi应用_第2张图片
李白词云
3. 实现词云搜索

前端页面在展示排行榜时候,加入了搜索文本框和搜索按钮,通过点击搜索按钮查询出该诗人的总作品数和词云,如果没有搜索结果,后期会考虑加入调动爬虫抓取,目前检索数据库没有数据的话返回无数据的提示.

python django框架-maoyan项目添加tangshi应用_第3张图片
搜索词云

二.处理逻辑

1. 诗人列表的实现没有用到django的orm模型,生成models.py文件,因为表在爬虫时候已经建好,python manage.py inspectdb虽然可以执行已存在表创建对应的model,考虑到sql用的多,处理数据相对更容易.最终采用\Python链接上mysql执行的sql语句,将数据渲染到前端html页面
2. 词云

django中在项目根目录下创建了static文件夹,用于存放图片 js 字体等静态文件,并且在settings中也设置了static的路径,

#静态文件设置的路径
STATIC_URL = '/static/'
STATICFILES_DIRS=[os.path.join(BASE_DIR,  'static')]

如果想在页面里嵌入图片的话,前端html 中img src属性需要指定图片路径,这里我存到到了static/wordImages路径,根据诗人的姓名命名图片.

考虑到查询返回效率问题:

2.1 首先生成全部词云图片
爬虫抓取下来2391位诗人后,首先用jieba和wordcloud模块实现了全部词云图片的生成,保存到static/wordImages路径.

python django框架-maoyan项目添加tangshi应用_第4张图片
全部词云图片生成

2.2 搜索查询场景
查询的时候会调用检查词云是否存在的check_word_cloud函数,如果存在直接调取该图片,不存在图片会将参数传递给制作词云的函数去生成并保存到static/wordImages路径.

3.词云代码
from maoyan.settings import BASE_DIR
    #制作 词云图片 存放到    static/wordImages目录 根据前端搜索传递的诗人姓名 生成
    def make_poemer_word_clound(self,poemer):
        wordcloud_png_path = path.join(BASE_DIR, 'static/wordImages/{}'.format(poemer))
        par_path = path.dirname(__file__)
        datas = [x[1] for x in self.fetch_data(self.tangshi_word_clound_sql.format(poemer))]
        word_list = [" ".join(jieba.cut(sentence)) for sentence in datas]
        new_text = ' '.join(word_list)
        imagename = path.join(par_path, "bg.png")  # 背景图片路径
        coloring = imread(imagename)  # 读取背景图片
        fontname = path.join(par_path, "msyh.ttf")  # 使用的是微软雅黑字体
        wordcloud = WordCloud(mask=coloring, font_path=fontname,max_font_size=40).generate(new_text)
        plt.imshow(wordcloud)
        plt.axis("off")
        wordcloud.to_file('{}.png'.format(wordcloud_png_path))

    #生成所有诗人的图片 先检查是否存在词云 不存在调取
    def make_all_word_cloud(self):
        #fetch_data函数为查询数据库诗人表 select id,poemer from poemers返回的元组
        all_poemers = [{'id':int(x[0]),'poemer':x[2]} for x in self.fetch_data(self.all_poemers_sql)]
        for item in all_poemers:
            if self.check_word_cloud(item['poemer']):
                continue
            else:
                #不存在调用生成词云
                self.make_poemer_word_clound(item['poemer'])
        return all_poemers

    #检查前端传递的诗人 词云图片是否存在 返回True或者False
    def check_word_cloud(self,poemer):
        par_path = path.join(BASE_DIR, 'static/wordImages')
        os.chdir(par_path)
        for root, dirs, files in os.walk(".", topdown=True):
            if poemer in [file.replace('.png', '') for file in files]:
                return True
            else:
                return False
4.django app tangshi下views.py view视图函数
def all_word_cloud(request):
    tangshi = TangShi()
    all_poemers = tangshi.make_all_word_cloud()
    return render(request,'tangshi/all_poemers_words_cloud.html',{'all_poemers':all_poemers})

你可能感兴趣的:(python django框架-maoyan项目添加tangshi应用)