小伙爬取CSDN博客TOP100榜單,發(fā)現(xiàn)高玩博主的秘密...

周末閑來(lái)無(wú)事,爬了爬CSDN榜單數(shù)據(jù)。
一、數(shù)據(jù)獲取
我們需要爬取的數(shù)據(jù)為CSDN周榜單,如下:
URL:https://blog.csdn.net/rank/writing_rank
檢查可以發(fā)現(xiàn),只需要簡(jiǎn)單的構(gòu)造URL去請(qǐng)求,抓取json數(shù)據(jù),再?gòu)闹刑崛〕鑫覀兿胍臄?shù)據(jù)保存到Excecl。
代碼如下
# -*- coding: UTF-8 -*-
"""
@File :demo.py
@Author :葉庭云
@CSDN :https://yetingyun.blog.csdn.net/
"""
import requests
import json
import logging
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['博主昵稱', '排名', '綜合得分', '粉絲數(shù)', '獲贊數(shù)', '博客等級(jí)', '是否認(rèn)證為博客專(zhuān)家'])
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
}
for i in range(1, 11):
# username={改成你的username}
url = f'https://blog.csdn.net/api/WritingRank/weekList?username={改成你的username}&page={i}&size=10'
rep = requests.get(url, headers=headers)
data = json.loads(rep.text)
datas = data['data']['list']
for item in datas:
score = item['score'] # 綜合得分
ranking = item['ranking'] # 排名
user_nickname = item['user_nickname'] # 博主昵稱
fans_num = item['fans_num'] # 粉絲數(shù)
fav_num = item['fav_num'] # 獲贊數(shù)
level = item['profile_level']['level'] # 博客等級(jí)
is_expert = item['is_expert'] # 是否認(rèn)證為博客專(zhuān)家
sheet.append([user_nickname, ranking, score, fans_num, fav_num, level, is_expert])
logging.info([user_nickname, ranking, score, fans_num, fav_num, level, is_expert])
wb.save('rank_datas.xlsx')
二、查看數(shù)據(jù)
隨機(jī)抽取8行數(shù)據(jù)查看
查看數(shù)據(jù)類(lèi)型、內(nèi)存、索引、列名信息
數(shù)值列的統(tǒng)計(jì)信息
各列的相關(guān)系數(shù)
三、pyecharts數(shù)據(jù)可視化
1. pyecharts簡(jiǎn)介和安裝
Echarts 是一個(gè)由百度開(kāi)源的數(shù)據(jù)可視化,憑借著良好的交互性,精巧的圖表設(shè)計(jì),得到了眾多開(kāi)發(fā)者的認(rèn)可。而 Python 是一門(mén)富有表達(dá)力的語(yǔ)言,很適合用于數(shù)據(jù)處理。當(dāng)數(shù)據(jù)分析遇上數(shù)據(jù)可視化時(shí),pyecharts 誕生了。
-
簡(jiǎn)潔的 API 設(shè)計(jì),使用如絲滑般流暢,支持鏈?zhǔn)秸{(diào)用 -
囊括了 30+ 種常見(jiàn)圖表,應(yīng)有盡有 -
支持主流 Notebook 環(huán)境,Jupyter Notebook 和 JupyterLab -
可輕松集成至 Flask,Sanic,Django 等主流 Web 框架 -
高度靈活的配置項(xiàng),可輕松搭配出精美的圖表 -
詳細(xì)的文檔和示例,幫助開(kāi)發(fā)者更快的上手項(xiàng)目 -
多達(dá) 400+ 地圖文件,并且支持原生百度地圖,為地理數(shù)據(jù)可視化提供強(qiáng)有力的支持
pyecharts版本v0.5.x 和 v1 間不兼容,v1 是一個(gè)全新的版本,語(yǔ)法也有很大不同。
# 安裝pyecharts
pip install pyecharts -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
import pyecharts
print(pyecharts.__version__) # 查看pyecharts版本
2. 數(shù)據(jù)可視化
首先,來(lái)看一看Top10的大佬博主都是哪些人
# -*- coding: UTF-8 -*-
"""
@File :漏斗圖_top10.py
@Author :葉庭云
@CSDN :https://yetingyun.blog.csdn.net/
"""
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import Funnel
from pyecharts.globals import CurrentConfig, ThemeType
# 引用本地 js 資源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
# 讀取數(shù)據(jù)
df = pd.read_excel('rank_datas.xlsx')
# 取博主昵稱 綜合得分兩列數(shù)據(jù)
df1 = df[['博主昵稱', '綜合得分']]
# print(df1)
# 取Top10博主數(shù)據(jù)
labels = list(df1['博主昵稱'][:10])
values = list(df1['綜合得分'][:10])
data = [[labels[x], int(values[x])] for x in range(len(labels))]
# 漏斗圖可視化
c = (
Funnel(init_opts=opts.InitOpts(width="1200px", height="600px", theme=ThemeType.LIGHT))
.add(
series_name='', # 系列名稱,用于 tooltip 的顯示,legend 的圖例篩選。
data_pair=data, # 系列數(shù)據(jù)項(xiàng),格式為 [(key1, value1), (key2, value2)]
gap=3, # 數(shù)據(jù)圖形間距
label_opts=opts.LabelOpts(is_show=True, position="inside"), # 標(biāo)簽配置項(xiàng),參考 `series_options.LabelOpts`
)
.set_global_opts(
title_opts=opts.TitleOpts(title="CSDN周排Top10博主一覽"), # 標(biāo)題
legend_opts=opts.LegendOpts(type_="scroll", pos_top='50%', pos_left="80%", orient="vertical"), # 調(diào)整圖例位置
)
.render('funnel_chart.html')
)
運(yùn)行效果如下:
排在第一的大佬博主是:一個(gè)處女座的程序猿,綜合指標(biāo):894,遠(yuǎn)高于之后的其他博主,而從漏斗圖也容易看出,后面 9 位博主綜合指標(biāo)差距不大。
再來(lái)看看周排 Top100 博主里,已認(rèn)證博客專(zhuān)家的比例
# -*- coding: UTF-8 -*-
"""
@File :博客專(zhuān)家占比.py
@Author :葉庭云
@CSDN :https://yetingyun.blog.csdn.net/
"""
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.globals import CurrentConfig
# 引用本地 js 資源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
# 讀取數(shù)據(jù) 統(tǒng)計(jì)認(rèn)證了博客專(zhuān)家和沒(méi)有認(rèn)證的數(shù)量
df = pd.read_excel('rank_datas.xlsx')
datas = df['是否認(rèn)證為博客專(zhuān)家'].value_counts()
print(datas)
labels = ['已認(rèn)證博客專(zhuān)家', '未認(rèn)證博客專(zhuān)家']
value = datas.values
data = [[i, int(j)] for i, j in zip(labels, value)]
c = (
Pie()
.add(
series_name="", # 系列名稱,用于 tooltip 的顯示,legend 的圖例篩選。
data_pair=data, # 系列數(shù)據(jù)項(xiàng),格式為 [(key1, value1), (key2, value2)]
radius=["40%", "60%"], # 餅圖的半徑,數(shù)組的第一項(xiàng)是內(nèi)半徑,第二項(xiàng)是外半徑
# 富文本設(shè)置
label_opts=opts.LabelOpts(
position="outside",
formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|go7utgvlrp%} ",
background_color="#eee",
border_color="#aaa",
border_width=1,
border_radius=4,
rich={
"a": {"color": "#999", "lineHeight": 22, "align": "center"},
"abg": {
"backgroundColor": "#e3e3e3",
"width": "100%",
"align": "right",
"height": 22,
"borderRadius": [4, 4, 0, 0],
},
"hr": {
"borderColor": "#aaa",
"width": "100%",
"borderWidth": 0.5,
"height": 0,
},
"b": {"fontSize": 16, "lineHeight": 33},
"per": {
"color": "#eee",
"backgroundColor": "#334455",
"padding": [2, 4],
"borderRadius": 2,
},
},
),
)
.set_colors(['#FF1493', '#BA55D3'])
.set_global_opts(title_opts=opts.TitleOpts(title="周排Top100中博客專(zhuān)家占比"))
.render("pie_rich_label.html")
)
運(yùn)行效果如下:
可以發(fā)現(xiàn),在周排 Top100 的博主里,近 8 成都已認(rèn)證博客專(zhuān)家,那這些 Top100 博主的等級(jí)分布呢?
# -*- coding: UTF-8 -*-
"""
@File :博客等級(jí)分布.py
@Author :葉庭云
@CSDN :https://yetingyun.blog.csdn.net/
"""
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.globals import CurrentConfig
# 引用本地 js 資源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
# 讀取數(shù)據(jù) 統(tǒng)計(jì)各博客等級(jí)博主的數(shù)量
df = pd.read_excel('rank_datas.xlsx')
datas = df['博客等級(jí)'].value_counts()
# print(datas)
labels = [f'等級(jí){i}' for i in datas.index]
nums = [int(j) for j in datas]
data = [[i, j] for i, j in zip(labels, nums)]
print(data)
c = (
# 寬 高 背景顏色
Pie(init_opts=opts.InitOpts(width="1000px", height="600px", bg_color="#2c343c"))
.add(
series_name="博客等級(jí)", # 系列名稱
data_pair=data, # 系列數(shù)據(jù)項(xiàng),格式為 [(key1, value1), (key2, value2)]
rosetype="radius", # radius:扇區(qū)圓心角展現(xiàn)數(shù)據(jù)的百分比,半徑展現(xiàn)數(shù)據(jù)的大小
radius="55%", # 餅圖的半徑
center=["50%", "50%"], # 餅圖的中心(圓心)坐標(biāo),數(shù)組的第一項(xiàng)是橫坐標(biāo),第二項(xiàng)是縱坐標(biāo)
label_opts=opts.LabelOpts(is_show=False, position="center"), # 標(biāo)簽配置項(xiàng)
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="博客等級(jí)分布",
pos_left="center",
pos_top="20",
title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
),
legend_opts=opts.LegendOpts(is_show=False),
)
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a}
{b}: {c} (go7utgvlrp%)" # 'item': 數(shù)據(jù)項(xiàng)圖形觸發(fā),主要在散點(diǎn)圖,餅圖等無(wú)類(lèi)目軸的圖表中使用
),
label_opts=opts.LabelOpts(color="#fff"),
)
.render("customized_pie.html")
)
運(yùn)行效果如下:
發(fā)現(xiàn)了一些有意思的事情,周排 Top100 的博主們博客等級(jí)大都分布在等級(jí)7、等級(jí)8,分別占比42%、29%,等級(jí)5和等級(jí)11的博主都僅有一位,看看他倆是誰(shuí)
最后來(lái)看看這些博主粉絲數(shù)和獲贊數(shù)對(duì)比
# -*- coding: UTF-8 -*-
"""
@File :粉絲數(shù)量對(duì)比.py
@Author :葉庭云
@CSDN :https://yetingyun.blog.csdn.net/
"""
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import CurrentConfig, ThemeType
# 引用本地 js 資源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
# 讀取數(shù)據(jù) 統(tǒng)計(jì)各博客等級(jí)博主的數(shù)量
df = pd.read_excel('rank_datas.xlsx')
nums = [int(x) for x in df['粉絲數(shù)']]
rank = [int(y) for y in df['排名']]
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
.add_xaxis(xaxis_data=rank)
.add_yaxis(
series_name='粉絲數(shù)', yaxis_data=nums,
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(name='排名'),
yaxis_opts=opts.AxisOpts(
name='粉絲數(shù)', min_=0, max_=320000, # y軸刻度的最小值 最大值
),
title_opts=opts.TitleOpts(
title="Top100博主的粉絲數(shù)對(duì)比",
title_textstyle_opts=opts.TextStyleOpts(
font_family="KaiTi", font_size=20, color="black"
)
)
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="min", name="最小值"),
opts.MarkPointItem(type_="average", name="平均值")]),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_="average", name="平均值")]))
.render('bar_chart.html')
)
運(yùn)行效果如下:
排名第一的博主粉絲數(shù)量超多,有309147位粉絲,遠(yuǎn)高于其他博主,粉絲數(shù)量最少的也有1080
# -*- coding: UTF-8 -*-
"""
@File :點(diǎn)贊數(shù)對(duì)比.py
@Author :葉庭云
@CSDN :https://yetingyun.blog.csdn.net/
"""
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import CurrentConfig, ThemeType
# 引用本地 js 資源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
# 讀取數(shù)據(jù) 統(tǒng)計(jì)各博客等級(jí)博主的數(shù)量
df = pd.read_excel('rank_datas.xlsx')
nums = [int(x) for x in df['獲贊數(shù)']]
rank = [int(y) for y in df['排名']]
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
.add_xaxis(xaxis_data=rank)
.add_yaxis(
series_name='獲贊數(shù)', yaxis_data=nums,
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(name='排名'),
yaxis_opts=opts.AxisOpts(
name='獲贊數(shù)', min_=0, max_=40000, # y軸刻度的最小值 最大值
),
title_opts=opts.TitleOpts(
title="Top100博主的獲贊數(shù)對(duì)比",
title_textstyle_opts=opts.TextStyleOpts(
font_family="KaiTi", font_size=20, color="#fff"
)
)
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最小值"),
opts.MarkPointItem(type_="min", name="最小值"),
opts.MarkPointItem(type_="average", name="平均值")]),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_="average", name="平均值")]))
.render('bar_chart1.html')
)
運(yùn)行效果如下:
意想不到的事情發(fā)生了,粉絲數(shù)和綜合評(píng)價(jià)都遙遙領(lǐng)先的 Top1 博主,獲贊數(shù)不再領(lǐng)先,有很多位博主擁有的獲贊數(shù)都比他多。而獲贊數(shù)數(shù)量最少的僅有250,很是驚訝,寫(xiě)程序查看發(fā)現(xiàn)跟之前博客等級(jí)為5的是同一個(gè)博主,但這位博主粉絲數(shù)卻不少。
庭云回到主頁(yè)看著自己的博客數(shù)據(jù),陷入了沉思~~
作者:葉庭云 CSDN:https://yetingyun.blog.csdn.net/
本文來(lái)自公眾號(hào)讀者投稿,歡迎各位童鞋向公號(hào)投稿,點(diǎn)擊下面圖片了解詳情!
-END-
掃碼添加早小起
1. 回復(fù)「進(jìn)群」進(jìn)入Python技術(shù)交流群
2. 回復(fù)「Python」獲得Python技術(shù)圖書(shū)
3. 回復(fù)「習(xí)題」領(lǐng)取Python數(shù)據(jù)處理200題

