38
回答
2015年8月 中国版的编程语言排行榜

引用月经贴“TIOBE”编程语言排行榜的声明:“这个榜单本身采集的是英文世界的数据,虽然在反映趋势上有一些参考意义,但与中国的实际情况不完全符合,而且,这张采样本身也有相当大的局限性。...排名使用著名的搜索引 擎(诸如 Google、MSN、Yahoo!、Wikipedia、YouTube 以及 Baidu 等)进行计算。”

因此,“TIOBE”排行榜反映的是英文世界里各种编程语言的“受关注程度”。通过搜索引擎去查询,并不能说明查询的人在使用这门编程语言,也有可能只是想去了解一下。所以当iPhone崛起的时候,很多人会听说 Objective-C,因此它受到很多人的关注,但不见得就有很多 Objective-C 程序员。

我其实更想知道的是中国这片土地上各种编程语言的占用率排行榜,即什么编程语言被最广泛地使用。有这样一份排行榜,就能知道哪一门编程语言的就业机会最多;如果有持续的报告,还可以看出哪些编程语言在企业中逐渐受到关注,哪些逐渐被冷落,就能及时地跟上趋势。

于是我爬了`51job`上针对“计算机软件”、“计算机服务”、“互联网/电子商务”和“网络游戏” 4 个行业的 “计算机软件” 和 “互联网/电子商务/网游” 岗位的前 10000 条招聘信息,从中提取出开发岗位相关的信息,并做了简单的归类,统计出各种编程语言的岗位数量。结果如下:

排名 编程语言 岗位数量
1 java 15116
2 php 5129
3 .net 3879
4 javascript 3878
5 objective-c 3651
6 c++ 2119
7 c# 1454
8 c 949
9 html 701
10 sql 639
11 asp 559
12 shell 532
13 python 314
14 actionscript 221
15 css 69
16 ruby 59
17 vb 58
18 cobol 54
19 erlang 41
20 lua 34
21 go 27
22 scala 9
23 perl 7
24 swift 4

对比“2015年8月 TIOBE 编程语言排行榜”的结果(如下图),就能发现 Java 无论国内外都是无可争议的王者,排在其后的是 PHP 和 .NET,相比 TIOBE 的 C 和 C++,更接近周边的实际情况:招聘时 Javaer 遍地开花,PHPer 一抓一大把,.NET 的也不少,前端和移动开发不断崛起中;Flash 开发基本已成明日黄花,热门程度还比不上 Python。

爬虫我是用 Python 2.7 写的,源码如下(只做抛装引玉)。我简单地统计了其中招聘名称,大家可以参考这样的思路爬更多的招聘网站,统计更多的信息——例如统计每所城市各自的热门编程语言等,看看自己的技术栈最适合呆在哪所城市!

#!/usr/bin/env python
# -*- coding: utf-8 -*-  

import urllib2, sys, re, glob, operator

reload(sys)
sys.setdefaultencoding('utf-8')

alias = {
    'java': 'java',
    'javaee': 'java',
    'javase': 'java',
    'javaweb': 'java',
    'android': 'java',
    'eclipse': 'java',
    'weblogic': 'java',
    'tomcat': 'java',
    'jvm': 'java',
    'scala': 'scala',
    'clojure': 'clojure',
    'groovy': 'groovy',

    'net': '.net',
    '.net': '.net',
    'dotnet': '.net',
    'c#': 'c#',
    'unity': 'c#',
    'asp': 'asp',
    'asp.net': '.net',
    'winform': '.net',
    'vb': 'vb',
    'basic': 'vb',

    'php': 'php',
    'python': 'python',
    'perl': 'perl',
    'ruby': 'ruby',
    'rails': 'ruby',

    'c++': 'c++',
    'qt': 'c++',
    'c': 'c',
    'opencv': 'c',
    'objective-c': 'objective-c',
    'ios': 'objective-c',
    'iphone': 'objective-c',
    'cocos': 'objective-c',
    'swift': 'swift',

    'dba': 'sql',
    'oracle': 'sql',
    'mysql': 'sql',
    'pgsql': 'sql',
    'postgresql': 'sql',
    'database': 'sql',
    'sqlserver': 'sql',
    'sql': 'sql',

    'web': 'javascript',
    'js': 'javascript',
    'json': 'javascript',
    'node': 'javascript',
    'nodejs': 'javascript',
    'jquery': 'javascript',
    'phonegap': 'javascript',
    'angularjs': 'javascript',
    'javascript': 'javascript',
    'html': 'html',
    'css': 'css',

    'flash': 'actionscript',
    'flex': 'actionscript',
    'actionscript': 'actionscript',

    'sh': 'shell',
    'shell': 'shell',
    'unix': 'shell',
    'linux': 'shell',
    'ubuntu': 'shell',

    'go': 'go',
    'golang': 'go',
    'erlang': 'erlang',
    'lua': 'lua',
    'cobol': 'cobol'
}

languages = {}

urllib2.socket.setdefaulttimeout(10)
browser = urllib2.build_opener()
browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')]

url = 'http://search.51job.com/jobsearch/search_result.php?fromJs=1&jobarea=000000%%2C00&district=000000&funtype=0100%%2C2500&industrytype=01%%2C38%%2C32%%2C40&issuedate=8&providesalary=99&keywordtype=1&curr_page=%d&lang=c&stype=2&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=01&companysize=99&lonlat=0%%2C0&radius=-1&ord_field=0&list_type=0&fromType=14&dibiaoid=-1'

for i in xrange(1, 2000):
    try:
        for content in re.findall('<td class="td1".*</td>', browser.open(url % i).read().decode('gbk')):
            title = re.search('title="([^"]+)"', content) or re.search('>([^<]+)<', content)
            if title:
                for tech in re.findall('(?:c#|c\\+\\+|.net|[a-z]+)', title.group(1).lower()):
                    if alias.has_key(tech):
                        key = alias[tech]
                        languages[key] = languages.get(key, 0) + 1
    except:
        print('ignore')

for tech, count in sorted(languages.items(), key=operator.itemgetter(1)):
    print tech, count
举报
redraiment
发帖于3年前 38回/23K+阅
顶部