前言:从1k到1w粉的感悟

拖更了好多好多天的一万粉博文终于来啦!

还记得我在几个月达到1k粉丝的时候立下的flag,当时还以为没戏来着,没想到这么快就一万粉了!(万分感谢!!!


过去的近半年的时间真的过得很充实,在这段时间里,我开始花时间认真地写技术博文,写过像机器学习这样一整个系列的博文,也整理了很多的知识点,大部分也都集中在了数据分析这个专栏当中。感谢努力没有白费,我的博文逐渐被更多的人看到,总阅读量也突破了我从未设想过的200w这个数字。当然了,在这个过程当中收获最多最开心的就是大家的感谢,这些我都存在了我自己的一个文件夹里,并且希望能够永久的珍藏。

(其中几位印象深刻的朋友)

也是在这个过程当中,我收到了一些特别的朋友的来信,其中有一个叫Eric的朋友,说他或多或少改变了我的未来,或许也不太过分?

虽然通话没一分钟的时候Eric就发现我并非他寻找的合适人员(Eric看我博客以为我已经出来工作好几年了,实际上我其实还未毕业,达不到社招的要求),但他见我对工作似乎有些困惑,仍愿意帮助我解答问题。尽管当时的我也忙于实验室,但也开始意识到了,如果不考研的话,是时候出来实习工作了!

而后面我就开始我的实习之旅至今,也正是因为实习的缘故,回复大家的信息的速度也慢了很多,希望大家能够理解。

回到正题,因为我们这毕竟算是技术博客,冗长的废话讲完了,还是得来讲一讲如何从代码方面爬取粉丝的数据,当然了,还有介绍后面的数据分析环节。

1 爬取粉丝数据

好,第一个问题——怎么将我的粉丝数据爬取下来呢?

1.1 爬取前的思路整理

首先,我们定位到这个链接:https://w0714.blog.csdn.net/?type=sub&subType=fans

因为粉丝都在这个页面会出现,所以我们需要先从这个页面开始下手,即,右键点击检查(或者直接按F12键)

在一番摸索后,我们可以发现,突破口就在这个链接这里:
https://blog.csdn.net/community/home-api/v2/get-fans-list?page=2&pageSize=20&id=78851588&noMore=false&blogUsername=qq_44186838

这是我复制的其中一个链接,我们来分析一下。

学过网站设计的朋友肯定都知道,?后面跟的是传递给前面网页的变量,即传递给https://blog.csdn.net/community/home-api/v2/get-fans-list的一共有5个变量,分别是:

  1. page
  2. pageSize
  3. id
  4. noMore
  5. blogUsername

如果我们再去对比其他的相似链接不难发现,pageSize、noMore和blogUsername的值是不变的,默认值分别是20,false和自己的CSDNid。

page的话则是从1逐步递增,直至你的粉丝数量页见底。

而id的话则比较难搞,它似乎没有一个固定的规律,所以目前我的解决方法是人工记录下来哈哈哈。

1.2 Python代码

如果都顺利理解完上一步的话,剩下的应该都不是什么难事了。

这里直接上代码,如果不懂的朋友可以评论或者私信我,我会尽力帮你解决。

import reimport pandas as pd
import numpy as np
import requests
from tqdm import tqdmdef get_info(blogUsername, num, excel_):url = "https://blog.csdn.net/community/home-api/v2/get-fans-list"headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}list_result = []list_header = ["是否为博客专家", "是否为博客专家", "博客链接", "码龄", "性别", "博客自我简介", "昵称", "用户名"]list_result.append(list_header)for i in tqdm(range(num)):if id[i] == 1:continueparams = {"page": i + 1,"size": 20,"id": id[i],"noMore": "false","blogUsername": blogUsername}resp = requests.get(url, headers=headers, params=params)js = resp.json()infos = js['data']['list']for info in infos:list_row = []blogExpert = info['blogExpert']if blogExpert == 'FALSE':blogExpert = '否'else:blogExpert = '是'blogUrl = info['blogUrl']text = requests.get(blogUrl, headers=headers, timeout=10).text  # 记得设置timeout超时,不然容易报错。re_codeAge = re.findall('码龄(.*?)</span>', text)if len(re_codeAge) == 0:codeAge = '未知'print(blogUrl)else:codeAge = re_codeAge[0]if '天' in codeAge:codeAge = '小于1年're_gender = re.findall('user-gender-(.*?)"', text)if len(re_gender) == 0:gender = "未知"elif re_gender[0] == 'male':gender = '男'else:gender = '女'briefIntroduction = info['briefIntroduction']nickname = info['nickname']username = info['username']list_row.append(blogExpert)list_row.append(blogUrl)list_row.append(codeAge)list_row.append(gender)list_row.append(briefIntroduction)list_row.append(nickname)list_row.append(username)list_result.append(list_row)# 输出数据array = np.array(list_result)df_ = pd.DataFrame(array)df_.to_excel(excel_, index=0)return list_resultif __name__ == '__main__':# 运行的主要花费时间在于re正则id = [0, 78740133, 78690518, 78638901, 78582206, 78530076, 78471727, 78335165, 78288696, 78227840,78145388, 78057629, 77983897, 77924442, 77828563, 77706901, 77664126, 77624040, 77542854, 77452691,77404737, 77348854, 77283332, 77183725, 77143081, 77073635, 76973850, 76887793, 76781571, 76726899,76658874, 76568245, 76507480, 76438013, 76374476, 76295428, 76253222, 76162288, 76086168, 1,76004009, 75960911, 75863076, 75765897, 75710962, 75653317, 75598044, 75519085, 75457343, 75457343,75311786, 75211581, 75170372, 75110510, 75058506, 75009915, 74917175, 74834823, 1, 74722895,74663189, 1, 74566955, 74486858, 74397257, 74333265, 74256901, 1, 74196757, 74123209,74059633, 74029642, 73968532, 73932354, 73866072, 1, 73783344, 73719695, 1, 73653061,73587243, 1, 73515756, 73429918, 73358226, 1, 73263499, 73195373, 73132665, 73080587,1, 73033922, 73023288, 73011333, 73003189, 72992049, 72973841, 72939196, 1, 72883112,72774191, 72709795, 72573414, 72522003, 72432947, 72386681, 72322294, 1, 72215074, 72131018,72044364, 72002358, 71949991, 1, 71870728, 71819109, 71764352, 71728374, 71655925, 71578373,71501481, 71441019, 71375353, 71327709, 71264171, 71218955, 71161445, 71087665, 1, 71039538,70959706, 70896184, 70848423, 70798272, 1, 70788516, 70773396, 1, 70764067, 70749620,70735228, 70723731, 70685558, 70644683, 70596700, 70547296, 70482440, 1, 70414785, 70307690,70207696, 70153517, 70098161, 1, 70035451, 1, 69971134, 69921630, 69909708, 69892317,69869868, 1, 69854880, 69816536, 69763883, 69691507, 69676663, 69661623, 69649262, 1,69644130, 69636358, 69625697, 69614655, 69598180, 69548283, 1, 69472227, 69421603, 69373035,69277778, 69190921, 69118129, 69023812, 68973652, 68890305, 1, 68809943, 68696822, 68643624,68580767, 1, 68562290, 68548079, 68519974, 68474400, 68399687, 68339708, 68261179, 1,68173877, 68100386, 68049450, 67942677, 67878674, 67799011, 1, 67726792, 1, 67682408,67629972, 67563793, 67530934, 67440541, 67363974, 1, 67280221, 67181251, 1, 67075273,66975353, 1, 66910489, 66811585, 66721263, 66662644, 1, 66615872, 66611061, 66608123,66604504, 1, 66599283, 66595254, 1, 66590598, 66585368, 66548756, 1, 66492671,66384644, 66300445, 66191699, 66089257, 66006671, 65913525, 65833369, 65817434, 65760857, 65723216,65611912, 65562358, 65492613, 65451908, 1, 65441811, 65436377, 65432198, 65429505, 65425547,65421033, 65416769, 65361886, 1, 65276532, 65136527, 65082940, 64982026, 64919944, 64816782,64713437, 64628734, 64520433, 64427602, 64332300, 64236852, 64109872, 64044232, 1, 63967692,63957299, 63944974, 63933882, 63920875, 63904545, 63892834, 63881173, 63871723, 63861497, 63850111,63835787, 63821084, 63785403, 1, 63752237, 63703055, 63695518, 63681504, 63670679, 63644693,63598878, 1, 63544913, 63515899, 63469932, 63424292, 63349457, 63312354, 1, 63231947,63193393, 63156087, 63125220, 63072299, 63036366, 62989160, 62967033, 62906329, 62862687, 62820065,62763415, 62730579, 62713913, 62697328, 62681170, 62662677, 62644761, 62632743, 62626157, 62617404,62602475, 62589135, 62571309, 62545208, 62536637, 62521786, 62502668, 62485925, 62473600, 62461811,62453741, 62441998, 62423205, 62416311, 62404397, 62394982, 62387115, 62375548, 62366301, 62360220,62349974, 62336191, 62325153, 62317723, 62304827, 62293973, 62283706, 62274218, 62260751, 62223520,62215735, 62204256, 62197395, 62190133, 62181667, 62172424, 62165010, 62130340, 62121464, 62111254,62102740, 62096006, 62086794, 62079125, 62045772, 61993794, 61954193, 61914011, 1, 61882960,61832911, 61826143, 61811682, 61801231, 61786313, 61771729, 61739614, 61727721, 61702622, 61691634,61681526, 61672422, 61672422, 61661106, 61643463, 61631434, 61618334, 61605851, 61583052, 61563889,61550308, 61540749, 61527272, 61518281, 61504311, 61485426, 1, 61468983, 61454679, 61438243,61427014, 61391059, 1, 61376103, 61365041, 61355628, 1, 61343590, 61331315, 61319099,61301099, 61287910, 61250570, 61213864, 61180025, 61126220, 61090349, 61061151, 61030505, 61002642,60965237, 60922160, 60891225, 60883121, 60874168, 60864865, 60855344, 1, 60844932, 60837405,60828437, 60819311, 60812746, 60803836, 60795778, 60788816, 60781833, 60772881, 60764822, 60755916,60746977, 60727044, 60710084, 60690846, 60678029, 60665733, 60651764, 60640585, 60625640, 60617425,60600305, 60587138, 60567487, 60556293, 60551107, 60539003, 60524040, 60507159, 1, 60493706,60477228, 60460393, 60441968, 60427834, 1, 60417492, 60407381, 60395241, 60385511, 60374641,60357605, 1, 60337755, 60321380, 1, 60303730, 60292254, 60283865, 60262046, 60237032,60218242, 60207713, 60191513, 60179581, 60165074, 60155077, 60145493, 60130196, 60115487, 60063585,60034264, 60028759, 1, 60021480, 60005280, 59995613, 59986273, 59976260, 59967044, 59958158,59949700, 59938089, 59928245, 59921607, 59911712, 59900910, 59890663, 59877120, 59861516, 59852017,59839019, 59826747, 59814065, 59795073, 59782476, 59773186, 59759876, 1, 59750998, 59746632,59737443, 59726084, 59715594, 1, 59708502, 59692812, 59681883, 59668621, 1, 59662238,59650120, 59636665, 59627073, 59622129, 59613613, 59594069, 59583694, 59568989, 59552261, 59533862,1, 59519331, 59505532, 59496382, 1, 59488780, 59474412, 59457544, 59445986, 59429646,59413216, 59395994, 59375035, 59303803, 59176530, 59092341, 58926580, 58711619, 58526865]  # 1的话是我没有记录到的id,代码中会进行continue处理。get_info('qq_44186838', len(id), 'fans_info.xlsx')

1.3 爬取结果展示


注:本次共爬取粉丝数量为10300。

2 Tableau数据分析

当时1k粉的博文用的是EXCEL进行可视化,这次咱们整点别的,用Tableau来简单玩一玩。

(好吧,其实是Tableau可视化实在是太方便了!!!)

2.1 关注我的男女生比例

由于粉丝当中有近一半的人没有进行性别信息填写,所以最终参与性别分析的总人数为5217,其中不出所料的有四分之三的粉丝是男性朋友,果然我的女粉还是少得可怜哈哈哈。

2.2 关注我的码龄分布情况

由图我们不能发现,大部分粉丝的码龄集中在了1年到4年之间,而凭我自己以及周围朋友的认知来看,大部分朋友开始使用CSDN是在大一的时候,所以可以推测出关注我的朋友大部分也是刚上大学到刚刚毕业这个年龄段,这也和我平时收到的私信都是一些大学生朋友向我提出问题的情况一致。

另外呢,也非常感谢这些高码龄的前辈对我的关注,我会努力产出更多有质量的博文,希望能同大家一起进步。

2.3 关注我的博客专家占比

不出所料,在CSDN整个平台都只有少量博客专家的情况下,关注我的博客专家只有少的可怜的6个哈哈。

小声提一嘴:博客专家需要创作时间满三年,可是本人只有两年,所以离博客专家还是有一段时间的。

2.4 男女生与码龄的分布情况


从图来看,各码龄阶段的男女生占比基本与整体的占比大体一致,但码龄越大,男性占比就越高。其中女生最多的码龄阶层是2年,而男生在1年到3年这三个码龄段的数量相差不大。

2.5 用户注册方式分布情况

熟悉CSDN的朋友应该会知道,如果是用手机注册的用户名会是m0开头,以qq注册的用户名会是qq开头,而以微信注册的则是会以weixin开头,所以下面我们来看一下我的粉丝都喜欢用哪种方式注册CSDN账号呢?

(记得先创建个计算字段)

接下来我们看下注册方式的分布情况。


从图中可以看出用微信注册的朋友相对最多,但是相较于手机和QQ注册而言并没有多多少。

而其中,有3000多个朋友的用户名并非以"m0"、“qq”、"weixin"开头,这也间接说明了他们的用户名已经修改过了,占比还挺高啊,这是我原本没能没有想到的。

2.6 粉丝都有没有改昵称、有没有写自我简介呢?

先来看下粉丝们都有没有改自己的昵称呢?(注:没有改昵称的情况下,昵称与用户名相同)

图中的结果还是令我比较开心的,因为有改昵称的朋友相对较多,至少多数朋友都有意识去修改自己的CSDN昵称,多少还是在乎自己的CSDN账号的。

那接下来我们来看一下粉丝都有没有写自我简介呢?


简介的书写在一定程度上能反应一个用户在平台的活跃情况,而从图中我们很不幸的发现,有写博客的朋友占小部分,大部分朋友都没有写简介,这种情况我想推到整个平台来看,没写简介的用户占比恐怕只会更加严重。

2.7 粉丝的活跃情况

如果我们认可说修改昵称和书写自我简介能在一定程度上反映用户的活跃情况的话,那么既修改了自己昵称并且书写了简介的人肯定相对来讲是最活跃的,而只书写了自己的自我简介的朋友活跃性和只修改了自己的昵称的朋友次之,活跃度最低的的属于那些既不修改昵称也不书写自我简介的朋友。


结合图中结果来看,我的粉丝活跃分布相对来讲我还算满意,不过,如果要真正达到理想的阶段,可能靠俺自己的努力也还不够,CSDN啊,是时候努力想办法提高用户的活跃率了啊。(手动艾特CSDN官方哈哈哈。

2.8 各码龄层的活跃情况


单看最为活跃的群体的话,活跃的朋友主要为码龄5年及以下的朋友,而如果单看其他活跃程度的用户,也同样如此,这也基本和码龄人数分布情况一致。

我们将人数最多的码龄1到5年的群体拎出来看,结果相对来讲也还可以,毕竟这个群体人数相对较多,可以活跃程度相对来讲也还算可以。

3 合影

合影来啦!

温馨提示:关注时间越长字体越大哦

下面是实现词云图的代码。

# -*- coding: utf-8 -*-
import randomimport pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as pltif __name__ == '__main__':fans_info = pd.read_excel('./fans_infomation.xlsx', header=0)fans_name = fans_info['昵称'].astype('str').tolist()love_friend = []for i in range(len(fans_name)):  # 排越后面关注我的时间越长if i < 2000:love_friend.append(fans_name[i])love_friend.append(fans_name[i])elif i < 4000:love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])elif i < 6000:love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])elif i < 8000:love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])else:love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])love_friend.append(fans_name[i])for i in range(100):love_friend.append('报告,今天也有好好学习') random.shuffle(love_friend)res = ' '.join(love_friend)# 生成词云wc = WordCloud(font_path='simkai.ttf',background_color='white',max_font_size=600,max_words=10000,mask=plt.imread('love.jpg'))wc.generate(res)wc.to_file('1w_fans.png')  # 图片保存

结束语

从0到1w,从小白到数据领域的优质创作者,从0到200w的阅读量,真的收获了很多很多,不仅仅是开始在这个平台有了小小的收益,更多的是获得了大家的认可以及无数的问好与感谢,俺也谢谢大家!

总之,感谢相遇,未来继续共同进步!

推荐关注的专栏

我和关注我的1w个粉丝“合影”啦–爬取上万个粉丝的数据并进行数据可视化分析,收获满满相关推荐

  1. 爬虫爬取微博用户粉丝及其关注

    爬虫爬取微博用户粉丝及其关注 前言 ​ ​ 前段时间做了一个爬虫爬取微博用户粉丝及其关注的小项目,但忙着中期毕设答辩忘了加以记录了.对于动态网页的解决办法是使用selenium(上手比较快,而且抓包实 ...

  2. Scrapy爬取新浪微博用户粉丝数据

    一般来说pc端的信息是最为全面的,但是防范措施也是最严格的.所以不能走weibo.com这个域名下进行爬取,新浪微博在pc端的反扒措施较为全面.而手机端的数据则相对好爬取,而且数据都是Json格式,解 ...

  3. 如何爬取微博全部粉丝python_python 登录新浪微博爬取粉丝信息

    最近有个小需求,爬取新浪微博的粉丝信息,弄了好几天,终于搞定,送上代码: 环境: 系统:windows 7 版本:python 3.3 IDE: PyCharm 4.0.4 参考:https://bl ...

  4. 粉丝让我爬取热搜话题,结果做成了实时热搜『跑马灯』可视化

    大家好,我是阿辰. PS:(这里跟读者说一下,以后本公众号推文更新时间段是13:00~14:00,默认是13:00) 之前有粉丝让我爬取网上热搜话题,根据粉丝的这个提议,我想到了爬取不同平台的热搜话题 ...

  5. 爬虫(8)-Scrapy爬取微博用户粉丝,关注和微博内容

    本文主要讲解使用scrapy爬取微博用户的关注,粉丝和微博内容. 认为有用的话请点赞,码字不易,谢谢. 其他爬虫实战请查看:https://blog.csdn.net/qq_42754919/cate ...

  6. python爬取b站粉丝数_【python爬虫】每天统计一遍up主粉丝数!

    每天统计一遍up主粉丝数! 第一步,爬取up主的粉丝信息 为了方便,这里我把它写成了一个函数 1.首先导入需要的包 requests是必不可少的! import requests as req 想要记 ...

  7. python爬取抖音粉丝数据_爬取抖音粉丝数据1(作品、喜欢、ID 、关注) 完整源代码...

    加密数据源代码: 密码本如下: 在这里插入图片描述 完整源代码: import requests,re from fontTools.ttLib import TTFont import io fro ...

  8. 爬取抖音粉丝数据1(作品、喜欢、ID 、关注) 完整源代码

    加密数据源代码: 密码本如下: 在这里插入图片描述 完整源代码: import requests,re from fontTools.ttLib import TTFont import io fro ...

  9. 微博粉丝个人信息爬取

    首先分析微博网页端的两个页面,发现weibo.com只能获取博主前五页的粉丝列表,weibo.cn能获取前20也粉丝列表.于是分析手机端,本人用手机试着划了下博主粉丝页,发现也只能获取两千左右的粉丝数 ...

最新文章

  1. springboot部署war包为什么tomcat会启动两次
  2. docker mysql容器 修改时区
  3. android usb集线器,通过Maven将多个部署到USB集线器上的Android设备
  4. 从变分编码、信息瓶颈到正态分布:论遗忘的重要性
  5. 中国地质大学c语言程序设计答案,2016年中国地质大学(北京)信息工程学院C语言程序设计(同等学力加试)考研复试题库...
  6. java就业班学什么呀_传智播客JAVA就业班学习心得
  7. Struts2教程3:struts.xml常用配置解析
  8. mysql 6位随机数_MySQL生成固定位数的随机数
  9. C#实现的简单的随机抽号器
  10. 浏览器主页被篡改为hao123、360和2345解决办法
  11. django 使用mixins时报HTTP方法patch method not allow
  12. add_months函数
  13. Gym100015 I Identity Checker 栈容器使用,数学
  14. ARM指令解析之LSL
  15. Win10修复Linux引导
  16. IT人才外包的合作流程是怎样的?
  17. pygame-KidsCanCode系列jumpy-part13-改进跳跃
  18. 结对编程之经验教训总结
  19. ddos流量攻击有多少G_如何防护ddos流量攻击?
  20. 查看MySQL数据库的命令

热门文章

  1. 数值分析多种算法C语言代码-推荐
  2. FD.IO-VPP研究及使用四(Qos策略)
  3. NSIS Error错误解决方法
  4. 小白日志——扫灰、加内存条、装系统自己动手丰衣足食
  5. 项目组长成长记(一)
  6. 什么是接口及其关键点
  7. 王爽汇编语言 实验14
  8. SEO灰帽手段常用四种手法,仅供参考
  9. 本周最新文献速递20211212
  10. PostgreSQL学习篇16.3 检查备库及流复制情况