python数据可视化:使⽤dash给博客制作⼀个dashboard
1.dashboard
仪表板通常提供与特定⽬标或业务流程相关的关键绩效指标(KPI)的概览。另⼀⽅⾯,“仪表板”具有“进度报告”或“报告”的另⼀个名称。
“仪表板”通常显⽰在⽹页上,该⽹页链接到允许报告不断更新的数据库。例如,制造仪表板可以显⽰与⽣产率相关的数字,例如制造的零件数量,或每⼩时失败的质量检查的数量。同样,⼈⼒资源仪表板可能会显⽰与员⼯招聘,保留和组成相关的数字,例如,或平均天数或每次招聘成本。
2.功能确定
写之前先确定⼀些要实现的功能:
2.1. 博客基本数据跟踪
上图中的博客中的数据进⾏实时跟踪,且1分钟⼀刷新⼀次(之前⽤10秒,ip被封了。。。。),将这些数据横向放在⼀个row⾥,博客名称和头像放在页头。
实现效果如下:
2.2. 图表确定
2.2.1 展⽰每⽉写作情况的柱状图
其实就是博客上下⾯的数据:
2.2.2 展⽰不同类型⽂章的饼图
这⾥我对我⽂章类型重新划分了类型,博客上划分的有点乱,⽽且我确定了每篇⽂章只有⼀个类型, 具体代码如下:
笔记本的程序管理器def get_type(title):
the_type ='其他'
article_types =['项⽬','pytorch','flask','scikit-learn','pyspark','数据预处理','每⽇⼀练','数据分析','爬⾍',
'数据可视化','java','增长⿊客']
wxpython中文破解版for article_type in article_types:
if article_type in title:
the_type = article_type
break
return the_type
2.2.3 各类⽂章的总/平均阅读情况
⽂章的阅读情况是作者⽐较关系的数据,这⾥⽤柱状图展⽰没类⽂章总的阅读数,⽤折线图展⽰没类⽂章平均阅读情况:
2.2.4 ⽤热图展⽰每⽇写作情况
通过颜⾊的深浅表⽰当天发布⽂章的数量, 通过下拉菜单选择年份:
这个图是不是看着很眼熟。。
其实就是模仿gayhub的样式。
2.2.5 ⽂章列表
显⽰⽂章的标题,点击跳转到相应⽹页,关联图⽚,通过点击图表对⽂章显⽰做选择:
2.2.6 ⾊调选择
为啥⽤绿⾊?有如下⼏个原因:
1. 春天快来了,万物复苏,动物们⼜到了交。。。。。反正就是有⽣机
2. 模仿github的热图样式
3. 要想⽣活过得去。。。
请原谅我的不正经[滑稽]
3 数据获取
数据获取主要分两个部分:基本数据获取(1分钟刷新⼀次),⽂章数据获取(1⼩时刷新⼀次)
3.1 基本数据获取
博客没有api,只能⾃⼰爬取,注意不要访问频率太⾼,会封ip
代码如下:
def get_info():
headers ={
'User-Agent':'Mozilla/5.0 (MSIE 10.0; Windows NT 6.1; Trident/5.0)',
'referer':'https: // passport.csdn / login',
}
url = random.choice(blog_list)
try:
resp = (url, headers=headers)
now = w().strftime("%Y-%m-%d %X")
soup = ,'lxml')
head_img = soup.find('div', class_='avatar-box d-flex justify-content-center flex-column').find('a').find('img')['src'] author_name = soup.find('div', class_='user-info d-flex justify-content-center flex-column').get_text(strip=True) row1_nums = soup.find('div', class_='data-info d-flex item-tiling').find_all('span', class_='count')
网站你懂我意思正能量晚上在线观看不用下载免费
row2_nums = soup.find('div', class_='grade-box clearfix').find_all('dd')
rank = soup.find('div', class_='grade-box clearfix').find_all('dl')[-1]['title']
info ={
'date': now,
'head_img': head_img,
'author_name': author_name,
'article_num':int(row1_nums[0].get_text()),
'fans_num':int(row1_nums[1].get_text()),
'like_num':int(row1_nums[2].get_text()),
'comment_num':int(row1_nums[3].get_text()),
'level':int(row2_nums[0].find('a')['title'][0]),
'visit_num':int(row2_nums[1]['title']),
'score':int(row2_nums[2]['title']),
'rank':int(rank),
}
df_info = pd.DataFrame([info.values()], columns=info.keys())
return df_info
except Exception as e:
print(e)
3.2 博客⽂章获取
获取博客的所有⽂章的相关数据,并存储到sqlite中,代码如下:
dos命令从c盘进入d盘def get_blog():
headers ={
'User-Agent':'Mozilla/5.0 (MSIE 10.0; Windows NT 6.1; Trident/5.0)',
'referer':'https: // passport.csdn / login',
}
base_url ='blog.csdn/tonydz0523/article/list/'
resp = (base_url+"1", headers=headers, timeout=3)
max_page =int(re.findall(r'var listTotal = (\d+) ;', )[0])//20+2# 在js中获取⽂章数
df = pd.DataFrame(columns=['url','title','date','read_num','comment_num','type'])
count =0
for i in range(1, max_page):
url = base_url +str(i)
resp = (url, headers=headers)
soup = ,'lxml')
articles = soup.find("div", class_='article-list').find_all('div', class_='article-item-box csdn-tracking-statistics')
for article in articles[1:]:
a_url = article.find('h4').find('a')['href']
title = article.find('h4').find('a').get_text(strip=True)[1:]
issuing_time = article.find('span', class_="date").get_text(strip=True)
num_list = article.find_all('span', class_="num")
python基础代码大全黑客read_num = num_list[0].get_text(strip=True)
comment_num = num_list[1].get_text(strip=True)
the_type = get_type(title)
购物网站页面设计模板df.loc[count]=[a_url, title, issuing_time,int(read_num),int(comment_num), the_type]
count +=1
time.sleep(random.choice([1,1.1,1.3]))
return df
df_article = get_blog()
_sql('blogs', con=engine, if_exists='replace', index=True)
获取数据的没有难点,获取页数可以在js代码中
4 数据交互
如想使⽤交互是的显⽰数据,那么就需要使数据在前后段进⾏传输,dash使⽤react.js创建了很多相关表单组件,通过配合后端的callback 函数进⾏数据的更新
Dash组件
1. Interval:固定时间刷新页⾯数据
2. Dropdown:下拉菜单样式的表单
3. Graph:⽤于展⽰使⽤plotly绘制的图表
Callback函数
Callback函数是有数据前后端传输的功能,通过Input和Output中id与项⽬layout中id进⾏关联,⼀个Callback可以有很多输⼊,但是只能有⼀个输出。
看下⾯代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论