引用月经贴“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⟨=c&stype=2&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=01&companysize=99&lonlat=0%%2C0&radius=-1⩝_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