pyecharts:用地图map展现社区程序员的分布

9 篇文章 0 订阅
4 篇文章 0 订阅
本文介绍了如何利用Python对腾讯云开发者社区的创作者进行区域和技术偏好分析,包括数据采集、HTML解析、使用Scrapy抓取API数据、数据分析(Top10技术偏好和区域分布)以及结果可视化(Geo地图和Bar图表)。
摘要由CSDN通过智能技术生成

前言

如何使用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标签的文本提取。

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的文本信息来获取区域。

city = ''.join(response.css('i.address').xpath('..').css(' ::text').extract()).replace(' ', '')

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

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

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)分割之后,在进行分行操作。

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是深圳市。

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地图展示

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

代码实现:

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进行展示。

实现代码如下:

# 技术偏好展示
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')

结语

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

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值