新鲜出炉,Python 告诉你程序员最关注的技术竟然是……
作者 | 灵动的艺术
责编 | 张红月
CSDN博客每年会产生上百万篇优质技术博文,大家都喜欢写哪些技术文章呢?本文作者基于18年入选博客之星活动的200名博主开始,透过他们的技术博文,分析大家最爱研究技术方向都有哪些。
CSDN 2018博客之星入选名单
闲话不多说,如果你关注过这个活动,那么你应该知道,CSDN2018博客之星评选活动参选人员入选博主名单可以在以下网址看到 :
https://bss.csdn.net/m/topic/blog_star2018
即:
时间尚未截止,有心怡的博主入选还没有投票的,赶紧去投上一票吧。
那么,截止到本文出炉为止,200位入选博主的原创/粉丝/喜欢/评论/等级/访问/积分/排名/获得选票 各指标信息如何呢?
由上面的表格我们可以得出的结论。
目前获得票数最高的是徐刘根博主,并且获得选票高达2823票,人气相当火爆。
目前文章最高总访问次数由china_jeffery博主拿下,并且访问次数高达11084501。
目前文章总点赞次数由foruok博主拿下,并且已经获得了6466点赞。
截止目前为止,其他各项指标,包括最佳排名(12),最佳收藏(2327),最多原创(13687181),最高积分(107000),最高等级(10),最多粉丝(22564),最多评论(7360)均由迂者-贺利坚博主砍下,这个成绩可是相当恐怖的。
得票前十名的博主
第二名与第一名的差距还是相当的大啊。大家要火热开启投票节奏啊!
最爱分享的技术
在投票之余,也可以多多关注一下大佬博主们的文章,看看这些博主专家们的研究方向,看看技术热点,作为我们2019年的学习方向。这里还是老规矩为大家贡献一张目前已入选博主的所有专栏相关课题研究方向热力图供大家参考。
由热力图可得知,目前大家最爱研究的方向有机器学习、android、Java、Python、设计模式、各种技术框架等。
接下来,我们再看一下,入选的200位博主,目前博客等级排名:
由此看来,报名入选博主在CSDN的等级分布还是比较均匀的,纵使你目前的博客等级不是很高,只有文章质量可以也还是有机会的。
接下来,我们再看一下,入选的200位博主目前已经获得的荣誉勋章情况如下:
即:
6位作者已经拿过博客之星勋章,并且发起了再次冲击。
3位作者拿到了1024超级勋章勋章,这意味着有超过3位报名作者的原创文章超过了1024篇,堪称超级写手。
191位已经拿到博客专家,当然也有9位目前尚未拿到博客专家称号,说明没有博客专家称号也还是有机会的。
技术实现分析
知其然亦知其所以然,如果大家也有兴趣做类似的技术分析或者想要进一步深入技术发掘分析,我们再一起看看我们是怎么分析的。
数据挖掘
首先,我们知道 入选博主名单可以在 https://bss.csdn.net/m/topic/blog_star2018 网址看到,那么自然我们分析信息需要从这里出发。
想必你也猜到了,我们需要首先爬取所有的入选博主。例如,我们可以从这里拿到入选博主的基础信息。
# -*- coding: utf-8 -*-import scrapyimport jsonfrom tutorial.items import BlogStar2018Item
class BlogStar2018Spider(scrapy.Spider): name = 'blog_star2018' allowed_domains = ['blog.csdn.net'] start_urls = ['https://bss.csdn.net/m/topic/blog_star2018']
def parse(self, response): for user_info in response.xpath('//div[@class="user-info"]'): info = {} user_id = user_info.xpath('./div[@class="user-id"]/text()').extract_first() user_addr = user_info.xpath('./div[@class="avatar"]/a/@href').extract_first() user_name = user_info.xpath('./div[@class="user-name"]/span/text()').extract_first() user_number = user_info.xpath('./div[@class="user-number"]/span/em/text()').extract_first() print(user_id,user_addr,user_name,user_number) info['user_id'] = user_id info['user_addr'] = user_addr info['user_name'] = user_name info['user_number'] = user_number yield scrapy.Request(user_addr, callback=lambda response, info=info: self.parse_blog_user_info(response,info))
当然,只知道那些博主入选了本次评选是远远不够的,我们还需要知道包括但不限于 原创/粉丝/喜欢/评论/等级/访问/积分/排名/专栏/技术方向 等等信息。例如,我们可以利用分析工具抓取所有的入选博主的专栏信息。
def parse_blog_user_info(self,response,info): item = BlogStar2018Item() item['link'] = response.request.url item['blogstar_vote'] = info item['blog_title'] = response.xpath('//div[@class="title-box"]/h1[@class="title-blog"]/a/text()').extract_first() item['description'] = response.xpath('//p[@class="description"]/text()').extract_first() item['avatar_pic'] = response.xpath('//div[@class="profile-intro d-flex"]/div[@class="avatar-box d-flex justify-content-center flex-column"]/a/img/@src').extract_first()
for data in response.xpath('//div[@class="data-info d-flex item-tiling"]/dl[@class="text-center"]'): data_key = data.xpath('./dt/a/text() | ./dt/text()').extract_first() data_value = data.xpath('./@title').extract_first() if data_key.find('原创') > -1: item['original'] = int(data_value) elif data_key.find('粉丝') > -1: item['fans'] = int(data_value) elif data_key.find('喜欢') > -1: item['star'] = int(data_value) elif data_key.find('评论') > -1: item['comment'] = int(data_value) for grade in response.xpath('//div[@class="grade-box clearfix"]/dl'): grade_key = grade.xpath('./dt/text()').extract_first() grade_value = grade.xpath('./dd/@title | ./dd/a/@title | ./@title').extract_first() if grade_key.find('等级') > -1: item['level'] = int(grade_value.replace('级,点击查看等级说明','')) elif grade_key.find('访问') > -1: item['visit'] = int(grade_value) elif grade_key.find('积分') > -1: item['score'] = int(grade_value) elif grade_key.find('排名') > -1: item['rank'] = int(grade_value)
#勋章 item['medal'] = response.xpath('//div[@class="badge-box d-flex"]/div[@class="icon-badge"]/@title').extract()
blog_expert = ''.join(response.xpath('//div[@class="user-info d-flex justify-content-center flex-column"]/p[@class="flag expert"]/text()').extract()).replace('\n','').replace(' ','') if blog_expert and '' is not blog_expert : item['medal'].append(blog_expert)
#博主专栏 colunms = [] for li in response.xpath('//div[@id="asideColumn"]/div[@class="aside-content"]/ul/li'): colunms.append({'colunm_name':li.xpath('./div[@class="info"]/p/a/text()').extract_first() , 'colunm_count': li.xpath('./div[@class="info"]/div[@class="data"]/span/text()').extract_first().replace(' ', '').replace('篇', '') , 'colunm_read': li.xpath('./div[@class="info"]/div[@class="data"]/span/text()').extract()[-1].replace(' ', '')})
item['colunms'] = colunms yield item
当然,我们也可以继续抓取更多信息,这里就留给大家扩展了。
数据存储与分析
我们都知道,空有了数据来源,不能对数据做出存储与分析,等于什么都没做,所以,我们需要对我们的数据作出存储与分析。
数据存储
我们这里还是使用Elasticsearch 做数据存储,如果对Elasticsearch有兴趣,希望学习的话,可以到我的专栏查看,我这里就不展开了,我这里给大家分享一下,我这边建立的数据存储索引。
PUT blogstar2018{ "mappings":{ "blogstar2018":{ "properties":{ "link": { "type": "keyword", "index": false }, "blog_title":{ "type": "text", "analyzer": "ik_smart", "fielddata": true }, "description":{ "type": "text", "analyzer": "ik_smart", "fielddata": true }, "avatar_pic": { "type": "keyword", "index": false }, "original":{ "type": "long" }, "fans":{ "type": "long" }, "star":{ "type": "long" }, "comment":{ "type": "long" }, "level":{ "type": "long" }, "visit":{ "type": "long" }, "score":{ "type": "long" }, "rank":{ "type": "long" }, "medal":{ "type": "text", "analyzer": "ik_smart", "fielddata": true }, "colunms":{ "type": "nested", "properties": { "colunm_name":{ "type": "text", "analyzer": "ik_smart", "fielddata": true }, "colunm_count":{ "type": "long" }, "colunm_read":{ "type": "long" } } }, "blogstar_vote":{ "type": "object", "properties": { "user_id":{ "type": "keyword" }, "user_addr":{ "type": "keyword" }, "user_name":{ "type": "keyword" }, "user_number":{ "type": "long" } } } } } }}
数据字段不是很多,我这里就不再做详细分析了,这里需要注意,我们的文本使用的大多都是中文,所以我们需要使用中文的分词起IK_SMART。
数据分析
当我们成功抓取到数据并存储以后呢,我们需要对我们的数据加以分析才能够发挥出它的作用。
#! /usr/bin/env python3# -*- coding:utf-8 -*-import elasticsearch
class BlogStar2018(object): index = 'blogstar2018' es = elasticsearch.Elasticsearch(['sc.es.com:80'])
@classmethod def index_doc(cls,body): cls.es.index(index=cls.index, doc_type=cls.index, body=body)
@classmethod def match_all(cls): body = { "query": { "match_all": {} }, "size": 1000 } try: res = cls.es.search(index=cls.index, doc_type=cls.index, body=body) except Exception as e: print('查询失败 ', str(e)) res = None return res
@classmethod def count_doc(cls): try: res = cls.es.count(index=cls.index, doc_type=cls.index,) except Exception as e: print('查询失败 ', str(e)) return 0 return res['count']
@classmethod def stats_aggs(cls,field): body = { "size": 0, "aggs": { "stats_"+field: { "stats": { "field": field } } } } try: res = cls.es.search(index=cls.index, doc_type=cls.index, body=body) except Exception as e: print('查询失败 ', str(e)) res = None return res
@classmethod def term_aggs(cls,field,size=10): body = { "size": 0, "aggs": { "term_"+field: { "terms": { "field": field, "size": size, "order": { "_key": "desc" } } } } } try: res = cls.es.search(index=cls.index, doc_type=cls.index, body=body) except Exception as e: print('查询失败 ', str(e)) res = None return res
@classmethod def term_query(cls,field,value): body = { "query": { "bool": { "filter": { "term": { field: value } } } } }
try: res = cls.es.search(index=cls.index, doc_type=cls.index, body=body) except Exception as e: print('查询失败 ', str(e)) res = None return res
@classmethod def username_term_query(cls,field,value): body = { "query": { "bool": { "filter": { "term": { field: value } } } }, "_source": ["blogstar_vote.user_name"] }
try: res = cls.es.search(index=cls.index, doc_type=cls.index, body=body) except Exception as e: print('查询失败 ', str(e)) res = None return res
@classmethod def stat_colunm_name(cls): body = { "aggs": { "colunms": { "nested": { "path": "colunms" }, "aggs": { "colunm_name": { "terms": { "field": "colunms.colunm_name", "size": 1000 } } } } } } try: res = cls.es.search(index=cls.index, doc_type=cls.index, body=body) except Exception as e: print('查询失败 ', str(e)) res = None return res
好了,关于本次项目分析源码,大家可以前往https://github.com/Jaysong2012/tutorial查看。
目前,CSDN博客之星活动即将接近尾声,官方这次除了设置丰厚博客之星奖品外,还特地设置了投票奖,只要参与投票就有机会赢超跑免费驾驶。投票奖品由王子出行(王子车库科技有限公司)提供,秉承“让租车比买车更划算!”的商业理念,专注于为广大出行需求用户提供高端车型订制出行服务。
点击阅读原文或者扫描下方海报二维码即可参与投票,赢取开超跑机会。
新鲜出炉,Python 告诉你程序员最关注的技术竟然是……相关推荐
- qt4的quick程序升级到qt5_最新8月书单出炉!送给你程序员
8月好书赏不停,喜欢的就收藏一下. 1.计算广告:互联网商业变现的市场与技术(第2版) 作者:刘鹏.王超 全球第一本全面讲解计算广告与互联网变现秘密的专业图书升级版 @北冥乘海生 刘鹏老师力作:众多互 ...
- 好巧,七夕最新8月书单出炉!送给你程序员
8月好书赏不停,七夕奉上8月新书单,请收下. 1.计算广告:互联网商业变现的市场与技术(第2版) 作者:刘鹏.王超 全球第一本全面讲解计算广告与互联网变现秘密的专业图书升级版 @北冥乘海生 刘鹏老师力 ...
- 程序员必须关注的技术趋势,内附PDF下载链接
点击关注 InfoQ,置顶公众号 接收程序员的技术早餐 作者|ThoughtWorks 编辑|小智 ThoughtWorks 已于昨日发布了最新一期的技术雷达,InfoQ 第一时间拿到了先手资料,提取 ...
- 厉害了!GitHub中文开源项目榜单出炉,揭露了程序员的硬性需求
点击上方"Github中文社区",关注 看遍Github好玩的项目 第50期原创 来自:Github中文社区 作者:huber 大家好!我是hub哥,咱们又见面了! 不知道大家是 ...
- 码农新机会!2019-2020行业调查报告出炉,这个领域程序员缺口很大!
近日,CSDN发布了<2019-2020中国开发者调查报告>,本报告从2004年开始针对一年一度的CSDN开发者大调查数据分析结果形成,是迄今为止覆盖国内各类开发者人群数量最多.辐射地域. ...
- 为什么高级程序员不必担心自己的技术过时?
程序员是吃青春饭的吗?等我们老了,技术过时了,公司有什么理由不裁掉我们,去雇一些既有活力.薪资要求又低的年轻人呢?这个老生常谈的问题困扰着诸多渐入中年的程序员.本文告诉你如何增强自己的核心竞争力,在知 ...
- 高赞回答:为什么高级程序员不必担心自己的技术过时?
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 ...
- 开年第一炸:黑马程序员1月就业报告新鲜出炉!
春节假期完结,进入开工模式,是时候打起精神,以元气满满的状态开启新的奋斗. 当代打工人年前必聊年终奖,年后的话题焦点非跳槽莫属.新年新气象,很多人摩拳擦掌跃跃欲试,计划着换个好工作. 在大家还翘首期盼 ...
- 又涨了!2021 年 5 月程序员工资统计新鲜出炉,网友:还是Java程序员牛逼~
新鲜出炉!2021年5月全国招收程序员429056人.2021年5月全国程序员平均工资14926元,工资中位数13000元,其中96%的人的工资介于1750元到75000元. 部分城市程序员工资收入情 ...
最新文章
- 【DBMS 数据库管理系统】OLAP 核心技术 : 数据方体 ( 数据方体 | 数据方体格结构 | 数据单元 )
- 针对这一行业痛点,创新工场投资的潞晨科技发布了大规模并行AI训练系统——“夸父”(Colossal-AI) ,通过多维并行、大规模优化器、自适应任务调度、消除冗余内存、降低能量损耗等方式,旨在打造一个
- .bash_profile 写入时间格式YYYY-MM-DD HH24:MI:SS 时报错 not a valid identifier
- 网页视频播放php拉伸代码,网页在线视频播放代码大全
- java 黑窗运行_javaday1 如何使用黑窗口打出helloworld并且要学会使用和环境配置/eclipse...
- 【Xamarin挖墙脚系列:代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧(转)】...
- Python爬取B站5000条视频,揭秘为何千万人看「哪吒」流泪
- 20181213-python1119作业郭恩赐
- IOS网络请求的一些需要记录的info设置
- android webview 例子,android – webview shouldinterceptrequest示例
- 《细说PHP》读书笔记
- 【经验贴】Java搭建一个以yy直播为主的直播聊天室
- sqlserver2008已成功与服务器建立连接 但在登录过程中发生错误,指定的网络名不可再用(已解决)
- 张钹院士:清华大学AI研究院要孵化人工智能界的BAT
- Spring Boot配置MongoDB多数据源
- css,sass,scss和less的区别
- 我为什么建议大家一定要考研?
- redis执行失败后的处理
- MT4/MQL4入门到精通EA教程第六课-MQL语言常用函数(六)-常用订单功能函数
- QML地图简介(1)