Realizar download em multiplataformas

19 views
Skip to first unread message

Mateus Ferreira

unread,
Aug 17, 2012, 9:47:22 PM8/17/12
to pyth...@googlegroups.com
Me deparei com um problema que é realizar downloads utilizando links pegos diretamente de uma página web. 
Estou utilizando o Linux, logo usei o comando os.system('wget {0}'.format(link)) , sendo que em link estava a URL do que desejo realizar o download.

Porém isto me prende somente a realizar downloads no Linux, caso eu queira utilizar um Mac ou Windows, eles não iriam reconhecer o comando wget.

Existe uma maneira de realizar este download de forma multiplataforma ?

att.

--
Mateus Ferreira Silva
Cursando Tecnologia de Sistemas para Internet
3º Período - IFET Barbacena
Desenvolvedor - SIGA-ADM





Álvaro Justen [Turicas]

unread,
Aug 17, 2012, 9:59:25 PM8/17/12
to pyth...@googlegroups.com

Você pode utilizar as bibliotecas urllib ou urllib2, que estão na biblioteca padrão.
Mas caso você precise de algo um pouco mais robusto (que, por exemplo siga redirecionamentos automaticamente) e queria uma API muito mais simples, sugiro usar a biblioteca requests[https://github.com/kennethreitz/requests].

[]s

--
 
 
 

SleX Luthor

unread,
Aug 18, 2012, 5:02:24 PM8/18/12
to pyth...@googlegroups.com
Como o Álvaro falou vc pode usar a urlib pra fazer o download e bem simples da uma olhada ai em uma implementacao

def my_wget(url,arq):
    import urllib
    request = urllib.urlopen(url)
    farq = open(arq,'w')
    try:
        farq.write(request.read())
        return True
    finally:
        farq.close()
    return False

if __name__ == '__main__':
    print  my_wget('http://slex.com.br','c:/slex.html')

--
 
 
 



--
Alexandre Villela Eiras Brandão de Oliveira
or simply "SleX"

"Dispõe o Eterno Escriba e, havendo escrito, a folha vira. E não há ciência ou devoção que apague uma linha. E não há pranto sofrido que risque uma palavra. Ah, todo choro é vão!" (Omar Khayyam no livro Rubayat)

Mateus Ferreira

unread,
Aug 18, 2012, 10:48:38 PM8/18/12
to pyth...@googlegroups.com
Obrigado pessoal, foi de grande ajuda =).


--
 
 
 

Fabrício Kelmer

unread,
Aug 21, 2012, 9:12:40 AM8/21/12
to
Alexandre,

Eu segui o seu modelo de código, funciona perfeito em multiplataforma. Porém ao tentar fazer o download de um arquivo .zip no Windows, ele veio corrompido. Acredito que não possa ser feito uma operação simples de cópia de conteúdo como se fosse string (read() e depois write()).
Não consegui resolver este problema, com certeza vai funcionar igual ao FTP via linha de comando no Windows, se tentar copiar em Texto vai ficar corrompido, o certo seria fazer esta cópia bit a bit (modo binário).

Abraço.

Fabrício Kelmer
fabriciotobe (em) gmail.com
Bacharel em Ciência da Computação
Microsoft Certified Professional
ITIL Foundation

Johnnatan Messias

unread,
Aug 21, 2012, 9:29:38 AM8/21/12
to pyth...@googlegroups.com
Utilizei isso quando eu precisava baixar umas imagens para um site.

Tente usar essa função:

import urllib
def download(url, nomeComExtensao):
urllib.urlretrieve(url, nomeComExtensao)


Postando o código que implementei para o coletor de imagens:

# -*- coding: UTF-8 -*-

# by Johnnatan Messias ------> @johnnatan20 <------

import urllib, json, os
from bs4 import BeautifulSoup as bs

def downloadImages(urlImages, titleSite):
os.mkdir(titleSite)
os.chdir(titleSite)
print ("Coleta do site %s iniciada\n\n" %(titleSite))
for url in urlImages:
nameImage = url.split('/')[-1]
urllib.urlretrieve(url, nameImage)
print ("%s Imagem coletada com sucesso" %(nameImage))
print ("Coleta do site %s terminada\n\n" %(titleSite))
os.chdir('..')

  
def getHTML(url):
return urllib.urlopen(url).read()
 
def parserHTML(html, key):
listKeys = []
soup = bs(html)
keys = soup.findAll(key)
for key in keys:
listKeys.append(key.get('src'))
return (soup.title.string, listKeys)
 
def execute(urlList):
for url in urlList:
html = getHTML(url)
titleSite, urlImages = parserHTML(html, 'img')
downloadImages(urlImages, titleSite)

def getPainel():
    print ("[0] - Exit")
    print ("[1] - Iniciar")


def main():
    print "Coletor de Imagens by Johnnatan Messias"
    print "Universidade Federal de Ouro Preto"
    print "Ciencia da Computacao - UFOP"
    print "Twitter: @johnnatan20\n\n"
    while(True):
        getPainel()
        op = input("Digite a opcao: ")
        
        if(op == 0):
            break
        
        elif(op == 1):
            #Lista de URLs
            urlList = ['http://www.ufop.br']
            
            print ("\nIniciando coleta --->\n")
            execute(urlList)
            print ("\nColeta finalizada <---\n")
            
        else:
            print "Comando invalido"
            

if __name__ == "__main__":
    main()

[]'s
 ---
Johnnatan Messias P. Afonso
Graduando em Ciência da Computação
UFOP - Universidade Federal de Ouro Preto

(31)8409-5761 (OI)
(31)8263-9492 (Claro)
      

Antes de imprimir pense em sua responsabilidade e compromisso com o MEIO AMBIENTE!

Ao encaminhar esta mensagem, por favor:
1. Apague o meu e-mail e o meu nome. 
2. Apague também os endereços dos amigos antes de reenviar.
3. Encaminhe como cópia oculta (Cco ou Bcc) aos SEUS destinatários. 
Agindo sempre assim dificultaremos a disseminação de vírus, spams e banners.




2012/8/21 Fabrício Kelmer <fabric...@gmail.com>
--
 
 
 

Douglas Everton

unread,
Aug 21, 2012, 10:30:05 AM8/21/12
to pyth...@googlegroups.com
Fabrício,

Tenta utilizar a biblioteca urllib2 no lugar da urllib.



--
 
 
 

Douglas Everton

unread,
Aug 21, 2012, 10:33:47 AM8/21/12
to pyth...@googlegroups.com
Tente assim,

import urllib2
zip_file
= urllib2.urlopen("http://www.example.com/zips/zip_file.zip")
output
= open('zip_file.mp3','wb')
output
.write(zip_file.read())
output
.close()

O arquivo deve ser aberto em modo binário "wb" (write binary).

Fabrício Kelmer

unread,
Aug 21, 2012, 11:26:29 AM8/21/12
to pyth...@googlegroups.com
Douglas, 

Desta forma funcionou, valeu.



Johnnatan,

Valeu também, vou testar da forma que passou também.

SleX Luthor

unread,
Aug 22, 2012, 1:36:01 AM8/22/12
to pyth...@googlegroups.com
;] isso ai galera farq = open(arq,'wb') resolve  treta.

--
 
 
 

Paulo Roberto Macedo Chaves

unread,
Aug 22, 2012, 2:20:09 AM8/22/12
to pyth...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages