Aproveitando que meu time está em primeiro, aproveitei pra colocar mais um crawler com BautifulSoup, só que desta vez usando twisted.
A fonte de informação é o Globo Esporte, e pela leve bagunça que há no HTML e CSS, o código ficou meio feioso. Além disso, consegui deixar ainda mais feio pra poder imprimir bonito no terminal.
#!/usr/bin/env python
# coding: utf-8
# 20090127 AF - paulistão 2009, crawler
import re
from sys import stdout
from twisted.internet import reactor
from twisted.web.client import getPage
from BeautifulSoup import BeautifulSoup
crlft = re.compile(r'[\r\n\t]*')
URL = 'http://globoesporte.globo.com/Esportes/Futebol/Classificacao/0,,ESP0-9839,00.html'
def failure(err):
print(err)
reactor.stop()
def parser(contents):
current = 1
columns = 10
f = lambda m: crlft.sub('', m.contents[0]+' ')
soup = BeautifulSoup(contents, convertEntities='html')
classes = ['borda borda-forte', 'borda semborda', ' borda-forte',
' semborda', 'time borda', 'borda', 'time ', '']
stdout.write('% 18s' % 'TIME')
for label in ['P', 'J', 'V', 'E', 'D', 'GP', 'GC', 'SG', '(%)']:
stdout.write('% 5s' % label)
stdout.write('\n')
for item in soup.findAll('td', {'class':classes}):
if item.find('span'):
temp = '%02d. % 15s' % ((current / columns)+1,
item.span.find('a') and f(item.span.a) or f(item.span))
stdout.write(temp.encode('utf-8'))
else:
stdout.write('% 5s' % f(item))
if not current % columns: stdout.write('\n')
current += 1
reactor.stop()
if __name__ == '__main__':
deferred = getPage(URL)
deferred.addCallback(parser)
deferred.addErrback(failure)
reactor.run()
E o resultado, no terminal:
$ python paulista.py
TIME P J V E D GP GC SG (%)
01. Palmeiras 9 3 3 0 0 7 0 7 100
02. Santos 6 2 2 0 0 4 1 3 100
03. São Caetano 6 2 2 0 0 3 0 3 100
04. Guarani 6 2 2 0 0 2 0 2 100
05. Mirassol 4 2 1 1 0 5 3 2 66
06. São Paulo 4 2 1 1 0 3 1 2 66
07. Corinthians 4 2 1 1 0 3 2 1 66
08. Ponte Preta 4 3 1 1 1 2 1 1 44
09. Bragantino 3 2 1 0 1 4 3 1 50
10. Paulista 3 2 1 0 1 2 2 0 50
11. Santo André 3 3 1 0 2 1 2 -1 33
12. Barueri 2 2 0 2 0 4 4 0 33
13. Oeste 2 2 0 2 0 2 2 0 33
14. Ituano 1 2 0 1 1 1 2 -1 16
15. Botafogo-SP 1 2 0 1 1 4 6 -2 16
16. Guaratinguetá 1 2 0 1 1 2 4 -2 16
17. Marília 1 3 0 1 2 3 8 -5 11
18. Noroeste 0 2 0 0 2 1 4 -3 0
19. Portuguesa 0 2 0 0 2 0 3 -3 0
20. Mogi Mirim 0 2 0 0 2 0 5 -5 0

Minha implementacao tambem nao ficou bonita… mas funciona :D
Basta aplicar o diff abaixo pra ter um resultado mais realista :P
Abraços
[user@MacWhite ~]$ diff paulista.orig.py paulista.py
27c27
stdout.write('% 18s' % 'TIME' + ' ')
33a34
> teamName = item.span.find('a') and f(item.span.a) or f(item.span)
35,36c36,37
< item.span.find('a') and f(item.span.a) or f(item.span))
teamName)
> stdout.write(temp.encode('utf-8') + (teamName == 'Palmeiras ' and '(SORTE)' or ' '))
47a49
>
haha!
Por enquanto.
ta durando hein… o crawler continua “funcionando bem”, mostra o palmeiras em primeiro. :)
só pra lembrar que o crawler anda “funciona bem”. palmeiras em primeiro, sem derrota.