一年一度的博客之星活动正开展的如火如荼,由于博主也有幸进入200名的候选,因此在各个群里也不时轰炸各位CSDN博友,被打扰的亲见谅了。周末活动就结束了,哈哈。
这次活动参与了多少人呢?大佬们的粉丝团到底是啥样的呢?现在让我们起底下各位大佬的粉丝们去。
拉票太难了!大家有余票的,支持下我啊! 支持点我投票。
1、数据采集
经简单分析,CSDN官方并没有做任何限制,因此分析很简单,这里不再赘述。
我们直接访问
https://bss.csdn.net/m/topic/blog_star2020/getRanking 就可以获取每个爱豆的粉丝数。不过这个接口是个分页接口,不能够一把拉取所有的粉丝数,因为CSDN数据统计的原因,会非常慢,因此我们就按每页50条、100条的拉取即可。
写个并发拉取的c#程序,可以快速拉取并入库数据了。
var stars = rss.AllStar();
var list = new List<Task>();
for (int i = 0; i < stars.Count; i++)
{
Console.WriteLine($"start {stars[i].Nick_Name}====================");
list.Add( rss.GetAllFans(stars[i].UserName));
}
Task.WaitAll(list.ToArray());
public async Task<List<Blogger>> GetAllFans(string username)
{
var list = new List<Blogger>();
//设定每个人最多7000粉丝,这个有可能第一名会超,他粉丝太多太多了,哦哦哦
for (int i = 1 ; i < 70; i++)
{
var rt = await GetFans(username, i);
if (rt == null) break;
rt.ForEach(x => x.Star = username);
list.AddRange(rt);
Console.WriteLine($"acquire {username}'s fans {rt.Count}");
}
InsertData(list);
Console.WriteLine($"End {username}====================");
return list;
}
public async Task<List<Blogger>> GetFans(string username,int page)
{
var client = HttpclientFactory.CreateClient("csdn");
var req = new StringContent($"username={username}&page={page}&pageSize=100");
req.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");
var response = await client.PostAsync($"m/topic/blog_star2020/getRanking", req);
var content = await response.Content.ReadAsStringAsync();
var fanInfo = JsonConvert.DeserializeObject<RtnFanInfo>(content);
if(fanInfo.Data != "[]")
{
var list = JsonConvert.DeserializeObject<List<Blogger>>(fanInfo.Data);
return list;
}
else
{
return null;
}
}
如果需要多ip访问,推荐使用家庭ip,可免费试用。
2、建表入库
利用mysql存储数据,这里需要注意的是,csdn的用户名是包含表情字符的,因此需要使用utf8mb4进行存储。
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for starfan2
-- ----------------------------
DROP TABLE IF EXISTS `starfan2`;
CREATE TABLE `starfan2` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`star` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`nick_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`level` int(255) NULL DEFAULT NULL,
`codelevel` int(255) NULL DEFAULT NULL,
`votenum` int(11) NULL DEFAULT NULL,
`starname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 55321 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
3、活动参与人数
截止到01月20日的11点,统计参与的粉丝人数合计:26094。2万6千人的狂欢啊,粉丝的热情还是很高的。
# 统计去重的粉丝总量
select count(distinct username) from starfan2;
4、拥有很多票的粉丝
哈哈,这里曝光下拥有很多票的粉丝,候选人们赶快动手去挖墙角去啊。
select nick_name,CONCAT('https://blog.csdn.net/',max(username)) username, max(votenum) as vts from starfan2 group by nick_name order by vts desc limit 20;
| 金主爸爸 | 博客 | 已投票 |
|---|---|---|
| 谷哥的小弟 | blog.csdn.net/lfdfhl | 130 |
| 一叶飘舟 | blog.csdn.net/jdsjlzx | 130 |
| beyondma | blog.csdn.net/BEYONDMA | 126 |
| herosunly | blog.csdn.net/herosunly | 120 |
| 文宇肃然 | blog.csdn.net/wenyusuran | 120 |
| 谙忆 | blog.csdn.net/qq_26525215 | 119 |
| vv_小虫 | blog.csdn.net/vv_bug | 118 |
| ConstXiong | blog.csdn.net/meism5 | 117 |
| 铁锚 | blog.csdn.net/renfufei | 117 |
| AI之禅 | blog.csdn.net/weixin_3239… | 110 |
| _陈哈哈 | blog.csdn.net/qq_39390545 | 110 |
| 白水baishui | blog.csdn.net/baishuiniya… | 110 |
| carl-zhao | blog.csdn.net/u012410733 | 108 |
| AlbertS | blog.csdn.net/shihengzhen… | 108 |
| Sahadev_ | blog.csdn.net/u011064099 | 108 |
| 671coder | blog.csdn.net/liuqiyao_01 | 108 |
| 恬静的小魔龙 | blog.csdn.net/q764424567 | 108 |
| 小山猪的沙塔 | blog.csdn.net/u012039040 | 108 |
| 简简单单OnlineZuozuo | blog.csdn.net/qq_15071263 | 108 |
| Trent1985 | blog.csdn.net/Trent1985 | 106 |
5、排名前十的博主号召投票的粉丝数
多年前使用过R,都忘光了,简单绘制下。这里仅仅是参与投票的粉丝数,没有参见投票的粉丝,可能过万,并且也可能不仅仅在CSDN。
# 利用R绘制图形
library(RMySQL)
con <- dbConnect(MySQL(), host="192.168.1.6", dbname="test", user="root", password="lyxa123456")
# 先解决花名的编码问题
dbSendQuery(con, "SET NAMES utf8mb4")
star <- dbGetQuery(con,"select max(starname) name,sum(votenum) vts,count(*) fans from starfan2 group by star order by vts desc limit 20")
# 重新解码花名
Encoding(star$name) <-"UTF-8"
star$name <- as.factor(star$name);
plot(star$name,star$fans)
6、前20名博主的粉丝投票平均数
select max(starname) name,sum(votenum) vts,count(*) fans, sum(votenum)/count(*) avegVotes from starfan2 group by star order by vts desc limit 20
经过查询,可知道各个大佬的粉丝死忠程度。
| 排名 | 博主 | 票数 | 粉丝数 | 平均投票 |
|---|---|---|---|---|
| 1 | 敖 丙 | 8954 | 3212 | 2.7877 |
| 2 | Hollis在csdn | 5215 | 1445 | 3.6090 |
| 3 | 谷哥的小弟 | 4950 | 666 | 7.4324 |
| 4 | 帅地 | 4632 | 1901 | 2.4366 |
| 5 | 小傅哥 | 4127 | 682 | 6.0513 |
| 6 | 一个处女座的程序猿 | 4012 | 1233 | 3.2539 |
| 7 | 小林coding | 3951 | 761 | 5.1919 |
| 8 | 沉默王二 | 3945 | 1299 | 3.0370 |
| 9 | 1_bit | 3921 | 667 | 5.8786 |
| 10 | 第三女神程忆难 | 3322 | 809 | 4.1063 |
| 11 | qq2648008726 | 3062 | 359 | 8.5292 |
| 12 | 中间件兴趣圈 | 2816 | 359 | 7.8440 |
| 13 | 张志翔 | 2776 | 602 | 4.6113 |
| 14 | 李锐博恩 | 2712 | 504 | 5.3810 |
| 15 | 谙忆 | 2632 | 950 | 2.7705 |
| 16 | Jack-Cui | 2503 | 620 | 4.0371 |
| 17 | TrueDei | 2489 | 671 | 3.7094 |
| 18 | 程序猿小亮 | 2421 | 235 | 10.3021 |
| 19 | lovelife110 | 2333 | 221 | 10.5566 |
| 20 | LaoYuanPython | 2277 | 574 | 3.9669 |
按照总票数 124897计算,每个人平均投票数为 4.8票。
7、小结
经此一役,博主发现了自己短板,即使数据在手,也无法分析挖掘出更多信息,博主的大数据分析能力太差了额。需要向大佬们学习数据挖掘的知识了。