Fiz uma rotina para fazer download de arquivos na internet usando o urllib, mas
estou tendo duas dificuldades as quais não sei ainda como resolver.
A rotina está em:
http://paste.ideaslabs.com/show/XDbYw5Fh8k
onde 'human_bytes' e 'human_time' são duas funções para formatar o número de
bytes em kB, MB, ... e o tempo em hh:mm:ss. Para não perder o foco, por hora
defina-as como:
def human_bytes(s):
return '%dB' % s
def human_time(t):
return '%ds' % t
A rotina funciona muito bem, a menos dos dois problemas que encontrei:
1 - a taxa de download é 1/4 de um wget (na rede em que me encontro agora). Bom
não precisava ser uma taxa igual ou superior a do wget, mas 1/4 me surpreendeu
muito. Enquanto que esta função em python baixava a 250kB/s o wget fazia o mesmo
a 1M/s, na mesma rede, independente da ordem em que fossem executados, antes que
alguém pense que é cache.
2 - em alguns casos o download é cancelado e a função não gera erro algum, o
'try' da linha 34-66 não me retorna nada. Por este motivo tive que fazer a
checagem do tamanho baixado na linha 70.
Quanto ao problema 1, na forma que a função está definida, ela baixa uma linha
de cada vez do arquivo solicitado, que em muitos casos é um binário. Imagino que
ele deve baixar os bytes em sequência até encontrar o ascii indicando a mudança
de linha. Acho que por isto não consegue uma taxa de download boa, pois num
instante a linha baixada possui 1 byte e noutro 205, 14, 65, ... Chequei isto
imprimindo o comprimento da linha, e de fato, até onde compreendi, ocorre algo
assim.
Neste dois requisitos o wget me resolveria o problema muito bem, mas não
gostaria de ter que chamá-lo pelo Python, antes de ter certeza de que o mesmo
não pode ser feito de forma eficiente apenas com o Pyton....
Alguém tem alguma ideia de como melhorar isto?
________________________________________________________________________________\
____
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com
[As partes desta mensagem que não continham texto foram removidas]