前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对社区技术偏好和区域分布分析之后,我发现孤单的人只有我

对社区技术偏好和区域分布分析之后,我发现孤单的人只有我

原创
作者头像
叫我阿柒啊
修改2024-03-20 09:15:08
18220
代码可运行
修改2024-03-20 09:15:08
举报
运行总次数:0
代码可运行

前言

如何使用python对腾讯云开发者社区各位创作者,进行一个区域和技术偏好分析。作为数据分析的课题,我们首先想到的就是,如何去收集创作者们的区域和技术偏好数据。

浏览腾讯云开发者社区的数据展示设计,发现在个人主页就能收集到区域和技术偏好数据。那么我们就要考虑如何进入到个人主页。

数据采集

通过对个人主页的url进行分析,个人主页是由一个固定的base_url和用户的uid组成的,也就是说获取到用户的uid就能进入个人主页。现在的问题就变成了如何获取所有创作者的uid。

开发者社区没有提供一个全量创作者展示页面,所以我们只能另辟蹊径。在开发者社区的rank榜上,我们可以获取到50个创作者的信息。

rank页面

通过控制台对rank榜单进行数据采集前的分析,发现创作者的名称和uid就放在了html中,也就是说可以通过访问rank榜单的url,解析html就能获取数据。

当点击下一页的时候,创作者的数据是使用xhr异步请求然后渲染的,也就是我常说的“页面未刷新,数据已变化”。

所以归根结底,html中只有首页10个创作者的数据,要想获取每一页的数据,我们最终还是要对api进行请求。通过请求返回的json数据,我们可以获取到每一页用户的uid,然后通过base_url + uid再次发起请求,就可以进入创作者的个人主页。

对个人主页进行分析,创作者的区域和技术偏好标签都能在html中获取。 在下面的数据分析中,只基于rank页面50个创作者,如果想要更好的数据,可以从开发者社区首页的推荐入手,获取更多创作者,然后进行去重处理。

区域和技术偏好数据

区域和技术偏好的数据采集都是最基础的html的解析,常见的python模块有BS4和Xpath,我这里使用的scrapy的Selector。

技术偏好标签数据就是对nav下所有a标签的文本提取。

代码语言:python
代码运行次数:0
复制
tags = '|'.join(response.css('nav.com-tag-v2-list a::text').extract())

而区域标签就是对li标签进行提取。

在区域数据提取的过程中,我们发现class为uc-user-info的li标签有好几个,所以第一个方法就是使用css提取所有li标签,然后通过index来找到区域所在的li,来提取数据。

我个人不建议这种写法,因为不优雅。我们观察区域数据所在的li下,有一个class为address的i子标签,这个i标签是整个页面唯一的。所以我们可以先定位i标签,然后再定位到父标签li,最后提取li的文本信息来获取区域。

代码语言:python
代码运行次数:0
复制
city = ''.join(response.css('i.address').xpath('..').css(' ::text').extract()).replace(' ', '')

通过css来获取i,通过xpath定位到父标签li,然后在通过css提取文本数据,最后使用replace将空格替换掉,当然有的创作者未填写区域,那就只能将这部分数据的区域置为空。

输出数据,并将数据输出成csv格式。

代码语言:python
代码运行次数:0
复制
data = {
    "uid": uids,
    "nickname": nicknames,
    "avatarUrl": avatarUrls,
    "tag": tags,
    "city": cities
}

df = pd.DataFrame(data)
df.to_csv('data.csv', index=False)

数据分析

对于数据分析,我们使用数据库可能会多一点。在python中,我个人比较比较喜欢pandas进行数据分析。

技术偏好TOP 10

技术偏好分析我们统计技术标签Top10,用SQL思维我们需要先group by然后count。在数据采集中,我们将创作者的多个技术偏好使用|进行了分割,所以需要对根据技术偏好(tag)分割之后,在进行分行操作。

代码语言:python
代码运行次数:0
复制
df = pd.read_csv('data.csv')
# 技术偏好
df['tag'] = df['tag'].str.split('|')
df_tags_split = df.explode('tag')
tag_user_count = df_tags_split.groupby('tag').size().reset_index(name='user_count')
tag_user_count_sorted = tag_user_count.sort_values(by='user_count', ascending=False)
top_10_tags = tag_user_count_sorted.head(10).reset_index()

在split之后,tag字段又字符串变成了数组,explode根据数据内容将一条数据分成了多行,然后group by对每个标签进行分组统计。

sort_values对统计的数据进行升序排序,默认是降序,所以要设置ascending为Flase,最后使用head来取Top10,得到top_10_tags

分布区域TOP 10

分布区域分析的处理和技术偏好处理相同,在city字段中,有的创作者填写了城市,所以数据格式为:省份|城市,有的用户只填写了城市,所以数据格式为:省份

所以在分行的时候,省份和地市都参与了Top10排行。例如广东省|深圳市,在分行之后广东省和深圳市就被认为是两行数据,在排行的时候,可能top1是广东省、top2是深圳市。

代码语言:python
代码运行次数:0
复制
df['city'] = df['city'].str.split('|')
df_cities_split = df.explode('city')
city_user_count = df_cities_split.groupby('city').size().reset_index(name='user_city')
city_user_count_sorted = city_user_count.sort_values(by='user_city', ascending=False)
top_10_city = city_user_count_sorted.head(10).reset_index()

在一系列处理之后,获得创作者区域分布Top10的数据集top_10_city

可以看到广东省是深圳市和广州市的总和,也参与了排行。不难发现,来自广东的大佬遥遥领先。

echarts展示

为了更直观地展示,这里使用了pyecharts模块实现了柱状图和geo地图展示。

区域Geo地图展示

首先是将区域分布展示在地图上,如图。

代码实现:

代码语言:python
代码运行次数:0
复制
city_data = df['city'].value_counts().reset_index()
city_data.columns = ['city', 'data']
cities = []
for city in city_data['city']:
    if len(city) == 1:
        cities.append(city[0])
    else:
        cities.append(city[1])

geo = (
    Geo(init_opts=opts.InitOpts(width="1200px", height="600px"))
        .add_schema(maptype="china", is_roam=True)
        .add("用户数量", [list(z) for z in zip(cities, city_data['data'])], type_=GeoType.EFFECT_SCATTER)
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(title_opts=opts.TitleOpts(title="创作者城市分布"), visualmap_opts=opts.VisualMapOpts(max_=city_data['data'].max()))
)

# 渲染地图
geo.render("city_distribution_geo.html")

使用geo展示区域分布的时候,没有使用top10的数据集,而是使用的全量创作者数据的df'city'的数据集来实现的。

Bar展示

然后就是对区域分布top10的数据集top_10_city,以及技术偏好top10的数据集top_10_tags进行展示。

实现代码如下:

代码语言:python
代码运行次数:0
复制
# 技术偏好展示
tags = top_10_tags['tag'].tolist()
user_count = top_10_tags['user_count'].tolist()
bar_tag = (
    Bar()
        .add_xaxis(tags)
        .add_yaxis("创作者数量", user_count)
        .set_global_opts(
        title_opts=opts.TitleOpts(title="技术偏好Top 10"),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=25))
    )
)
## 分布区域展示
cities = top_10_city['city'].tolist()
city_count = top_10_city['user_city'].tolist()
bar_city = (
    Bar()
        .add_xaxis(cities)
        .add_yaxis("创作者数量", city_count)
        .set_global_opts(
        title_opts=opts.TitleOpts(title="区域城市Top 10"),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=25))
    )
)
bar_tag.render('top_10_tags_bar_chart.html')
bar_city.render('top_10_city_bar_chart.html')

结语

本篇文章数据分析为主、爬虫为辅,实现了对腾讯云开发者社区部分创作者的区域分布和技术偏好分析。当然,基于开发者社区的其他数据,例如文章数、点赞数、首页推荐数量等,也能实现更多有趣的数据分析。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 数据采集
  • rank页面
    • 区域和技术偏好数据
    • 数据分析
      • 技术偏好TOP 10
        • 分布区域TOP 10
        • echarts展示
        • 区域Geo地图展示
        • Bar展示
        • 结语
        相关产品与服务
        云开发 CloudBase
        云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档