引用月经贴“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 写的,源码如下(只做抛装引玉)。我简单地统计了其中招聘名称,大家可以参考这样的思路爬更多的招聘网站,统计更多的信息——例如统计每所城市各自的热门编程语言等,看看自己的技术栈最适合呆在哪所城市!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 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°reefrom=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
|
|