== Receita: Ranking de Linguagens do SourceForge ==
Script útil para mostrar aos incrédulos que Python é uma linguagem bastante usada no desenvolvimento de software livre.
O site SourceForge.net publica uma relação com linguagens de programação e número de projetos hospedados com cada linguagem. Na página do SF, a listagem é alfabética por linguagem. Este script busca a relação e gera uma listagem ordenada por número de projetos, em ordem decrescente.
=== Código ===
{{{
# -*- coding: iso-8859-1 -*-
'''
A função buscar() acessa a página do SourceForge.net que relaciona
o número de projetos por linguagem de programação, e retorna uma
lista de tuplas (numero_de_projetos, linguagem), ordenada por
numero_de_projetos decrescente.
Quando acionado como programa principal, este módulo emite a
listagem em stdout, com campos delimitados por tab.
'''
import re
from urllib import urlopen
URL_FONTE = 'http://sourceforge.net/softwaremap/trove_list.php?form_cat=160'
TABELA = r'''Programming Language
(.*?)'''
# Ada (72 projects)
LINGUAGEM = r''' ([^<]+)\s*\((\d+) projects\)'''
re_tabela = re.compile(TABELA, re.IGNORECASE|re.DOTALL)
re_linguagem = re.compile(LINGUAGEM, re.IGNORECASE|re.DOTALL)
def buscar():
# teste local: html = open('trove_list.php.html').read()
html = urlopen(URL_FONTE).read()
miolo = re.search(re_tabela,html).group(1)
achados = re.findall(re_linguagem, miolo)
lista = [(int(projs), ling) for (ling, projs) in achados]
lista.sort(reverse=True)
return lista
def main():
lista = ['%5d\t%s' % item for item in buscar()]
print '\n'.join(lista)
if __name__=='__main__':
main()
}}}
O arquivo resultante fica assim:
{{{
12279 C
12112 C++
10519 Java
7963 PHP
5108 Perl
2820 Python
1661 Visual Basic
1502 JavaScript
1324 Delphi/Kylix
1287 Unix Shell
[...]
}}}
Volta para CookBook.
----------
LucianoRamalho
-----------
== Receita: Ranking de Linguagens do Google/Yahoo ==
De forma correlata, ontem me bateu vontade de ver quantos hits tínhamos pra diferentes linguagens nos search engines, mas combinando o nome da linguagem com um domínio da computação - por exemplo "scientific computing", "mail server", "web application" e assim por diante.
Comecei fazendo um buscadorzinho usando o html do google (eles tem uma API REST que seria mais apropriada.) Lá pelo meio do caminho, o Google resolveu que eu era um bot saqueando seus rankings e começou a colocar captchas pro meu script. Eu mudei pro Yahoo mas o código está bruto aqui - rápido e sujo - as funções para o google estão inclusas, é só mudar as atribuições dentro do código. Como eu tenho uma dimensão a mais pra busca, preferi dar a saída num arquivo CSV, que eu importo num software de planilha e fico vendo gráficos bonitos.
Só não consegui dados significativos ainda -- rodem uma vez e vocês vão perceber. Tem que se ajustar os domínios, talvez refinar um pouco mais as buscas com um outro parâmetro - para se ter algo mais interessante.
Bom fica aí pra quem quiser brincar
{{{
# !/usr/bin/env python
# coding: utf-8
import urllib
import csv
import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
urllib2.install_opener(opener)
#r = opener.open("http://example.com/")
GOOGLE_SEARCH_URL = """http://www.google.com/search?hl=en&safe=off&num=10&q=%s&btnG=Search"""
YAHOO_SEARCH_URL = """http://search.yahoo.com/search?p=%s&y=Search"""
csvfile = "language_domains.csv"
SEARCH_URL = YAHOO_SEARCH_URL
def get_result(language, domain):
language = language.replace("+", "%2B")
language = language.replace("#", "%23")
if " " in language:
language = "%%22%s%%22" % language
if " " in domain:
domain = "%%22%s%%22" % domain
query_string = "%s++%s" % (domain.replace(" ", "+"), language.replace(" ", "+"),)
url = SEARCH_URL % query_string
print url
html = urllib2.urlopen(url).read()
return html
def count_matches_google(html):
index = html.find("swrnum=")
if index == -1:
return 0
part = html[index + len("swrnum="):]
part = part.split('"')[0]
if part.isdigit():
return int(part)
return 0
def count_matches_yahoo(html):
index = html.find('''id="infotext"''')
if index == -1:
return 0
part = html[index: index + 80]
part = part.split("of")[1].split("for")[0].strip()
part = part.replace(",", "")
if part.isdigit():
return int(part)
return 0
count_matches = count_matches_yahoo
languages = ("java", "c++", "python","javascript", "ruby", "php", "perl", "shell", "fortran", "cobol", "ansi c", "visual basic", "c#", "lua", "jython")
domains = ("scientific computing", "web development", "server software", "gui application", "database", "financial",
"mail server", "security software", "system administration", "enterprise software")
def main():
file = open(csvfile, "wt")
writer = csv.writer(file)
writer.writerow(("",) + languages +("NORMALIZED",) + languages)
for domain in domains:
results = []
for language in languages:
count = count_matches(get_result(language, domain))
print ("%s- %s: %s" % (domain, language, count))
results.append(count)
m = float(max(results))
normalized_results = [result / m for result in results]
writer.writerow([domain] + results + [""] + normalized_results)
file.close()
main()
}}}
Volta para CookBook
---------
JoaoBueno