美文网首页Python三期爬虫作业Python四期爬虫作业
python django框架-maoyan项目添加tangsh

python django框架-maoyan项目添加tangsh

作者: chengcxy | 来源:发表于2017-10-26 15:51 被阅读29次

    一.实现功能

    git地址:https://github.com/chengcxy/Django_project/tree/master/maoyan

    1. 诗人作品数排名列表

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

    排名
    2. 词云.

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

    李白词云
    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路径.

    全部词云图片生成

    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项目添加tangsh

        本文链接:https://www.haomeiwen.com/subject/bptkpxtx.html