一.实现功能
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})
网友评论