Python como wget

View: New views
16 Messages — Rating Filter:   Alert me  

Python como wget

by Henrique Baggio :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Olá pessoal,
Hoje me deparei com um problema de ter que baixar todos os arquivos de um
diretório localizado num servidor (no caso eram rpms de uma distro linux).
Queria poder baixar os arquivos usando algo semelhante ao comando wget do
linux, com a opção recursiva [1], de forma que o script varresse o diretório
e fizesse o download de cada arquivo encontrado.

Bem, mas o motivo pra eu usar python é porque eu queria fazer isso de uma
máquina rodando Windows, e logicamente, sem wget. =/

Procurei um pouco na net sobre alternativas de fazer esse download em
python, mas não consegui encontrar muita coisa útil. Tentei usar o módulo
urllib, mas não consegui fazê-lo entender a url como um diretório, de forma
a listar os arquivos dentro dele. Apenas consegui baixar o conteúdo da
página html usada pelo servidor para me mostrar a lista de arquivos.

Claro que eu poderia fazer uma gambiarra e procurar os links dos arquivos
pelo conteúdo do html, mas gostaria de saber se existe alguma outra
alternativa, se a linguagem me permite algo mais alto nível. =]

Alguma idéia?

[1] http://linux.die.net/man/1/wget

Abraços!
--
Henrique Baggio
Computer Engineering - Unicamp

Microsoft Innovation Center - Unicamp
Software Engineer
http://www.lms.ic.unicamp.br
http://www.codeplex.com/lmsu


[As partes desta mensagem que não continham texto foram removidas]


Re: Python como wget

by Henrique Baggio :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Bem, esqueci um dos lugares mais básicos pra procurar: a própria lista! =P
To dando uma olhada no histórico. Se achar algo eu aviso. =]


[As partes desta mensagem que não continham texto foram removidas]


Re: Re: Python como wget

by Paul Eipper-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Se preferir não implementar na mão, existe port do wget para windows:

http://users.ugent.be/~bpuype/wget/


(desculpa estragar o incentivo :P)
--
Paul Eipper

Re: Re: Python como wget

by Henrique Baggio :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/2/2 Paul Eipper <lkraider@...>
>
> Se preferir não implementar na mão, existe port do wget para windows:
>
> http://users.ugent.be/~bpuype/wget/

Bem, isso resolve o meu problema, heheh. Valeu, Paul!

>
> (desculpa estragar o incentivo :P)

Relaxe, ainda pretendo fazer isso em Python, pq não gostei das
soluções que vi pela net, e acho que seria um bom exercício, =]

Re: Python como wget

by Luciano Ramalho :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/2/2 Henrique Baggio <hnrqbaggio@...>:
> Procurei um pouco na net sobre alternativas de fazer esse download em
> python, mas não consegui encontrar muita coisa útil. Tentei usar o módulo
> urllib, mas não consegui fazê-lo entender a url como um diretório, de forma
> a listar os arquivos dentro dele.

Oi, Henrique, não existe como "entender a url como um diretório" no
protocolo HTTP. Existe no FTP, mas no HTTP não existe um comando que
você possa enviar para o servidor dizer tudo o que tem num diretório.

> Apenas consegui baixar o conteúdo da
> página html usada pelo servidor para me mostrar a lista de arquivos.

Sim, se você enviar um GET para uma determinada URL, o servidor pode
te devolver uma listagem de arquivos. Mas isso depende de como o
servidor foi configurado. Não existe nenhuma obrigação, segundo o
protocolo HTTP, de que isso seja desta maneira.

> Claro que eu poderia fazer uma gambiarra e procurar os links dos arquivos
> pelo conteúdo do html

É assim exatamente que funciona o Wget recursivo.

> , mas gostaria de saber se existe alguma outra
> alternativa, se a linguagem me permite algo mais alto nível. =]

> Alguma idéia?
>
> [1] http://linux.die.net/man/1/wget

Procure o wget para Windows (já te deram o link), ou faça um script
combinando urllib com alguma biblioteca mencionada neste excelente
post do über-guru Ian Bicking:

http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/

Se for criar sua própria solução, talvez seja legal dar uma lida na
especificação do HTTP, para sacar o que é possível esperar do
protocolo. A parte que fala dos métodos (comandos) fica aqui:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

Boa sorte!

[ ]s
Luciano

Re: Python como wget

by Leonardo Santagada :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


On Feb 2, 2009, at 8:36 AM, Luciano Ramalho wrote:

> 2009/2/2 Henrique Baggio <hnrqbaggio@...>:
>> Procurei um pouco na net sobre alternativas de fazer esse download em
>> python, mas não consegui encontrar muita coisa útil. Tentei usar o  
>> módulo
>> urllib, mas não consegui fazê-lo entender a url como um diretório,  
>> de forma
>> a listar os arquivos dentro dele.
>
> Oi, Henrique, não existe como "entender a url como um diretório" no
> protocolo HTTP. Existe no FTP, mas no HTTP não existe um comando que
> você possa enviar para o servidor dizer tudo o que tem num diretório.
>
>> Apenas consegui baixar o conteúdo da
>> página html usada pelo servidor para me mostrar a lista de arquivos.
>
> Sim, se você enviar um GET para uma determinada URL, o servidor pode
> te devolver uma listagem de arquivos. Mas isso depende de como o
> servidor foi configurado. Não existe nenhuma obrigação, segundo o
> protocolo HTTP, de que isso seja desta maneira.
>
>> Claro que eu poderia fazer uma gambiarra e procurar os links dos  
>> arquivos
>> pelo conteúdo do html
>
> É assim exatamente que funciona o Wget recursivo.
>
>> , mas gostaria de saber se existe alguma outra
>> alternativa, se a linguagem me permite algo mais alto nível. =]
>
>> Alguma idéia?
>>
>> [1] http://linux.die.net/man/1/wget
>
> Procure o wget para Windows (já te deram o link), ou faça um script
> combinando urllib com alguma biblioteca mencionada neste excelente
> post do über-guru Ian Bicking:
>
> http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/
>
> Se for criar sua própria solução, talvez seja legal dar uma lida na
> especificação do HTTP, para sacar o que é possível esperar do
> protocolo. A parte que fala dos métodos (comandos) fica aqui:
>
> http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

E dar uma olhada no harvest man, pra não reinventar a roda:

http://www.harvestmanontheweb.com/

se bem que hoje devem existir uns 10 web crawler/spider em python.

--
Leonardo Santagada
santagada at gmail.com




Re: Python como wget

by Luciano Ramalho :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/2/2 Leonardo Santagada <santagada@...>:
> E dar uma olhada no harvest man, pra não reinventar a roda:
>
> http://www.harvestmanontheweb.com/

Boa dica.

> se bem que hoje devem existir uns 10 web crawler/spider em python.

Com certeza. Um deles é um tal de Google, mas não é open source ;-).

[ ]s
Luciano

Re: Python como wget

by Luciano Ramalho :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/2/2 Leonardo Santagada <santagada@...>:
> E dar uma olhada no harvest man, pra não reinventar a roda:
>
> http://www.harvestmanontheweb.com/

Dei uma olhada superficial no HarvestMan e achei que ele tem um forte
cheiro de Java, embora seja feito em Python.

Primeiro porque usa um arquivo XML para configurar. Eu acho Python uma
ótima linguagem de configuração. Segundo porque usa threads em vez de
select para lidar com requisições assíncronas.

Isso não quer dizer que não seja excelente (não experimentei) apenas
não é como eu faria ;-).

[ ]s
Luciano

Re: Python como wget

by Guilherme Chapiewski-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Uma vez fiz um programinha para baixar todas as imagens de um site. Ele não
faz exatamente o que vc quer mas dá uma olhada nele que pode te dar algumas
idéias:

http://github.com/guilhermechapiewski/sandbox/blob/60e040bf7bb345fadaa5649f7cf8301f418a882e/download_all_site_images.py

[ ]s, gc
--
Guilherme Chapiewski
http://gc.blog.br


2009/2/2 Henrique Baggio <hnrqbaggio@...>

>   Olá pessoal,
> Hoje me deparei com um problema de ter que baixar todos os arquivos de um
> diretório localizado num servidor (no caso eram rpms de uma distro linux).
> Queria poder baixar os arquivos usando algo semelhante ao comando wget do
> linux, com a opção recursiva [1], de forma que o script varresse o
> diretório
> e fizesse o download de cada arquivo encontrado.
>
> Bem, mas o motivo pra eu usar python é porque eu queria fazer isso de uma
> máquina rodando Windows, e logicamente, sem wget. =/
>
> Procurei um pouco na net sobre alternativas de fazer esse download em
> python, mas não consegui encontrar muita coisa útil. Tentei usar o módulo
> urllib, mas não consegui fazê-lo entender a url como um diretório, de forma
> a listar os arquivos dentro dele. Apenas consegui baixar o conteúdo da
> página html usada pelo servidor para me mostrar a lista de arquivos.
>
> Claro que eu poderia fazer uma gambiarra e procurar os links dos arquivos
> pelo conteúdo do html, mas gostaria de saber se existe alguma outra
> alternativa, se a linguagem me permite algo mais alto nível. =]
>
> Alguma idéia?
>
> [1] http://linux.die.net/man/1/wget
>
> Abraços!
> --
> Henrique Baggio
> Computer Engineering - Unicamp
>
> Microsoft Innovation Center - Unicamp
> Software Engineer
> http://www.lms.ic.unicamp.br
> http://www.codeplex.com/lmsu
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]


Re: Python como wget

by Guilherme Chapiewski-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Acabei de ver que ele não funciona direito porque espera que todas as urls
das imagens sejam absolutas :)

Bom, mesmo assim espero que possa te dar alguma idéia.

[ ]s, gc
--
Guilherme Chapiewski
http://gc.blog.br


2009/2/2 Guilherme Chapiewski <guilherme.chapiewski@...>

> Uma vez fiz um programinha para baixar todas as imagens de um site. Ele não
> faz exatamente o que vc quer mas dá uma olhada nele que pode te dar algumas
> idéias:
>
>
> http://github.com/guilhermechapiewski/sandbox/blob/60e040bf7bb345fadaa5649f7cf8301f418a882e/download_all_site_images.py
>
> [ ]s, gc
> --
> Guilherme Chapiewski
> http://gc.blog.br
>
>
> 2009/2/2 Henrique Baggio <hnrqbaggio@...>
>
>>   Olá pessoal,
>>
>> Hoje me deparei com um problema de ter que baixar todos os arquivos de um
>> diretório localizado num servidor (no caso eram rpms de uma distro linux).
>> Queria poder baixar os arquivos usando algo semelhante ao comando wget do
>> linux, com a opção recursiva [1], de forma que o script varresse o
>> diretório
>> e fizesse o download de cada arquivo encontrado.
>>
>> Bem, mas o motivo pra eu usar python é porque eu queria fazer isso de uma
>> máquina rodando Windows, e logicamente, sem wget. =/
>>
>> Procurei um pouco na net sobre alternativas de fazer esse download em
>> python, mas não consegui encontrar muita coisa útil. Tentei usar o módulo
>> urllib, mas não consegui fazê-lo entender a url como um diretório, de
>> forma
>> a listar os arquivos dentro dele. Apenas consegui baixar o conteúdo da
>> página html usada pelo servidor para me mostrar a lista de arquivos.
>>
>> Claro que eu poderia fazer uma gambiarra e procurar os links dos arquivos
>> pelo conteúdo do html, mas gostaria de saber se existe alguma outra
>> alternativa, se a linguagem me permite algo mais alto nível. =]
>>
>> Alguma idéia?
>>
>> [1] http://linux.die.net/man/1/wget
>>
>> Abraços!
>> --
>> Henrique Baggio
>> Computer Engineering - Unicamp
>>
>> Microsoft Innovation Center - Unicamp
>> Software Engineer
>> http://www.lms.ic.unicamp.br
>> http://www.codeplex.com/lmsu
>>
>> [As partes desta mensagem que não continham texto foram removidas]
>>
>>  
>>
>
>
>
>


[As partes desta mensagem que não continham texto foram removidas]


Re: Python como wget

by Henrique Baggio :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/2/2 Luciano Ramalho <ramalho@...>

>
> 2009/2/2 Henrique Baggio <hnrqbaggio@...>:
>
> > Procurei um pouco na net sobre alternativas de fazer esse download em
> > python, mas não consegui encontrar muita coisa útil. Tentei usar o módulo
> > urllib, mas não consegui fazê-lo entender a url como um diretório, de forma
> > a listar os arquivos dentro dele.
>
> Oi, Henrique, não existe como "entender a url como um diretório" no
> protocolo HTTP. Existe no FTP, mas no HTTP não existe um comando que
> você possa enviar para o servidor dizer tudo o que tem num diretório.

Não sabia disso Luciano. Realmente, ainda sou novato e nunca tive a
chance de estudar esses protocolos. Achava que o fato de a URL ser um
diretório no servidor bastaria pra eu poder listar os arquivo nele
remotamente. Inocência minha =P

>
> > Apenas consegui baixar o conteúdo da
> > página html usada pelo servidor para me mostrar a lista de arquivos.
>
> Sim, se você enviar um GET para uma determinada URL, o servidor pode
> te devolver uma listagem de arquivos. Mas isso depende de como o
> servidor foi configurado. Não existe nenhuma obrigação, segundo o
> protocolo HTTP, de que isso seja desta maneira.
>
> > Claro que eu poderia fazer uma gambiarra e procurar os links dos arquivos
> > pelo conteúdo do html
>
> É assim exatamente que funciona o Wget recursivo.

Também não sabia disso, heheh. Pra mim ele se comunicava de outra maneira.

> > , mas gostaria de saber se existe alguma outra
> > alternativa, se a linguagem me permite algo mais alto nível. =]
>
> > Alguma idéia?
> >
> > [1] http://linux.die.net/man/1/wget
>
> Procure o wget para Windows (já te deram o link), ou faça um script
> combinando urllib com alguma biblioteca mencionada neste excelente
> post do über-guru Ian Bicking:
>
> http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/

Dessa vez eu usei o wget for winodows mesmo, pq tinha um pouco de
pressa. Mas como disse, vou dar uma estudada mais a fundo no assunto.

>
> Se for criar sua própria solução, talvez seja legal dar uma lida na
> especificação do HTTP, para sacar o que é possível esperar do
> protocolo. A parte que fala dos métodos (comandos) fica aqui:
>
> http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
>
> Boa sorte!

Obrigado pelos links, vou dar uma lida neles.  =]

--
Henrique Baggio

Re: Python como wget

by Henrique Baggio :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/2/2 Leonardo Santagada <santagada@...>

[cut]

> E dar uma olhada no harvest man, pra não reinventar a roda:
>
> http://www.harvestmanontheweb.com/
>
> se bem que hoje devem existir uns 10 web crawler/spider em python.

Eu tentei procurar por esse ai depois de ver um comentário sobre ele
no histórico da lista, mas não tinha conseguido achar.  Obrigado,
Sangataga!

Re: Python como wget

by Hugo Lopes-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

> Não sabia disso Luciano. Realmente, ainda sou novato e nunca tive a
> chance de estudar esses protocolos. Achava que o fato de a URL ser um
> diretório no servidor bastaria pra eu poder listar os arquivo nele
> remotamente. Inocência minha =P

A URL nem sempre é um diretório no servidor, veja o caso do ZODB (Zope).

Imagine a url: http://meusite.dominio/portal/foo

`portal` é um diretório? No caso do Zope, `foo` poderia ser uma
propriedade do objeto `portal`, que pode não ser um diretório.

Threads para baixar arquivos era: Re: Python como wget

by Leonardo Santagada :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


On Feb 2, 2009, at 2:07 PM, Luciano Ramalho wrote:

> 2009/2/2 Leonardo Santagada <santagada@...>:
>> E dar uma olhada no harvest man, pra não reinventar a roda:
>>
>> http://www.harvestmanontheweb.com/
>
> Dei uma olhada superficial no HarvestMan e achei que ele tem um forte
> cheiro de Java, embora seja feito em Python.

>  Segundo porque usa threads em vez de
> select para lidar com requisições assíncronas.


Eu acho isso legal na verdade. Embora select seja interessante para  
programação assyncrona de grande demanda, baixar muitas imagens e  
dados de um site é algo que facilmente pode ser delegado a um thread  
(e em python realmente roda em outra thread pq é código c).

O jeito facil de fazer um spider em python é pensar num modelo de  
comunicação através de filas de mensagens onde uma consumer thread lê  
o html e faz processamentos enquanto monta uma Queue (do módulo Queue)  
para uma quantidade de worker threads bem simples que só abrem um  
socket e baixam um arquivo (usando urllib2 ou algo assim).

Eu tinha um desses para baixar a escala de horarios da minha  
universidade e acho que com toda a logica maluca para fazer o parser e  
entender um html muito mal feito deles ainda assim era umas 100 linhas.

Eu usaria o twisted ou algo assim só se quisesse muita absurda  
performance, algo tipo mais de 10mb(yte) por segundo... o q na verdade  
parece ser o alvo do harvest man.... é na verdade o Luciano esta certo  
(como de costume).

Ainda acho essa forma tosca de fazer spiders em python mais simples e  
bem educativa e ela sempre usou toda a minha banda de rede sem  
problema nenhum.

--
Leonardo Santagada
santagada at gmail.com




Re: Re: Python como wget

by Humberto Diogenes-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


On 02/02/2009, at 04:19, Henrique Baggio wrote:

> 2009/2/2 Paul Eipper <lkraider@...>
>>
>> Se preferir não implementar na mão, existe port do wget para windows:
>>
>> http://users.ugent.be/~bpuype/wget/
>
> Bem, isso resolve o meu problema, heheh. Valeu, Paul!
>
>> (desculpa estragar o incentivo :P)
>
> Relaxe, ainda pretendo fazer isso em Python, pq não gostei das
> soluções que vi pela net, e acho que seria um bom exercício, =]


Henrique,

   Como eu sempre gostei do wget, resolvi tentar fazer minha própria  
versão também:
   http://humberto.digi.com.br/blog/2009/02/12/python-como-wget/

   O que eu fiz se parece mais com o recurso de "baixar todos os  
links" do Opera do que com o wget -r, mas pode ser facilmente  
melhorado. ;)

--
Humberto Diógenes
http://humberto.digi.com.br


Re: Re: Python como wget

by Henrique Baggio :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Humberto,

É bem parecido com a idéia inicial que eu tive pra resolver o problema
- procurar links no html e usá-los - mas eu iria ter mais trabalho pra
capturar os links, pois não conhecia o BeautifulSoup.

Vou fazer uns teste usando como base o seu código e quem sabe não
chegamos a uma solução mais completa. =D

--
Henrique Baggio