小伙爬取CSDN博客TOP100榜單,發(fā)現(xiàn)高玩博主的秘密...
周末閑來無事,爬了爬CSDN榜單數(shù)據(jù)。
? 一、數(shù)據(jù)獲取
我們需要爬取的數(shù)據(jù)為CSDN周榜單,如下:

URL:https://blog.csdn.net/rank/writing_rank
檢查可以發(fā)現(xiàn),只需要簡單的構(gòu)造URL去請求,抓取json數(shù)據(jù),再從中提取出我們想要的數(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ù)',?'博客等級',?'是否認(rè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']??#?博客等級
????????is_expert?=?item['is_expert']???????????#?是否認(rè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ù)類型、內(nèi)存、索引、列名信息
數(shù)值列的統(tǒng)計(jì)信息
各列的相關(guān)系數(shù)
? 三、pyecharts數(shù)據(jù)可視化
1. pyecharts簡介和安裝
Echarts 是一個(gè)由百度開源的數(shù)據(jù)可視化,憑借著良好的交互性,精巧的圖表設(shè)計(jì),得到了眾多開發(fā)者的認(rèn)可。而 Python 是一門富有表達(dá)力的語言,很適合用于數(shù)據(jù)處理。當(dāng)數(shù)據(jù)分析遇上數(shù)據(jù)可視化時(shí),pyecharts 誕生了。
簡潔的 API 設(shè)計(jì),使用如絲滑般流暢,支持鏈?zhǔn)秸{(diào)用 囊括了 30+ 種常見圖表,應(yīng)有盡有 支持主流 Notebook 環(huán)境,Jupyter Notebook 和 JupyterLab 可輕松集成至 Flask,Sanic,Django 等主流 Web 框架 高度靈活的配置項(xiàng),可輕松搭配出精美的圖表 詳細(xì)的文檔和示例,幫助開發(fā)者更快的上手項(xiàng)目 多達(dá) 400+ 地圖文件,并且支持原生百度地圖,為地理數(shù)據(jù)可視化提供強(qiáng)有力的支持
pyecharts版本v0.5.x 和 v1 間不兼容,v1 是一個(gè)全新的版本,語法也有很大不同。
#?安裝pyecharts
pip?install?pyecharts?-i?http://pypi.douban.com/simple?--trusted-host?pypi.douban.com
import?pyecharts
print(pyecharts.__version__)?????????#?查看pyecharts版本
2. 數(shù)據(jù)可視化
首先,來看一看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)差距不大。
再來看看周排 Top100 博主里,已認(rèn)證博客專家的比例
#?-*-?coding:?UTF-8?-*-
"""
@File ???:博客專家占比.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)證了博客專家和沒有認(rèn)證的數(shù)量
df?=?pd.read_excel('rank_datas.xlsx')
datas?=?df['是否認(rèn)證為博客專家'].value_counts()
print(datas)
labels?=?['已認(rèn)證博客專家',?'未認(rè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中博客專家占比"))
????.render("pie_rich_label.html")
)
運(yùn)行效果如下:

可以發(fā)現(xiàn),在周排 Top100 的博主里,近 8 成都已認(rèn)證博客專家,那這些 Top100 博主的等級分布呢?
#?-*-?coding:?UTF-8?-*-
"""
@File ???:博客等級分布.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ì)各博客等級博主的數(shù)量
df?=?pd.read_excel('rank_datas.xlsx')
datas?=?df['博客等級'].value_counts()
#?print(datas)
labels?=?[f'等級{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="博客等級",????#?系列名稱
????????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="博客等級分布",
????????????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)圖,餅圖等無類目軸的圖表中使用
?????????),
????????label_opts=opts.LabelOpts(color="#fff"),
????)
????.render("customized_pie.html")
)
運(yùn)行效果如下:
發(fā)現(xiàn)了一些有意思的事情,周排 Top100 的博主們博客等級大都分布在等級7、等級8,分別占比42%、29%,等級5和等級11的博主都僅有一位,看看他倆是誰

最后來看看這些博主粉絲數(shù)和獲贊數(shù)對比
#?-*-?coding:?UTF-8?-*-
"""
@File ???:粉絲數(shù)量對比.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ì)各博客等級博主的數(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ù)對比",
??????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ù)對比.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ì)各博客等級博主的數(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ù)對比",
??????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ù)和綜合評價(jià)都遙遙領(lǐng)先的 Top1 博主,獲贊數(shù)不再領(lǐng)先,有很多位博主擁有的獲贊數(shù)都比他多。而獲贊數(shù)數(shù)量最少的僅有250,很是驚訝,寫程序查看發(fā)現(xiàn)跟之前博客等級為5的是同一個(gè)博主,但這位博主粉絲數(shù)卻不少。

庭云回到主頁看著自己的博客數(shù)據(jù),陷入了沉思~~
PS:公號內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起?100 天計(jì)劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!


【神秘禮包獲取方式】
