开源中国用户分析

Apache开源基金会与中国开发者的崛起历程 开源软件基金会作为开源生态的核心组织,采用精英治理模式推动项目发展。Apache软件基金会(ASF)作为最具影响力的开源组织之一,其基于共识的决策机制和开放许可模式,为全球开发者提供了协作创新的平台。在云计算和大数据时代,开源技术已成为基础设施的重要组成部分。中国开发者从早期使用者逐步成长为重要贡献者,推动Kylin、Pulsar等顶级项目发展。通过分析中国企业参与开源的三种典型模式,可见技术实力与社区建设并重是项目成功的关键。参与国际开源社区需要克服语言文化障碍,但也能获得技术视野和协作能力的提升。 阅读详情

加入开源中国也有超过三年的时间了,觉得开源中国已经越办越好了,突然很想知道它究竟有多好,我是不是开源中国最老的用户,我有176个开源中国的积分能够排名第几,带着这些问题,我抓取了部分开源中国的用户信息,做了一个简单的分析。

数据获取

要获得用户数据,可以通过开源中国的网页来进行。这个是我的主页面

这个页面包含了用户的基本信息,包括用户名,积分,粉丝,关注等等。

点击粉丝链接可以获得所有的粉丝的情况

然后我们就可以通过这些链接,迭代的找到所有相关连的数据了。

工具选取

这次的数据抓取我选用了requests和pyquery

requests是一个非常好用的python的http/rest的客户端,比之python自带的urllib要好用很多,推荐使用。

pyquery是用来解析和操纵html和DOM文档,提供类似jquery的语法,比诸如beatifulSoap要好用不少,尤其如果你是一个前段开发者,熟悉jquery,那就更方便了。大家可以参考我的另一篇博客了解更多的背景信息。

爬取网页数据

为了抓取网页的内容,我们可用chrome自带的工具来查看网页的DOM结构:

核心的代码如下:

def get_user_info(url):
    try:
        r = requests.get(url + "/fans", headers=headers)
        doc = pq(r.text)
        user_info = dict()

        # get user information
        user_info["url"] = url
        user_info["nickname"] = doc.find(".user-info .nickname").text()
        user_info["post"] = doc.find(".user-info .post").text()
        user_info["address"] = doc.find(".user-info .address").text()
        user_info["score"] = doc.find(".integral .score-num").text()
        user_info["fans_number"] = doc.find(".fans .score-num").text()
        user_info["follow_number"] = doc.find(".follow .score-num").text()
        join_time = doc.find(".join-time").text()
        user_info["join_time"] = join_time[
            4:15].encode("ascii", "ignore").strip()

        # get fans
        user_info["fans"] = get_relations(doc)

        # get follows, fellow is a wrong spelling
        rf = requests.get(url + "/fellow", headers=headers)
        user_info["follow"] = get_relations(pq(rf.text))

        return user_info
    except Exception as e:
        return None

get_user_info() 方法通过给定的用户url来获取用户信息,首先利用requests的get方法得到用户网页,然后用pyquery抽取出昵称nickname,职位post,地址address,积分score,粉丝数fans_number,关注数follow_number。并得到所有的关注和粉丝的url。这里有一件事比较尴尬,关注的url模式中,关注的英文单词拼错了,应该是follow,而实际上使用的却是fellow,前端程序员也要学好英语呀!

def get_relations(basedoc):
    result = list()
    try:
        doc = basedoc
        fans = doc.find(".fans-item")
        flist = [fans.eq(i) for i in range(len(fans))]

        while True:
            for fan in flist:
                username = fan.find(".username").text()
                url = fan.find(".username a").attr("href")
                result.append({"name": username, "link": url})

            pages = doc.find("#friend-page-pjax a")

            if len(pages) == 0:
                break

            last_link = pages.eq(len(pages) - 1).attr("href")
            last_number = pages.eq(len(pages) - 1).text()

            if last_number.encode("utf-8").isdigit():
                break

            r = requests.get(BASE_URL + "/" + last_link, headers=headers)
            doc = pq(r.text)
            fans = doc.find(".fans-item")
            flist = [fans.eq(i) for i in range(len(fans))]

        return result
    except Exception as e:
        return result

get_relations()方法通过循环的方式找到所有的关注或粉丝的url链接。

最后实现一个抓数据的类Scraper:

class Scarper(threading.Thread):
    def __init__(self, threadName, queue):
        super(Scarper, self).__init__(name=threadName)
        self._stop = False

        self._base_url = BASE_URL
        self._base_user = "masokol"
        self._check_point = dict()
        self._task_queue = queue

    def _pull(self, url):
        user = get_user_info(url)
        if user is None:
            return

        self._write(user)
        for u in user["fans"]:
            logger.debug("check a fan {}".format(json.dumps(u)))
            if not self._check_point.has_key(u["link"]):
                logger.debug("put one task {}".format(u["link"]))
                self._task_queue.put(u)
        for u in user["follow"]:
            logger.debug("check a follow {}".format(json.dumps(u)))
            if not self._check_point.has_key(u["link"]):
                logger.debug("put one task {}".format(u["link"]))
                self._task_queue.put(u)

    def _write(self, user):
        if self._check_point.has_key(user["url"]):
            return
        logger.debug(json.dumps(user))

        # TODO support unicode logging here
        logger.info("name={}, join={}, post={}, address={}, score={}, fans_number={}, follow_number={}".format(
            user["nickname"].encode("utf8"),
            user["join_time"],
            user["post"].encode("utf8"),
            user["address"].encode("utf8"),
            user["score"].encode("utf8"),
            user["fans_number"].encode("utf8"),
            user["follow_number"].encode("utf8")))
        self._check_point[user["url"]] = True

    def init(self):
        url = self._base_url + "/" + self._base_user
        r = requests.get(url, headers=headers)
        self._pull(url)

    def run(self):
        global IS_TERM
        logger.debug("start working")

        try:
            while True:
                logger.debug("pull one task ...")
                item = self._task_queue.get(False)
                logger.debug("get one task {} ".format(json.dumps(item)))
                self._pull(item["link"])
                time.sleep(0.1)
                if IS_TERM:
                    break
        except KeyboardInterrupt:
            sys.exit()
        except Exception as e:
            print e

这里面有几个点要注意下:

  • 起始用户我选用了“masokol”,理论上选哪个用户作为起始用户关系不大,假定所有的用户都是关联的,当然这个假定不一定成立。也许存在一个孤岛,孤岛里的用户和其它用户都不关联。如果起始用户在这个孤岛里,那么就只能抓取顾岛内的用户。
  • 利用队列构造生产者消费者模型,这样做的好处是可以利用多线程来提高抓取效率,但是实际操作中,我并没有开多线程,因为不希望给oschina带来太多的网络负载。大家如果要运行我的程序也请注意,友好使用,不要编程ddos攻击。另外利用queue可以把递归调用变为循环,避免stack overflow
  • checkpoint用来记录抓取的历史,避免重复抓数据。这里是用url作为key的一个数据字典dict来做checkpoint

完整的代码请参考 https://github.com/gangtao/oschina_user_analysis 

这里是一个数据抓取程序的最简单实现,若要做到真正好用,有以下几点需要考虑:

  • 持久化任务队列
    在该实现中,任务队列在内存中,这样就很难做分布式的扩展,也没办法做到错误恢复,如果程序或数据抓取的节点出问题,则抓取中断。可以考虑使用Kafka,RabbitMQ,SQS,Kenisis来实现这个任务队列
  • 持久化checkpoint
    同样的内存内的checkpoint虽然效率高可是无法从错误中恢复,而且如果数据量大,还存在内存不够用的情况
  • 提高并发
    在本实现中,并没有利用并发来提高数据吞吐,主要是不想给oschina带来高的负载。通过配置多线程/多进程等手段,可以有效的提高数据抓取的吞吐量。
  • 优化异常处理
    在该实现中,大部分错误都没有处理,直接返回。
  • 利用云和无服务
    利用云或者无服务(serverless,例如AWS Lamba)技术可以把数据采集服务化,并且可以做到高效的扩展。

数据分析

利用Splunk可以高效的分析日志文件,我在我的Splunk中创建了一个文件的Monitor,这样就可以一边抓取数据,一边分析啦。

这里关键的设置是sourcetype=oschina_user

好了上分析结果:

以上几个指标是已分析的用户数,平均积分,平均粉丝数和平均关注数。我的176分和105个粉丝都刚好超过平均值一点点呀。

下面是对应的SPL(Splunk Processing Language),因为日志输出是使用的key=value格式,不需要额外抽取,直接可以用SPL来分析。

sourcetype=oschina_user | stats count
sourcetype=oschina_user | stats avg(score)
sourcetype=oschina_user | stats avg(fans_number)
sourcetype=oschina_user | stats avg(follow_number)


sourcetype=oschina_user | table name, score | sort -score | head 10

这张表是最高积分榜,红薯两万多分是自己改得数据库吧,太不像话了。另外几位大神,jfinal是量子通信的技术副总裁;南湖船老大失业中,大概不想透漏工作信息吧,小小编辑就不说了,如梦技术是皕杰 - 后端工程师。

sourcetype=oschina_user | stats count by addr0 | sort -count | head 5

(注意:这里的addr0字段需要额外的从地址字段中抽取出来,因为原字段包含省份/地区两级信息)

用户来自哪里,北广上占据前三不意外,上海排第三要加油呦。

sourcetype=oschina_user | table name, fans_number |sort - fans_number | head 5
sourcetype=oschina_user | stats count by post | sort -count | head 5
sourcetype=oschina_user | table name, follow_number | sort -follow_number | head 5

拥有最多粉丝和关注数的的信息。Post是职业信息,都是程序员毫无新意。

sourcetype=oschina_user | stats count by join_year | sort join_year

(注意:这里的join_year字段需要额外的从join字段抽取出来。)

这个厉害了,是用户加入oschina的趋势图,2014年以后咋是下降的呢,难道是发展的不好?我是不是发现了什么?红薯要加油了呀!也许是我抓取的用户数量还太少,不能反应真实情况吧。

我的爬虫还在慢慢跑,有了最新的发现会告诉大家!

后记

最新的数据更新到4800,后面不一定会继续抓数据,大家看看就好。

  • Top Rank的排名变化不大
  • 平局积分下降到38.5,平均粉丝数下降到21,看来我开始抓取的用户都是核心用户,积分高,粉丝多
  • 这个“我的名字叫李猜”关注了13万用户,你想干啥?
  • 最新的数据现实开源中国用户数量增长显著,17年这还不到一半,新用户的数量明显超过了2016,恭喜红薯了
  • 还有很多可以抓去的信息,例如用户性别,发表的博客数量等等,留个大家去扩展吧。
  • 应红薯的要求,代码也放到了码云上 http://git.oschina.net/gangtao/oschina_user_analysis 
  • Splunk真的是太好用了(此处应有掌声)
稀疏阵列选型指南:互质阵、嵌套阵、MRA,谁才是你项目里的‘性价比之王’? 本文深入探讨了稀疏阵列技术中的互质阵、嵌套阵和MRA三大架构的工程化选型策略,重点分析了它们在DOA估计、自由度、旁瓣抑制和计算复杂度等核心指标上的表现。通过实际案例和配置示例,为智能天线、声学定位和毫米波雷达等应用场景提供技术选型指南,帮助研发团队在硬件成本与性能之间找到最佳平衡点。 阅读详情

相关推荐

PLSQL 14.0.6 下载使用教程

众所周知,PLSQL 只是一个oracle第三方开发测试工具,它依赖oracle 客户端搭配使用,但是oracle 客户端有2G,相当庞大,不建议安装。所以我们如果下载安装好PLSQL,再下载好轻量级的支持远程链接的oracle客户端,这样搭配使用可以的话就最好了,答案是可以的。 第一步: PLSQL 下载与安装 PLSQL 14.0.6 下载地址 : https://www.allroundautomations.com/registered-plsqldev/ 下载下来,除了安装路径更改一下,

qq976511508的博客 2136

Piwik——最好用的开源网站统计系统

Piwik——最好用的开源网站统计系统 前段时间一直在寻找开源的网站统计系统,在网上发现了开源的Piwik,它简洁强大,有时一个开源的系统,可以部署在任何PHP+MYSQL上,可以说是最好用的网站统计系统,如果你不想使用国内其他厂商的网站统计系统,而想使用自己的统计系统,将网站统计数据留在自己的服务器上的话,Piwik完全满足你的要求。下面我们看看Piwki的官方介绍吧。 简介

ZHANG_H_A的博客 4766

保姆级教程:用YOLOv5s训练PCB缺陷检测模型(附北大公开数据集)

本文提供了一份基于YOLOv5s的PCB缺陷检测模型从零开始的完整实战教程。详细解析了如何使用北大公开数据集,涵盖环境搭建、数据处理、模型训练、性能评估及优化部署全流程,并针对工业场景中常见的类别不均衡问题给出了具体解决方案,旨在帮助开发者快速构建高精度的自动化质检系统。

weixin_28285943的博客 310

网站统计 开源 java_开源 java CMS - FreeCMS2.8 统计分析

统计分析系统级统计分析,用于统计系统所有数据。工作量统计统计所有用户的工作量。从左侧管理菜单点击工作量统计进入。 您可以根据添加人,时间条件进行筛选。并可导出结果为excel文件。站点信息统计统计所有站点的信息量。从左侧管理菜单点击站点信息统计进入。 您可以根据站点名称,时间条件进行筛选。并可导出结果为excel文件。信息更新统计可按年、月、日、星期统计全部信息的更新频率。从左侧管理菜单点击信息更...

weixin_30851261的博客 314

不用写代码!用AIStarter 5.0.0离线包部署InfiniteTalk的完整指南(Windows/Mac/Linux全平台)

本文详细介绍了如何使用AIStarter 5.0.0离线包在Windows、Mac和Linux平台上零代码部署InfiniteTalk数字人。从环境准备、离线资源获取与验证,到全平台部署实操指南,提供了完整的本地化安装流程和优化建议,帮助用户快速实现AI项目的一键部署。

weixin_30275415的博客 276

手把手教你学Simulink——基于AI融合与智能调度的场实例:强化学习在卫星资源分配中的应用

本文详细介绍了如何利用Simulink和强化学习技术实现智能卫星资源分配。文章首先分析了低轨卫星通信系统面临的动态资源调度挑战,提出采用强化学习(特别是PPO算法)的解决方案。接着逐步展示了完整的建模过程:从Simulink项目创建、卫星通信环境建模(用户业务、信道特性、资源池),到强化学习任务定义(状态空间、动作空间、奖励函数),再到PPO智能体的构建与训练。最后通过仿真验证,PPO智能体在系统吞吐量、公平性和阻塞率等关键指标上均优于传统方法。该方案为卫星通信系统的智能资源管理提供了可行方案,并支持进一步

MHD0815的博客 191

开源网站访问统计系统Piwik的基本使用

摘要 作为网站站长,对于网站统计的系统可能并不陌生,如百度统计,google analysis之类的产品并不陌生。本文介绍的是一种替代这一类产品的开源系统——piwik,功能上一点不输于商业的统计系统。 piwik 目录[-] piwik简介 piwik安装 piwik使用 JS追踪 log追踪 其他一些问题 piwik简介 最近试用

那些年....的专栏 2万+

从0到1打造一台机器人走起来

1)本体机械结构设计,依据人体生物学和生物力学知识,结合机器人运动时各关节扭矩需求,进行合理选用电机,比如胯部需要大扭矩,腿部惯量小等2)硬件拓扑上,分层架构的信号层和功率协同工作,高带宽,低延时,硬实时3)步态规划设计与验证环节实机回溯和部署过程:Real2Sim,Sim2Sim,Sim2Real。

weixin_43163941的博客 244

开源网站流量统计系统Piwik源码分析——后台处理(二)

  在第一篇文章中,重点介绍了脚本需要搜集的数据,而本篇主要介绍的是服务器端如何处理客户端发送过来的请求和参数。 一、设备信息检测   通过分析User-Agent请求首部(如下图红线框出的部分),可以得到相关的设备信息。     Piwik系统专门有一套代码用来分析代理信息,还独立了出来,叫做DeviceDetector。它有一个专门的demo页面,可以展示其功能,点进去后可以看到下图中...

weixin_33967071的博客 469

【数据集】GPM IMERG Daily Precipitation Dataset

GPM IMERG Daily Precipitation Dataset

WW、forever的博客 1222

【OpenClaw从入门到精通】第02篇:5分钟速通!阿里云/华为云一键部署OpenClaw(附避坑指南·2026实测版)

本文聚焦OpenClaw的云端部署场景,针对本地部署“关机即离线、跨设备访问难”的痛点,详解阿里云(主推)和华为云(备选)的一键部署流程。2026实测验证:阿里云轻量应用服务器通过官方OpenClaw镜像可5分钟完成部署,华为云Flexus L实例需补充SSH配置步骤;文中拆解云端部署核心概念(地域选择、端口放行、成本构成),通过“AI助理定时抓取行业资讯并推送钉钉”的虚拟案例演示云端7×24小时运行价值,同时提供模型调用、服务器成本的精细化控制方案,梳理端口访问失败、API-Key权限异常等高频坑点的解决

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 5552

2024 中国开源年度报告

第一部分总体宏观洞篇,通过对基础事件、活跃仓库、活跃用户、开源许可证和编程语言等方面的深入分析,揭示中国在全球开源生态中的全貌。第二部分OpenRank 排行榜篇,提供了全球和中国各领域开源项目、企业、基金会、开发者以及协作机器人的排名,为业界提供全面系统的 OpenRank 指标信息服务。第三和第四部分为企业洞察篇和基金会洞察篇,通过演变图和趋势分析,呈现了全球和中国企业、基金会在开源领域中的演化。第五部分技术领域洞察篇。

chaoyueshijian的博客 2706

2025年12月GESP真题及题解(C++一级): 小杨的爱心快递

2025年12月GESP真题及题解(C++一级): 小杨的爱心快递

王老师青少年编程 1659

对比优快云与开源中国、segmentFault思否

作为一个IT行业学生我遇到问题一般会通过搜索几个权威性论坛得到的结果,通常是优快云、SegmentFault、开源中国。

weixin_45885283的博客 1576

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

行业调研|中国信通院开展开源数据库应用调研

为全面了解我国各行...

ucanuup_的博客 400

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

开源中国 OsChina Android 客户端源码分析(6)拍照、图库、裁剪

为什么80%的码农都做不了架构师?>>> ...

weixin_33949359的博客 134

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

开源中国翻译贡献排名靠谱吗?

背景 当我第一次听说在OSC上,大家可以参与翻译频道的文章翻译时,其实我是,是拒绝的。红薯跟我讲可以通过 开源中国翻译频道贡献奖励计划 加特技,贡献最多的用户(前十名)可以获得计算机图书。于是我在 2015-03-03 注册了一个OSC帐号,参加 2015年3月-4月的翻译奖励计划,验证OS...

552

中国开源现状如何?

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢! >>原文链接地址:中国开源现状如何? 曾经有颗开源的心,后来被业务代码打败! 1. 一个软件的成功,一方面取决于代码在完整度基础上的快速增长,另外一方面则是用户的井喷式增长,而一个软件的拥有者的成功,则是其知名度的快速提升和报酬的增加。软件的成功如何能够导致拥有者的成功,这个属于模式问题,这里不讨论。...

IT架构圈博客 771

【git】【开源中国】【coding.net…

最近一直在用开源中国的git免费私有仓库和coding.net的免费私有仓库 开源中国的mysql有phpmyadmin coding.net用的是命令窗口我没去研究,输入了一些命令都提示error,不知道怎么用 创建服务-》点击控制台-》上方有个恢复数据直接导入sql文件就可以了-》控制台可以用mysql命令如show tables;等 开源中国的git演示部署,如果访问不了,就删除了重新部署

夕雨林流金,web全栈,web全端,网站技术博客 400

在北邮做《开源中国说》演讲

在北邮做《开源中国说》演讲 应“ Open Source University”活动组织者的邀请,我于2007年10月30日晚上在北京邮电大学做《开源中国说》演讲。Open Source University中国百所高校巡回演讲活动是由国内众多开源人事发起并参与的、共同推广开放源码运动的系列活动。本活动的目的是为高校的学生、老师、...

weixin_33922672的博客 162

开源vs闭源大模型如何塑造技术的未来?开源模型的优劣势&未来发展方向

开源软件指的是其源代码可以被公众自由使用、修改和共享的软件。这种模式鼓励开放合作和技术创新,其代表作如Linux操作系统和Apache Web服务器。而闭源软件,则是指源代码不公开的软件,通常由个人、团队或企业独立开发和维护,如Microsoft Windows操作系统和Adobe Photoshop。从历史上看,开源和闭源的较量源自计算机软件行业的发展。

定期分享我的发现和想法,感谢你的陪伴和支持 4966

在中国做了16年开源软件,竟然没倒闭!反而越活越好

总之,开源软件的存在本身,就是一股重要的制衡力量——它始终高悬于商业软件巨头之上,如同达摩克利斯之剑,警示并抑制着软件市场的垄断。由此可见,开源软件为中小企业提供了一条务实的数字化转型路径:它允许企业以极低的初始成本切入,在实际使用中随业务需求灵活调整流程,并依托开源模式获得持续迭代的能力,构建起一套最贴合自身的管理体系,最终稳步实现企业的数字化转型。凭借开源策略以及商业化,它们的成功告诉我们,做开源软件从来不是靠讲故事,而是深扎在一个细分领域,不断迭代产品,同时探索出适合自己的商业化路径。

技术领导力 856

中国开源AI浪潮崛起之谜:探索其成功背后的原因与影响!

中国开源项目在AI领域快速崛起,用户规模、数据资源和政策支持形成独特优势。国内开发者占全球24%,网民规模超11亿,数据产量占全球近30%。DeepSeek等开源AI项目国际影响力显著。政府推动开源生态建设,设立专项基金。大模型学习路径分四个阶段:应用开发、知识库构建、模型训练和商业部署,提供完整资源包助力开发者掌握AI技术。中国正从开源参与者转变为重要贡献者,在全球AI浪潮中占据关键位置。

libaiup的博客 531

中国区域划分开源项目使用手册

中国区域划分开源项目使用手册 项目概述 本指南将带领您了解并使用 RegionOfChina 这一开源项目,该项目旨在提供中国各地区的详细数据和相关处理工具。通过本教程,您将掌握项目的基本结构、启动方法以及配置细节。 1. 项目的目录结构及介绍 目录结构: RegionOfChina/ │ ├── data/ # 数据存放目录,包括地区JSON或CSV文件 │ ...

gitblog_00161的博客 413
上一篇: 使用开源Echarts为Splunk打造类似语法驱动的分析可视化
下一篇: 微服务部署方式的演进
刚是程序员
博客等级 码龄9年 47粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值